fullstack-cms 0.1.17 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -0
- data/TODO.tasks +14 -0
- data/VERSION +1 -1
- data/app/controllers/admin/linkables_controller.rb +35 -0
- data/app/models/attachment.rb +0 -5
- data/app/models/link.rb +4 -5
- data/app/models/linkable.rb +31 -0
- data/app/models/photo.rb +1 -1
- data/app/models/setting.rb +6 -6
- data/app/models/text.rb +1 -1
- data/app/models/text_page_part.rb +1 -1
- data/app/models/text_with_title_page_part.rb +2 -2
- data/app/views/admin/linkables/_fields.html.erb +26 -0
- data/app/views/admin/linkables/fields.js.coffee +13 -0
- data/app/views/admin/links/_associated_fields.html.erb +78 -0
- data/app/views/admin/photos/edit.html.erb +1 -1
- data/config/locales/it.yml +3 -0
- data/config/routes.rb +3 -0
- data/fullstack-cms.gemspec +8 -3
- data/lib/fullstack/cms.rb +1 -1
- data/lib/generators/fullstack/cms/install_generator.rb +1 -1
- data/lib/generators/fullstack/cms/templates/rails/lib/support/content.rb +2 -2
- metadata +9 -4
- data/TODO.md +0 -4
data/Gemfile
CHANGED
data/TODO.tasks
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# Fullstack CMS roadmap
|
2
|
+
|
3
|
+
- integrate with globalize
|
4
|
+
✓ release ARS with right migration file names
|
5
|
+
✓ fix long index names issue
|
6
|
+
✓ pack into a gem and release
|
7
|
+
- require the packed gem
|
8
|
+
- use :translatable for `page_parts`
|
9
|
+
- available languages with switch into UI
|
10
|
+
|
11
|
+
- Linkables/Related
|
12
|
+
|
13
|
+
- statistics
|
14
|
+
- RSS
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1
|
1
|
+
0.2.1
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class Admin::LinkablesController < Admin::BaseController
|
2
|
+
layout false
|
3
|
+
|
4
|
+
def index
|
5
|
+
term = params[:term]
|
6
|
+
type = params[:type]
|
7
|
+
|
8
|
+
resp = {}
|
9
|
+
if term && term.size > 3 && (linkable = Linkable.get(type))
|
10
|
+
|
11
|
+
column = :"#{title_column(linkable)}"
|
12
|
+
|
13
|
+
linkable.where(
|
14
|
+
|
15
|
+
linkable.arel_table[column].matches("%#{term}%")
|
16
|
+
|
17
|
+
).select([:id, column]).each do |l|
|
18
|
+
resp[l.id] = l.send(column)
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
render :json => resp
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def fields
|
27
|
+
@linkable = Linkable.get(params[:type])
|
28
|
+
@target = params[:target]
|
29
|
+
@field_name = params[:field_name]
|
30
|
+
if params[:current_type].present? && params[:current_id].present?
|
31
|
+
@currently_linked = Linkable.get(params[:current_type]).find(params[:current_id])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
data/app/models/attachment.rb
CHANGED
@@ -4,12 +4,7 @@ class Attachment < ActiveRecord::Base
|
|
4
4
|
|
5
5
|
field :description, :text
|
6
6
|
has_attached :file
|
7
|
-
|
8
|
-
# validates_attachment :file, :presence => true,
|
9
|
-
# :size => { :in => 0..1000.megabytes }
|
10
|
-
|
11
7
|
belongs_to :attachable, :polymorphic => true
|
12
|
-
attr_accessible :name, :description, :file, :attachable, :attachable_id, :attachable_type, :title
|
13
8
|
end
|
14
9
|
|
15
10
|
|
data/app/models/link.rb
CHANGED
@@ -1,19 +1,18 @@
|
|
1
1
|
class Link < ActiveRecord::Base
|
2
2
|
validates_presence_of :label
|
3
3
|
|
4
|
-
field :label, :string
|
5
|
-
field :description, :text
|
4
|
+
field :label, :string, :translatable => true
|
5
|
+
field :description, :text, :translatable => true
|
6
6
|
field :position, :integer
|
7
7
|
|
8
8
|
has_attached :image
|
9
9
|
has_attached :icon
|
10
10
|
|
11
11
|
belongs_to :link_owner, :polymorphic => true
|
12
|
+
belongs_to :linked, :polymorphic => true
|
12
13
|
|
13
14
|
timestamps
|
14
|
-
field :external, :boolean
|
15
15
|
field :nofollow, :boolean
|
16
16
|
field :url, :string
|
17
|
-
|
18
|
-
alias_attribute :right_alignment, :alignment_right
|
17
|
+
|
19
18
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class Linkable
|
2
|
+
|
3
|
+
AJAX_COMBOBOX_MIN = 5
|
4
|
+
|
5
|
+
class << self
|
6
|
+
|
7
|
+
def linkables
|
8
|
+
@linkables ||= Fullstack::Cms.config.linkables.map {|class_name|
|
9
|
+
class_name.is_a?(Class) ? class_name.name.underscore : class_name.to_s.underscore.singularize
|
10
|
+
}
|
11
|
+
end
|
12
|
+
|
13
|
+
def linkable_class_names
|
14
|
+
@linkable_class_names ||= linkables.map {|l|
|
15
|
+
l.is_a?(Class) ? l.name : l.to_s.camelize
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
def get(class_name)
|
20
|
+
@_linkables_flyweight ||= {}
|
21
|
+
underscored_name = class_name.is_a?(Class) ? class_name.name.underscore : class_name.to_s.underscore.singularize
|
22
|
+
if linkables.include?(underscored_name)
|
23
|
+
@_linkables_flyweight[underscored_name] || (@_linkables_flyweight[underscored_name] = class_name.is_a?(Class) ? class_name : "#{class_name}".camelize.constantize)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
|
data/app/models/photo.rb
CHANGED
@@ -14,7 +14,7 @@ class Photo < ActiveRecord::Base
|
|
14
14
|
belongs_to :photographable, :polymorphic => :true
|
15
15
|
delegate :url, :file_name, :to => :image
|
16
16
|
|
17
|
-
field :caption, :text
|
17
|
+
field :caption, :text, :translatable => true
|
18
18
|
|
19
19
|
def owner
|
20
20
|
photographable.owner if photographable && photographable.respond_to?(:owner)
|
data/app/models/setting.rb
CHANGED
@@ -10,12 +10,12 @@ class Setting < ActiveRecord::Base
|
|
10
10
|
field :kind
|
11
11
|
field :group
|
12
12
|
|
13
|
-
field :integer_value, :integer
|
14
|
-
field :float_value, :float
|
15
|
-
field :text_value, :text
|
16
|
-
field :string_value, :string
|
17
|
-
field :datetime_value, :datetime
|
18
|
-
field :date_value, :date
|
13
|
+
field :integer_value, :integer, :translatable => true
|
14
|
+
field :float_value, :float, :translatable => true
|
15
|
+
field :text_value, :text, :translatable => true
|
16
|
+
field :string_value, :string, :translatable => true
|
17
|
+
field :datetime_value, :datetime, :translatable => true
|
18
|
+
field :date_value, :date, :translatable => true
|
19
19
|
has_attached :file_value
|
20
20
|
|
21
21
|
|
data/app/models/text.rb
CHANGED
@@ -0,0 +1,26 @@
|
|
1
|
+
<% if linkable.count >= Linkable::AJAX_COMBOBOX_MIN %>
|
2
|
+
<div class="clearfix" style="margin-bottom: 200px;">
|
3
|
+
|
4
|
+
<select style="width: 440px;" data-remote="<%= admin_linkables_path(:type => linkable.name) %>" class="select-resource-url" name="<%= field_name %>"
|
5
|
+
placeholder="<%= t('fullstack.cms.type_the_title_name_of_the_resource_to_link', :default => 'Type the title/name of the resource to link') %>">
|
6
|
+
<option value=""></option>
|
7
|
+
<% if currently_linked %>
|
8
|
+
<option value="<%= currently_linked.id %>" selected><%= title_for(currently_linked) %></option>
|
9
|
+
<% end %>
|
10
|
+
</select>
|
11
|
+
|
12
|
+
</div>
|
13
|
+
<% else %>
|
14
|
+
<select style="width: 440px;" name="<%= field_name %>"
|
15
|
+
placeholder="<%= t('fullstack.cms.type_the_title_name_of_the_resource_to_link', :default => 'Type the title/name of the resource to link') %>">
|
16
|
+
|
17
|
+
<option value=""></option>
|
18
|
+
<% linkable.order(title_column(linkable)).each do |item| %>
|
19
|
+
<% if currently_linked == item %>
|
20
|
+
<option value="<%= item.id %>" selected><%= title_for(item) %></option>
|
21
|
+
<% else %>
|
22
|
+
<option value="<%= item.id %>"><%= title_for(item) %></option>
|
23
|
+
<% end %>
|
24
|
+
<% end %>
|
25
|
+
</select>
|
26
|
+
<% end %>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
$("#<%= @target %>").empty().append("<%=j render(:partial => 'fields', :locals => {:linkable => @linkable, :field_name => @field_name, :currently_linked => @currently_linked}) %>")
|
2
|
+
|
3
|
+
<% if @linkable.count >= Linkable::AJAX_COMBOBOX_MIN %>
|
4
|
+
$("#<%= @target %>").find("select[data-remote]").each ->
|
5
|
+
$(this).ajaxChosen {method: "GET", url:$(this).data('remote'), dataType: 'json'}, (data) ->
|
6
|
+
data
|
7
|
+
<% else %>
|
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
|
@@ -0,0 +1,78 @@
|
|
1
|
+
<%= f.inputs do %>
|
2
|
+
<%= f.input :label %>
|
3
|
+
<%= f.input :description %>
|
4
|
+
<%= f.input :nofollow %>
|
5
|
+
<% end %>
|
6
|
+
<%= f.inputs do %>
|
7
|
+
<%= f.input :image %>
|
8
|
+
<%= f.input :icon %>
|
9
|
+
<% end %>
|
10
|
+
|
11
|
+
<hr/>
|
12
|
+
|
13
|
+
<%= f.inputs :class => "linked-fields" do %>
|
14
|
+
<%
|
15
|
+
linkables_collection = [[t('fullstack.cms.url', :default => "Url"), ""]] + Linkable.linkable_class_names.map do |klass_name|
|
16
|
+
[t("fullstack.admin.resources.#{klass_name.underscore}", :default => klass_name), klass_name]
|
17
|
+
end
|
18
|
+
%>
|
19
|
+
<%= f.input :linked_type, :as => :radio, :collection => linkables_collection, :input_html => {:class => "linked-type-field"},
|
20
|
+
:label => t('fullstack.cms.link_resource_or_url', :default => "Link resource or url")
|
21
|
+
%>
|
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
|
+
%>" data-current-id="<%= f.object.linked_id %>" data-current-type="<%= f.object.linked_type %>">
|
24
|
+
</div>
|
25
|
+
<%= f.input :url, :label => false, :input_html => {:style => "display: none", :class => "linked-url-field"} %>
|
26
|
+
<% end %>
|
27
|
+
|
28
|
+
|
29
|
+
<% unless @link_associated_fields_js_included %>
|
30
|
+
<% @link_associated_fields_js_included = true %>
|
31
|
+
|
32
|
+
<% content_for :javascripts do -%>
|
33
|
+
|
34
|
+
|
35
|
+
<%= javascript_tag do %>
|
36
|
+
<%= coffee_script do %>
|
37
|
+
|
38
|
+
$(document).ready ->
|
39
|
+
|
40
|
+
update_linked_fields = (linked_fields) ->
|
41
|
+
linked_type_field = linked_fields.find(".linked-type-field")
|
42
|
+
checked_linked_type_field = linked_fields.find(".linked-type-field:checked")
|
43
|
+
linked_id_field_placeholder = linked_fields.find(".linked-id-field-placeholder")
|
44
|
+
linked_url_field = linked_fields.find(".linked-url-field")
|
45
|
+
|
46
|
+
linked_type = checked_linked_type_field.val()
|
47
|
+
|
48
|
+
target_id = linked_id_field_placeholder.attr("id")
|
49
|
+
linked_id_field_name = linked_type_field.attr("name").replace(/linked_type\]$/, "linked_id]")
|
50
|
+
|
51
|
+
|
52
|
+
if linked_type
|
53
|
+
$.get '<%= fields_admin_linkables_path %>',
|
54
|
+
type: linked_type
|
55
|
+
target: target_id
|
56
|
+
field_name: linked_id_field_name
|
57
|
+
current_type: linked_id_field_placeholder.data("current-type")
|
58
|
+
current_id: linked_id_field_placeholder.data("current-id")
|
59
|
+
linked_url_field.hide()
|
60
|
+
|
61
|
+
else
|
62
|
+
linked_id_field_placeholder.empty()
|
63
|
+
linked_url_field.show()
|
64
|
+
|
65
|
+
$(".linked-fields").each ->
|
66
|
+
linked_fields = $(@)
|
67
|
+
update_linked_fields(linked_fields)
|
68
|
+
linked_fields.find(".linked-type-field").live "change", ->
|
69
|
+
update_linked_fields(linked_fields)
|
70
|
+
|
71
|
+
<% end %>
|
72
|
+
<% end %>
|
73
|
+
<% end -%>
|
74
|
+
|
75
|
+
<% end %>
|
76
|
+
|
77
|
+
|
78
|
+
|
@@ -8,7 +8,7 @@
|
|
8
8
|
<% if @photo.respond_to?(:tags) %>
|
9
9
|
<%= f.input :tag_list, :as => :tags, :autocomplete => admin_tags_path, :input_html => {:id => "edit_tags_for_photo"} %>
|
10
10
|
|
11
|
-
<script type="text/javascript"
|
11
|
+
<script type="text/javascript">
|
12
12
|
|
13
13
|
$("#edit_tags_for_photo").each(function() {
|
14
14
|
var autocomplete_url, defaultText, taglist;
|
data/config/locales/it.yml
CHANGED
@@ -2,6 +2,9 @@ it:
|
|
2
2
|
fullstack:
|
3
3
|
cms:
|
4
4
|
advanced_settings: "Impostazioni avanzate"
|
5
|
+
link_resource_or_url: "Collega una risorsa o un indirizzo"
|
6
|
+
type_the_title_name_of_the_resource_to_link: "Digita il titolo/nome della risorsa da collegare"
|
7
|
+
url: "Indirizzo"
|
5
8
|
admin:
|
6
9
|
groups:
|
7
10
|
global: "Generale"
|
data/config/routes.rb
CHANGED
@@ -5,6 +5,9 @@ Rails.application.routes.draw do
|
|
5
5
|
|
6
6
|
resources :tags, :only => :index, :format => :json
|
7
7
|
resources :users, :except => [:show]
|
8
|
+
resources :linkables, :only => :index, :format => :json do
|
9
|
+
get "fields", :format => :js, :on => :collection
|
10
|
+
end
|
8
11
|
|
9
12
|
resources :photos, :except => [:new, :index, :show, :create] do
|
10
13
|
get "search", :on => :collection
|
data/fullstack-cms.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "fullstack-cms"
|
8
|
-
s.version = "0.1
|
8
|
+
s.version = "0.2.1"
|
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-08-
|
12
|
+
s.date = "2012-08-30"
|
13
13
|
s.description = "CMS system built on fullstack"
|
14
14
|
s.email = "maurizio.cas@gmail.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -20,8 +20,9 @@ Gem::Specification.new do |s|
|
|
20
20
|
"Gemfile.lock",
|
21
21
|
"README.md",
|
22
22
|
"Rakefile",
|
23
|
-
"TODO.
|
23
|
+
"TODO.tasks",
|
24
24
|
"VERSION",
|
25
|
+
"app/controllers/admin/linkables_controller.rb",
|
25
26
|
"app/controllers/admin/menus_controller.rb",
|
26
27
|
"app/controllers/admin/pages_controller.rb",
|
27
28
|
"app/controllers/admin/photos_controller.rb",
|
@@ -37,6 +38,7 @@ Gem::Specification.new do |s|
|
|
37
38
|
"app/models/.gitkeep",
|
38
39
|
"app/models/attachment.rb",
|
39
40
|
"app/models/link.rb",
|
41
|
+
"app/models/linkable.rb",
|
40
42
|
"app/models/menu.rb",
|
41
43
|
"app/models/nestable.rb",
|
42
44
|
"app/models/page.rb",
|
@@ -51,6 +53,9 @@ Gem::Specification.new do |s|
|
|
51
53
|
"app/views/admin/base/_fields.html.erb",
|
52
54
|
"app/views/admin/base/_form.html.erb",
|
53
55
|
"app/views/admin/base/_simple_form.html.erb",
|
56
|
+
"app/views/admin/linkables/_fields.html.erb",
|
57
|
+
"app/views/admin/linkables/fields.js.coffee",
|
58
|
+
"app/views/admin/links/_associated_fields.html.erb",
|
54
59
|
"app/views/admin/pages/_collection.html.erb",
|
55
60
|
"app/views/admin/pages/_form.html.erb",
|
56
61
|
"app/views/admin/photos/_photo.html.erb",
|
data/lib/fullstack/cms.rb
CHANGED
@@ -52,7 +52,7 @@ eos
|
|
52
52
|
'''
|
53
53
|
|
54
54
|
route '''
|
55
|
-
constraints(:host =>
|
55
|
+
constraints(:host => /^#{Regexp.escape(Settings.app.domain)}/) do
|
56
56
|
root :to => redirect("http://www.#{Settings.app.domain}")
|
57
57
|
match \'/*path\', :to => redirect {|params| "http://www.#{Settings.app.domain}/#{params[:path]}"}
|
58
58
|
end
|
@@ -8,8 +8,8 @@ module Content
|
|
8
8
|
alias :keywords :tags
|
9
9
|
permalink :title, :history => true
|
10
10
|
|
11
|
-
field :title
|
12
|
-
field :excerpt, :as => :text
|
11
|
+
field :title, :translatable => true
|
12
|
+
field :excerpt, :as => :text, :translatable => true
|
13
13
|
alias_attribute :description, :excerpt
|
14
14
|
end
|
15
15
|
|
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.1
|
4
|
+
version: 0.2.1
|
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-08-
|
12
|
+
date: 2012-08-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fullstack
|
@@ -230,8 +230,9 @@ files:
|
|
230
230
|
- Gemfile.lock
|
231
231
|
- README.md
|
232
232
|
- Rakefile
|
233
|
-
- TODO.
|
233
|
+
- TODO.tasks
|
234
234
|
- VERSION
|
235
|
+
- app/controllers/admin/linkables_controller.rb
|
235
236
|
- app/controllers/admin/menus_controller.rb
|
236
237
|
- app/controllers/admin/pages_controller.rb
|
237
238
|
- app/controllers/admin/photos_controller.rb
|
@@ -247,6 +248,7 @@ files:
|
|
247
248
|
- app/models/.gitkeep
|
248
249
|
- app/models/attachment.rb
|
249
250
|
- app/models/link.rb
|
251
|
+
- app/models/linkable.rb
|
250
252
|
- app/models/menu.rb
|
251
253
|
- app/models/nestable.rb
|
252
254
|
- app/models/page.rb
|
@@ -261,6 +263,9 @@ files:
|
|
261
263
|
- app/views/admin/base/_fields.html.erb
|
262
264
|
- app/views/admin/base/_form.html.erb
|
263
265
|
- app/views/admin/base/_simple_form.html.erb
|
266
|
+
- app/views/admin/linkables/_fields.html.erb
|
267
|
+
- app/views/admin/linkables/fields.js.coffee
|
268
|
+
- app/views/admin/links/_associated_fields.html.erb
|
264
269
|
- app/views/admin/pages/_collection.html.erb
|
265
270
|
- app/views/admin/pages/_form.html.erb
|
266
271
|
- app/views/admin/photos/_photo.html.erb
|
@@ -339,7 +344,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
339
344
|
version: '0'
|
340
345
|
segments:
|
341
346
|
- 0
|
342
|
-
hash:
|
347
|
+
hash: 1880743011061210640
|
343
348
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
344
349
|
none: false
|
345
350
|
requirements:
|
data/TODO.md
DELETED