fix an issue with compass + move to rails 3.2 + switch from mongoid_acts_as_tree to mongoid_tree + implement the UI to deal with has_many field types (wip)
This commit is contained in:
parent
e2bd55fe35
commit
dfd437a762
10
Gemfile
10
Gemfile
@ -9,7 +9,7 @@ gemspec # Include gemspec dependencies
|
|||||||
|
|
||||||
group :development do
|
group :development do
|
||||||
gem 'custom_fields', :path => '../gems/custom_fields' # Locale
|
gem 'custom_fields', :path => '../gems/custom_fields' # Locale
|
||||||
# gem 'custom_fields', :git => 'git://github.com/locomotivecms/custom_fields.git', :branch => '2.0.0.rc' # Branch on Github
|
# # gem 'custom_fields', :git => 'git://github.com/locomotivecms/custom_fields.git', :branch => '2.0.0.rc' # Branch on Github
|
||||||
|
|
||||||
gem 'rspec-rails', '2.6.1' # In order to have rspec tasks and generators
|
gem 'rspec-rails', '2.6.1' # In order to have rspec tasks and generators
|
||||||
gem 'rspec-cells'
|
gem 'rspec-cells'
|
||||||
@ -17,6 +17,14 @@ group :development do
|
|||||||
gem 'unicorn' # Using unicorn_rails instead of webrick (default server)
|
gem 'unicorn' # Using unicorn_rails instead of webrick (default server)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
group :assets do
|
||||||
|
gem 'sass-rails', '~> 3.2.4'
|
||||||
|
gem 'coffee-rails', '~> 3.2.2'
|
||||||
|
gem 'uglifier', '~> 1.2.3'
|
||||||
|
gem 'compass', :git => 'git://github.com/chriseppstein/compass.git', :branch => 'no_rails_integration'
|
||||||
|
gem 'compass-rails', :git => 'git://github.com/Compass/compass-rails.git'
|
||||||
|
end
|
||||||
|
|
||||||
group :test do
|
group :test do
|
||||||
gem 'launchy'
|
gem 'launchy'
|
||||||
|
|
||||||
|
161
Gemfile.lock
161
Gemfile.lock
@ -1,3 +1,21 @@
|
|||||||
|
GIT
|
||||||
|
remote: git://github.com/Compass/compass-rails.git
|
||||||
|
revision: c2d47fb846b6fd48272e56ef21ea91fab8fc8510
|
||||||
|
specs:
|
||||||
|
compass-rails (1.0.0.rc.1)
|
||||||
|
compass (~> 0.12.rc.0)
|
||||||
|
rails
|
||||||
|
|
||||||
|
GIT
|
||||||
|
remote: git://github.com/chriseppstein/compass.git
|
||||||
|
revision: 0f96e881019c364aa6124845cbd83b1fd75c4ffe
|
||||||
|
branch: no_rails_integration
|
||||||
|
specs:
|
||||||
|
compass (0.12.rc.4.0f96e88)
|
||||||
|
chunky_png (~> 1.2)
|
||||||
|
fssm (>= 0.2.7)
|
||||||
|
sass (~> 3.1)
|
||||||
|
|
||||||
PATH
|
PATH
|
||||||
remote: .
|
remote: .
|
||||||
specs:
|
specs:
|
||||||
@ -9,41 +27,37 @@ PATH
|
|||||||
carrierwave-mongoid (~> 0.1.3)
|
carrierwave-mongoid (~> 0.1.3)
|
||||||
cells (~> 3.8.0)
|
cells (~> 3.8.0)
|
||||||
codemirror-rails (~> 2.21)
|
codemirror-rails (~> 2.21)
|
||||||
coffee-script (~> 2.2.0)
|
custom_fields (~> 2.0.0.rc3)
|
||||||
compass (~> 0.12.alpha.4)
|
|
||||||
custom_fields (~> 2.0.0.rc2)
|
|
||||||
devise (~> 1.5.3)
|
devise (~> 1.5.3)
|
||||||
dragonfly (~> 0.9.8)
|
dragonfly (~> 0.9.8)
|
||||||
flash_cookie_session (~> 1.1.1)
|
flash_cookie_session (~> 1.1.1)
|
||||||
fog (~> 1.0.0)
|
fog (~> 1.0.0)
|
||||||
formtastic (~> 2.0.2)
|
formtastic (~> 2.0.2)
|
||||||
haml (~> 3.1.3)
|
haml (~> 3.1.4)
|
||||||
highline (~> 1.6.2)
|
highline (~> 1.6.2)
|
||||||
httparty (~> 0.8.1)
|
httparty (~> 0.8.1)
|
||||||
jquery-rails (~> 1.0.16)
|
jquery-rails (~> 1.0.16)
|
||||||
kaminari (~> 0.13.0)
|
kaminari (~> 0.13.0)
|
||||||
locomotive-aloha-rails (~> 0.20.1)
|
locomotive-aloha-rails (~> 0.20.1.1)
|
||||||
locomotive-tinymce-rails (~> 3.4.7)
|
locomotive-mongoid-tree (~> 0.6.2)
|
||||||
|
locomotive-tinymce-rails (~> 3.4.7.1)
|
||||||
locomotive_liquid (= 2.2.2)
|
locomotive_liquid (= 2.2.2)
|
||||||
locomotive_mongoid_acts_as_tree (~> 0.1.5.8)
|
|
||||||
mimetype-fu (~> 0.1.2)
|
mimetype-fu (~> 0.1.2)
|
||||||
mongo (~> 1.5.2)
|
mongo (~> 1.5.2)
|
||||||
mongoid (~> 2.4.3)
|
mongoid (~> 2.4.3)
|
||||||
rack-cache (~> 1.1)
|
rack-cache (~> 1.1)
|
||||||
rails (~> 3.1.3)
|
rails (~> 3.2.1)
|
||||||
rails-backbone (~> 0.5.4)
|
rails-backbone (~> 0.6.1)
|
||||||
rake (~> 0.9.2)
|
rake (~> 0.9.2)
|
||||||
responders (~> 0.6.4)
|
responders (~> 0.6.4)
|
||||||
rmagick (~> 2.12.2)
|
rmagick (~> 2.12.2)
|
||||||
sanitize (~> 2.0.3)
|
sanitize (~> 2.0.3)
|
||||||
sass-rails (~> 3.1.5)
|
|
||||||
uglifier (~> 1.2.2)
|
|
||||||
|
|
||||||
PATH
|
PATH
|
||||||
remote: ../gems/custom_fields
|
remote: ../gems/custom_fields
|
||||||
specs:
|
specs:
|
||||||
custom_fields (2.0.0.rc2)
|
custom_fields (2.0.0.rc3)
|
||||||
activesupport (~> 3.1.3)
|
activesupport (~> 3.2.1)
|
||||||
carrierwave-mongoid (~> 0.1.3)
|
carrierwave-mongoid (~> 0.1.3)
|
||||||
mongoid (~> 2.4.3)
|
mongoid (~> 2.4.3)
|
||||||
|
|
||||||
@ -52,38 +66,37 @@ GEM
|
|||||||
specs:
|
specs:
|
||||||
RedCloth (4.2.9)
|
RedCloth (4.2.9)
|
||||||
ZenTest (4.6.2)
|
ZenTest (4.6.2)
|
||||||
actionmailer (3.1.3)
|
actionmailer (3.2.1)
|
||||||
actionpack (= 3.1.3)
|
actionpack (= 3.2.1)
|
||||||
mail (~> 2.3.0)
|
mail (~> 2.4.0)
|
||||||
actionmailer-with-request (0.3.0)
|
actionmailer-with-request (0.3.0)
|
||||||
rails (>= 3)
|
rails (>= 3)
|
||||||
actionpack (3.1.3)
|
actionpack (3.2.1)
|
||||||
activemodel (= 3.1.3)
|
activemodel (= 3.2.1)
|
||||||
activesupport (= 3.1.3)
|
activesupport (= 3.2.1)
|
||||||
builder (~> 3.0.0)
|
builder (~> 3.0.0)
|
||||||
erubis (~> 2.7.0)
|
erubis (~> 2.7.0)
|
||||||
i18n (~> 0.6)
|
journey (~> 1.0.1)
|
||||||
rack (~> 1.3.5)
|
rack (~> 1.4.0)
|
||||||
rack-cache (~> 1.1)
|
rack-cache (~> 1.1)
|
||||||
rack-mount (~> 0.8.2)
|
|
||||||
rack-test (~> 0.6.1)
|
rack-test (~> 0.6.1)
|
||||||
sprockets (~> 2.0.3)
|
sprockets (~> 2.1.2)
|
||||||
activemodel (3.1.3)
|
activemodel (3.2.1)
|
||||||
activesupport (= 3.1.3)
|
activesupport (= 3.2.1)
|
||||||
builder (~> 3.0.0)
|
builder (~> 3.0.0)
|
||||||
i18n (~> 0.6)
|
activerecord (3.2.1)
|
||||||
activerecord (3.1.3)
|
activemodel (= 3.2.1)
|
||||||
activemodel (= 3.1.3)
|
activesupport (= 3.2.1)
|
||||||
activesupport (= 3.1.3)
|
arel (~> 3.0.0)
|
||||||
arel (~> 2.2.1)
|
|
||||||
tzinfo (~> 0.3.29)
|
tzinfo (~> 0.3.29)
|
||||||
activeresource (3.1.3)
|
activeresource (3.2.1)
|
||||||
activemodel (= 3.1.3)
|
activemodel (= 3.2.1)
|
||||||
activesupport (= 3.1.3)
|
activesupport (= 3.2.1)
|
||||||
activesupport (3.1.3)
|
activesupport (3.2.1)
|
||||||
|
i18n (~> 0.6)
|
||||||
multi_json (~> 1.0)
|
multi_json (~> 1.0)
|
||||||
addressable (2.2.6)
|
addressable (2.2.6)
|
||||||
arel (2.2.1)
|
arel (3.0.0)
|
||||||
autotest (4.4.6)
|
autotest (4.4.6)
|
||||||
ZenTest (>= 4.4.1)
|
ZenTest (>= 4.4.1)
|
||||||
bcrypt-ruby (3.0.1)
|
bcrypt-ruby (3.0.1)
|
||||||
@ -112,14 +125,13 @@ GEM
|
|||||||
chunky_png (1.2.5)
|
chunky_png (1.2.5)
|
||||||
codemirror-rails (2.21)
|
codemirror-rails (2.21)
|
||||||
railties (~> 3.0)
|
railties (~> 3.0)
|
||||||
|
coffee-rails (3.2.2)
|
||||||
|
coffee-script (>= 2.2.0)
|
||||||
|
railties (~> 3.2.0)
|
||||||
coffee-script (2.2.0)
|
coffee-script (2.2.0)
|
||||||
coffee-script-source
|
coffee-script-source
|
||||||
execjs
|
execjs
|
||||||
coffee-script-source (1.2.0)
|
coffee-script-source (1.2.0)
|
||||||
compass (0.12.alpha.4)
|
|
||||||
chunky_png (~> 1.2)
|
|
||||||
fssm (>= 0.2.7)
|
|
||||||
sass (~> 3.1)
|
|
||||||
cucumber (1.1.4)
|
cucumber (1.1.4)
|
||||||
builder (>= 2.1.2)
|
builder (>= 2.1.2)
|
||||||
diff-lcs (>= 1.1.2)
|
diff-lcs (>= 1.1.2)
|
||||||
@ -175,6 +187,7 @@ GEM
|
|||||||
multi_json
|
multi_json
|
||||||
multi_xml
|
multi_xml
|
||||||
i18n (0.6.0)
|
i18n (0.6.0)
|
||||||
|
journey (1.0.1)
|
||||||
jquery-rails (1.0.19)
|
jquery-rails (1.0.19)
|
||||||
railties (~> 3.0)
|
railties (~> 3.0)
|
||||||
thor (~> 0.14)
|
thor (~> 0.14)
|
||||||
@ -186,13 +199,14 @@ GEM
|
|||||||
kgio (2.7.2)
|
kgio (2.7.2)
|
||||||
launchy (2.0.5)
|
launchy (2.0.5)
|
||||||
addressable (~> 2.2.6)
|
addressable (~> 2.2.6)
|
||||||
locomotive-aloha-rails (0.20.1)
|
locomotive-aloha-rails (0.20.1.1)
|
||||||
actionpack (~> 3.1.3)
|
actionpack (~> 3.2.1)
|
||||||
locomotive-tinymce-rails (3.4.7)
|
locomotive-mongoid-tree (0.6.2)
|
||||||
actionpack (~> 3.1.3)
|
mongoid (~> 2.0)
|
||||||
|
locomotive-tinymce-rails (3.4.7.1)
|
||||||
|
actionpack (~> 3.2.1)
|
||||||
locomotive_liquid (2.2.2)
|
locomotive_liquid (2.2.2)
|
||||||
locomotive_mongoid_acts_as_tree (0.1.5.8)
|
mail (2.4.1)
|
||||||
mail (2.3.0)
|
|
||||||
i18n (>= 0.4.0)
|
i18n (>= 0.4.0)
|
||||||
mime-types (~> 1.16)
|
mime-types (~> 1.16)
|
||||||
treetop (~> 1.4.8)
|
treetop (~> 1.4.8)
|
||||||
@ -216,36 +230,34 @@ GEM
|
|||||||
cucumber (>= 0.8)
|
cucumber (>= 0.8)
|
||||||
rake
|
rake
|
||||||
polyglot (0.3.3)
|
polyglot (0.3.3)
|
||||||
rack (1.3.6)
|
rack (1.4.1)
|
||||||
rack-cache (1.1)
|
rack-cache (1.1)
|
||||||
rack (>= 0.4)
|
rack (>= 0.4)
|
||||||
rack-mount (0.8.3)
|
|
||||||
rack (>= 1.0.0)
|
|
||||||
rack-ssl (1.3.2)
|
rack-ssl (1.3.2)
|
||||||
rack
|
rack
|
||||||
rack-test (0.6.1)
|
rack-test (0.6.1)
|
||||||
rack (>= 1.0)
|
rack (>= 1.0)
|
||||||
rails (3.1.3)
|
rails (3.2.1)
|
||||||
actionmailer (= 3.1.3)
|
actionmailer (= 3.2.1)
|
||||||
actionpack (= 3.1.3)
|
actionpack (= 3.2.1)
|
||||||
activerecord (= 3.1.3)
|
activerecord (= 3.2.1)
|
||||||
activeresource (= 3.1.3)
|
activeresource (= 3.2.1)
|
||||||
activesupport (= 3.1.3)
|
activesupport (= 3.2.1)
|
||||||
bundler (~> 1.0)
|
bundler (~> 1.0)
|
||||||
railties (= 3.1.3)
|
railties (= 3.2.1)
|
||||||
rails-backbone (0.5.5)
|
rails-backbone (0.6.1)
|
||||||
coffee-script (~> 2.2.0)
|
coffee-script (~> 2.2.0)
|
||||||
ejs (~> 1.0.0)
|
ejs (~> 1.0.0)
|
||||||
rails (~> 3.1.0)
|
railties (>= 3.1.0)
|
||||||
railties (3.1.3)
|
railties (3.2.1)
|
||||||
actionpack (= 3.1.3)
|
actionpack (= 3.2.1)
|
||||||
activesupport (= 3.1.3)
|
activesupport (= 3.2.1)
|
||||||
rack-ssl (~> 1.3.2)
|
rack-ssl (~> 1.3.2)
|
||||||
rake (>= 0.8.7)
|
rake (>= 0.8.7)
|
||||||
rdoc (~> 3.4)
|
rdoc (~> 3.4)
|
||||||
thor (~> 0.14.6)
|
thor (~> 0.14.6)
|
||||||
raindrops (0.8.0)
|
raindrops (0.8.0)
|
||||||
rake (0.9.2)
|
rake (0.9.2.2)
|
||||||
rdoc (3.12)
|
rdoc (3.12)
|
||||||
json (~> 1.4)
|
json (~> 1.4)
|
||||||
responders (0.6.5)
|
responders (0.6.5)
|
||||||
@ -254,7 +266,8 @@ GEM
|
|||||||
rspec-core (~> 2.6.0)
|
rspec-core (~> 2.6.0)
|
||||||
rspec-expectations (~> 2.6.0)
|
rspec-expectations (~> 2.6.0)
|
||||||
rspec-mocks (~> 2.6.0)
|
rspec-mocks (~> 2.6.0)
|
||||||
rspec-cells (0.1.1)
|
rspec-cells (0.1.2)
|
||||||
|
cells (~> 3.4)
|
||||||
rails (~> 3.0)
|
rails (~> 3.0)
|
||||||
rspec-rails (~> 2.2)
|
rspec-rails (~> 2.2)
|
||||||
rspec-core (2.6.4)
|
rspec-core (2.6.4)
|
||||||
@ -271,18 +284,17 @@ GEM
|
|||||||
sanitize (2.0.3)
|
sanitize (2.0.3)
|
||||||
nokogiri (>= 1.4.4, < 1.6)
|
nokogiri (>= 1.4.4, < 1.6)
|
||||||
sass (3.1.12)
|
sass (3.1.12)
|
||||||
sass-rails (3.1.5)
|
sass-rails (3.2.4)
|
||||||
actionpack (~> 3.1.0)
|
railties (~> 3.2.0)
|
||||||
railties (~> 3.1.0)
|
sass (>= 3.1.10)
|
||||||
sass (~> 3.1.10)
|
tilt (~> 1.3)
|
||||||
tilt (~> 1.3.2)
|
selenium-webdriver (2.18.0)
|
||||||
selenium-webdriver (2.17.0)
|
|
||||||
childprocess (>= 0.2.5)
|
childprocess (>= 0.2.5)
|
||||||
ffi (~> 1.0.9)
|
ffi (~> 1.0.9)
|
||||||
multi_json (~> 1.0.4)
|
multi_json (~> 1.0.4)
|
||||||
rubyzip
|
rubyzip
|
||||||
shoulda-matchers (1.0.0)
|
shoulda-matchers (1.0.0)
|
||||||
sprockets (2.0.3)
|
sprockets (2.1.2)
|
||||||
hike (~> 1.2)
|
hike (~> 1.2)
|
||||||
rack (~> 1.0)
|
rack (~> 1.0)
|
||||||
tilt (~> 1.1, != 1.3.0)
|
tilt (~> 1.1, != 1.3.0)
|
||||||
@ -296,10 +308,10 @@ GEM
|
|||||||
uglifier (1.2.3)
|
uglifier (1.2.3)
|
||||||
execjs (>= 0.3.0)
|
execjs (>= 0.3.0)
|
||||||
multi_json (>= 1.0.2)
|
multi_json (>= 1.0.2)
|
||||||
unicorn (4.1.1)
|
unicorn (4.2.0)
|
||||||
kgio (~> 2.4)
|
kgio (~> 2.6)
|
||||||
rack
|
rack
|
||||||
raindrops (~> 0.6)
|
raindrops (~> 0.7)
|
||||||
warden (1.1.0)
|
warden (1.1.0)
|
||||||
rack (>= 1.0)
|
rack (>= 1.0)
|
||||||
xpath (0.1.4)
|
xpath (0.1.4)
|
||||||
@ -312,6 +324,9 @@ DEPENDENCIES
|
|||||||
ZenTest
|
ZenTest
|
||||||
autotest
|
autotest
|
||||||
capybara
|
capybara
|
||||||
|
coffee-rails (~> 3.2.2)
|
||||||
|
compass!
|
||||||
|
compass-rails!
|
||||||
cucumber-rails
|
cucumber-rails
|
||||||
custom_fields!
|
custom_fields!
|
||||||
database_cleaner
|
database_cleaner
|
||||||
@ -323,6 +338,8 @@ DEPENDENCIES
|
|||||||
pickle
|
pickle
|
||||||
rspec-cells
|
rspec-cells
|
||||||
rspec-rails (= 2.6.1)
|
rspec-rails (= 2.6.1)
|
||||||
|
sass-rails (~> 3.2.4)
|
||||||
shoulda-matchers
|
shoulda-matchers
|
||||||
|
uglifier (~> 1.2.3)
|
||||||
unicorn
|
unicorn
|
||||||
xpath (~> 0.1.4)
|
xpath (~> 0.1.4)
|
||||||
|
@ -7,6 +7,11 @@ class Locomotive.Models.ContentEntry extends Backbone.Model
|
|||||||
initialize: ->
|
initialize: ->
|
||||||
@urlRoot = @urlRoot.replace(':slug', @get('content_type_slug'))
|
@urlRoot = @urlRoot.replace(':slug', @get('content_type_slug'))
|
||||||
|
|
||||||
|
_.each @get('_has_many_fields'), (field) =>
|
||||||
|
name = field[0]
|
||||||
|
collection = new Locomotive.Models.ContentEntriesCollection(@get(name))
|
||||||
|
@set_attribute name, collection
|
||||||
|
|
||||||
set_attribute: (attribute, value) ->
|
set_attribute: (attribute, value) ->
|
||||||
data = {}
|
data = {}
|
||||||
data[attribute] = value
|
data[attribute] = value
|
||||||
@ -25,6 +30,8 @@ class Locomotive.Models.ContentEntry extends Backbone.Model
|
|||||||
unless _.include(@get('safe_attributes'), key)
|
unless _.include(@get('safe_attributes'), key)
|
||||||
delete hash[key]
|
delete hash[key]
|
||||||
|
|
||||||
|
# TODO: insert has_many
|
||||||
|
|
||||||
class Locomotive.Models.ContentEntriesCollection extends Backbone.Collection
|
class Locomotive.Models.ContentEntriesCollection extends Backbone.Collection
|
||||||
|
|
||||||
model: Locomotive.Models.ContentEntry
|
model: Locomotive.Models.ContentEntry
|
||||||
|
@ -10,10 +10,24 @@ class Locomotive.Models.CustomField extends Backbone.Model
|
|||||||
@set
|
@set
|
||||||
select_options: new Locomotive.Models.CustomFieldSelectOptionsCollection(@get('select_options'))
|
select_options: new Locomotive.Models.CustomFieldSelectOptionsCollection(@get('select_options'))
|
||||||
|
|
||||||
|
_undesired_fields:
|
||||||
|
['select_options', 'type_text', 'text_formatting_text', 'inverse_of_text', 'class_name_text', 'undefined_text', 'undefined', 'created_at', 'updated_at']
|
||||||
|
|
||||||
|
_relationship_fields:
|
||||||
|
['class_name', 'inverse_of', 'ui_enabled']
|
||||||
|
|
||||||
|
is_relationship_type: ->
|
||||||
|
_.include(['belongs_to', 'has_many'], @get('type'))
|
||||||
|
|
||||||
toJSONForSave: ->
|
toJSONForSave: ->
|
||||||
_.tap {}, (hash) =>
|
_.tap {}, (hash) =>
|
||||||
for key, value of @.toJSON()
|
for key, value of @.toJSON()
|
||||||
hash[key] = value unless _.include(['select_options', 'type_text', 'text_formatting_text', 'undefined_text', 'undefined', 'created_at', 'updated_at'], key)
|
unless _.include(@_undesired_fields, key)
|
||||||
|
if _.include(@_relationship_fields, key)
|
||||||
|
hash[key] = value if @is_relationship_type()
|
||||||
|
else
|
||||||
|
hash[key] = value
|
||||||
|
|
||||||
hash.select_options_attributes = @get('select_options').toJSONForSave() if @get('select_options')? && @get('select_options').length > 0
|
hash.select_options_attributes = @get('select_options').toJSONForSave() if @get('select_options')? && @get('select_options').length > 0
|
||||||
|
|
||||||
class Locomotive.Models.CustomFieldsCollection extends Backbone.Collection
|
class Locomotive.Models.CustomFieldsCollection extends Backbone.Collection
|
||||||
|
@ -8,6 +8,8 @@ class Locomotive.Views.ContentEntries.FormView extends Locomotive.Views.Shared.F
|
|||||||
|
|
||||||
_file_field_views: []
|
_file_field_views: []
|
||||||
|
|
||||||
|
_has_many_field_views: []
|
||||||
|
|
||||||
events:
|
events:
|
||||||
'submit': 'save'
|
'submit': 'save'
|
||||||
|
|
||||||
@ -29,6 +31,8 @@ class Locomotive.Views.ContentEntries.FormView extends Locomotive.Views.Shared.F
|
|||||||
|
|
||||||
@enable_file_fields()
|
@enable_file_fields()
|
||||||
|
|
||||||
|
@enable_has_many_fields()
|
||||||
|
|
||||||
@slugify_label_field()
|
@slugify_label_field()
|
||||||
|
|
||||||
return @
|
return @
|
||||||
@ -55,6 +59,15 @@ class Locomotive.Views.ContentEntries.FormView extends Locomotive.Views.Shared.F
|
|||||||
|
|
||||||
@$("##{@model.paramRoot}_#{name}_input").append(view.render().el)
|
@$("##{@model.paramRoot}_#{name}_input").append(view.render().el)
|
||||||
|
|
||||||
|
enable_has_many_fields: ->
|
||||||
|
_.each @model.get('_has_many_fields'), (field) =>
|
||||||
|
name = field[0]; inverse_of = field[1]
|
||||||
|
view = new Locomotive.Views.Shared.Fields.HasManyView model: @model, name: name, inverse_of: inverse_of
|
||||||
|
|
||||||
|
@_has_many_field_views.push(view)
|
||||||
|
|
||||||
|
@$("##{@model.paramRoot}_#{name}_input").append(view.render().el)
|
||||||
|
|
||||||
slugify_label_field: ->
|
slugify_label_field: ->
|
||||||
@$('li.input.highlighted > input[type=text]').slugify(target: @$('#content_entry__slug'))
|
@$('li.input.highlighted > input[type=text]').slugify(target: @$('#content_entry__slug'))
|
||||||
|
|
||||||
@ -63,5 +76,6 @@ class Locomotive.Views.ContentEntries.FormView extends Locomotive.Views.Shared.F
|
|||||||
|
|
||||||
remove: ->
|
remove: ->
|
||||||
_.each @_file_field_views, (view) => view.remove()
|
_.each @_file_field_views, (view) => view.remove()
|
||||||
|
_.each @_has_many_field_views, (view) => view.remove()
|
||||||
super
|
super
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ class Locomotive.Views.ContentTypes.FormView extends Locomotive.Views.Shared.For
|
|||||||
return @
|
return @
|
||||||
|
|
||||||
render_custom_fields: ->
|
render_custom_fields: ->
|
||||||
@custom_fields_view = new Locomotive.Views.ContentTypes.CustomFieldsView model: @model
|
@custom_fields_view = new Locomotive.Views.ContentTypes.CustomFieldsView model: @model, inverse_of_list: @options.inverse_of_list
|
||||||
|
|
||||||
@$('#custom_fields_input').append(@custom_fields_view.render().el)
|
@$('#custom_fields_input').append(@custom_fields_view.render().el)
|
||||||
|
|
||||||
|
@ -11,12 +11,19 @@ class Locomotive.Views.ContentTypes.CustomFieldEntryView extends Backbone.View
|
|||||||
'click a.remove': 'remove'
|
'click a.remove': 'remove'
|
||||||
|
|
||||||
initialize: ->
|
initialize: ->
|
||||||
|
@inverse_of_list = @options.parent_view.options.inverse_of_list
|
||||||
|
|
||||||
|
console.log(@model.get('inverse_of'))
|
||||||
|
|
||||||
@model.bind 'change', (custom_field) =>
|
@model.bind 'change', (custom_field) =>
|
||||||
@switch_to_type() if @model.hasChanged('type')
|
@switch_to_type() if @model.hasChanged('type')
|
||||||
|
@fetch_inverse_of_list() if @model.hasChanged('class_name') && @model.get('class_name')?
|
||||||
|
|
||||||
render: ->
|
render: ->
|
||||||
$(@el).html(ich.custom_field_entry(@model.toJSON()))
|
$(@el).html(ich.custom_field_entry(@model.toJSON()))
|
||||||
|
|
||||||
|
@fetch_inverse_of_list() unless @model.isNew()
|
||||||
|
|
||||||
Backbone.ModelBinding.bind @, all: 'class'
|
Backbone.ModelBinding.bind @, all: 'class'
|
||||||
|
|
||||||
@make_fields_editable()
|
@make_fields_editable()
|
||||||
@ -44,6 +51,19 @@ class Locomotive.Views.ContentTypes.CustomFieldEntryView extends Backbone.View
|
|||||||
when 'belongs_to'
|
when 'belongs_to'
|
||||||
@$('li.input.localized').hide()
|
@$('li.input.localized').hide()
|
||||||
@$('li.input.class-name').show()
|
@$('li.input.class-name').show()
|
||||||
|
when 'has_many'
|
||||||
|
@$('li.input.localized').hide()
|
||||||
|
@$('li.input.class-name').show()
|
||||||
|
@$('li.input.inverse-of').show()
|
||||||
|
@$('li.input.ui-enabled').show()
|
||||||
|
|
||||||
|
fetch_inverse_of_list: ->
|
||||||
|
@$('li.input.inverse-of select option').remove()
|
||||||
|
|
||||||
|
_.each @inverse_of_list, (data) =>
|
||||||
|
if data.class_name == @model.get('class_name')
|
||||||
|
option = new Option(data.label, data.name, data.class_name == @model.get('inverse_of') || @inverse_of_list.length == 1)
|
||||||
|
@$('li.input.inverse-of select').append(option)
|
||||||
|
|
||||||
render_select_options_view: ->
|
render_select_options_view: ->
|
||||||
@select_options_view = new Locomotive.Views.ContentTypes.SelectOptionsView
|
@select_options_view = new Locomotive.Views.ContentTypes.SelectOptionsView
|
||||||
|
@ -3,4 +3,13 @@ Locomotive.Views.ContentTypes ||= {}
|
|||||||
class Locomotive.Views.ContentTypes.EditView extends Locomotive.Views.ContentTypes.FormView
|
class Locomotive.Views.ContentTypes.EditView extends Locomotive.Views.ContentTypes.FormView
|
||||||
|
|
||||||
save: (event) ->
|
save: (event) ->
|
||||||
@save_in_ajax event
|
@save_in_ajax event, on_success: (response, xhr) =>
|
||||||
|
|
||||||
|
_.each response.entries_custom_fields, (data) =>
|
||||||
|
|
||||||
|
custom_field = @model.get('entries_custom_fields').detect (entry) => entry.get('name') == data.name
|
||||||
|
|
||||||
|
if custom_field.isNew() # assign an id for each new custom field
|
||||||
|
custom_field.set id: data._id, _id: data._id
|
||||||
|
console.log(custom_field)
|
||||||
|
|
||||||
|
@ -0,0 +1,72 @@
|
|||||||
|
Locomotive.Views.Shared ||= {}
|
||||||
|
Locomotive.Views.Shared.Fields ||= {}
|
||||||
|
|
||||||
|
class Locomotive.Views.Shared.Fields.HasManyView extends Backbone.View
|
||||||
|
|
||||||
|
tagName: 'div'
|
||||||
|
|
||||||
|
className: 'list'
|
||||||
|
|
||||||
|
events:
|
||||||
|
'click ul span.actions a.remove': 'remove_entry'
|
||||||
|
|
||||||
|
template: ->
|
||||||
|
ich["#{@options.name}_list"]
|
||||||
|
|
||||||
|
entry_template: ->
|
||||||
|
ich["#{@options.name}_entry"]
|
||||||
|
|
||||||
|
initialize: ->
|
||||||
|
_.bindAll(@, 'refresh_position_entries')
|
||||||
|
|
||||||
|
@collection = @model.get(@options.name)
|
||||||
|
|
||||||
|
window.model = @model
|
||||||
|
window.bar = @collection
|
||||||
|
|
||||||
|
render: ->
|
||||||
|
$(@el).html(@template()())
|
||||||
|
|
||||||
|
@insert_entries()
|
||||||
|
|
||||||
|
@make_entries_sortable()
|
||||||
|
|
||||||
|
return @
|
||||||
|
|
||||||
|
insert_entries: ->
|
||||||
|
if @collection.length > 0
|
||||||
|
@collection.each (entry) => @insert_entry(entry)
|
||||||
|
else
|
||||||
|
@$('.empty').show()
|
||||||
|
|
||||||
|
insert_entry: (entry) ->
|
||||||
|
@$('.empty').hide()
|
||||||
|
entry_html = $(@entry_template()(label: entry.get('_label')))
|
||||||
|
entry_html.data('data-entry-cid', entry.cid)
|
||||||
|
@$('> ul').append(entry_html)
|
||||||
|
|
||||||
|
make_entries_sortable: ->
|
||||||
|
@sortable_list = @$('> ul').sortable
|
||||||
|
handle: '.handle'
|
||||||
|
items: 'li'
|
||||||
|
axis: 'y'
|
||||||
|
update: @refresh_position_entries
|
||||||
|
|
||||||
|
refresh_position_entries: ->
|
||||||
|
@$('> ul > li').each (index, entry_html) =>
|
||||||
|
cid = $(entry_html).data('data-entry-cid')
|
||||||
|
entry = @collection.getByCid(cid)
|
||||||
|
entry.set_attribute "position_in_#{@options.inverse_of}", index
|
||||||
|
|
||||||
|
remove_entry: (event) ->
|
||||||
|
event.stopPropagation() & event.preventDefault()
|
||||||
|
|
||||||
|
if confirm($(event.target).attr('data-confirm'))
|
||||||
|
entry_html = $(event.target).closest('li')
|
||||||
|
cid = $(entry_html).data('data-entry-cid')
|
||||||
|
entry = @collection.getByCid(cid)
|
||||||
|
entry.set _destroy: true
|
||||||
|
|
||||||
|
entry_html.remove()
|
||||||
|
@refresh_position_entries()
|
||||||
|
|
@ -111,6 +111,11 @@ form.formtastic {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.col {
|
||||||
|
float: left;
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
span.actions {
|
span.actions {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0px;
|
top: 0px;
|
||||||
@ -541,6 +546,31 @@ form.formtastic {
|
|||||||
}
|
}
|
||||||
} // li.select-options
|
} // li.select-options
|
||||||
|
|
||||||
|
&.relationship {
|
||||||
|
|
||||||
|
.list > ul {
|
||||||
|
|
||||||
|
.col {
|
||||||
|
|
||||||
|
&.handle {
|
||||||
|
position: relative;
|
||||||
|
top: 4px;
|
||||||
|
margin-left: 5px;
|
||||||
|
margin-right: 2px;
|
||||||
|
cursor: move;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.label {
|
||||||
|
margin-left: 8px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // ul .col
|
||||||
|
|
||||||
|
} // .list > ul
|
||||||
|
|
||||||
|
} // li.relationship
|
||||||
|
|
||||||
&#site_memberships_input {
|
&#site_memberships_input {
|
||||||
.entry {
|
.entry {
|
||||||
em.email {
|
em.email {
|
||||||
|
@ -7,7 +7,7 @@ module Locomotive
|
|||||||
|
|
||||||
before_filter :set_content_type
|
before_filter :set_content_type
|
||||||
|
|
||||||
respond_to :json, :only => [:edit, :create, :update, :sort]
|
respond_to :json, :only => [:show, :edit, :create, :update, :sort]
|
||||||
|
|
||||||
skip_load_and_authorize_resource
|
skip_load_and_authorize_resource
|
||||||
|
|
||||||
@ -18,6 +18,11 @@ module Locomotive
|
|||||||
respond_with @content_entries
|
respond_with @content_entries
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def show
|
||||||
|
@content_entry = @content_type.entries.find(params[:id])
|
||||||
|
respond_with @content_entry
|
||||||
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
@content_entry = @content_type.entries.build
|
@content_entry = @content_type.entries.build
|
||||||
respond_with @content_entry
|
respond_with @content_entry
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
module Locomotive::CustomFieldsHelper
|
module Locomotive::CustomFieldsHelper
|
||||||
|
|
||||||
def options_for_custom_field_type
|
def options_for_custom_field_type
|
||||||
%w(string text select boolean date file belongs_to).map do |type|
|
%w(string text select boolean date file belongs_to has_many).map do |type|
|
||||||
[t("custom_fields.types.#{type}"), type]
|
[t("custom_fields.types.#{type}"), type]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -41,13 +41,27 @@ module Locomotive::CustomFieldsHelper
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def options_for_content_types
|
def options_for_content_type
|
||||||
current_site.content_types.map do |c|
|
current_site.content_types.map do |c|
|
||||||
c != @content_type ? [c.name, c.klass_with_custom_fields(:entries).to_s] : nil
|
c != @content_type ? [c.name, c.klass_with_custom_fields(:entries).to_s] : nil
|
||||||
end.compact
|
end.compact
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def options_for_content_type_inverse_of
|
||||||
|
[].tap do |list|
|
||||||
|
current_site.content_types.where(:'entries_custom_fields.type' => 'belongs_to').each do |content_type|
|
||||||
|
content_type.entries_custom_fields.each do |field|
|
||||||
|
if field.type == 'belongs_to'
|
||||||
|
list << {
|
||||||
|
:label => field.label,
|
||||||
|
:name => field.name,
|
||||||
|
:class_name => content_type.klass_with_custom_fields(:entries).to_s
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# def options_for_association_target
|
# def options_for_association_target
|
||||||
# current_site.reload.content_types.collect { |c| [c.name, c.content_klass.to_s] }
|
# current_site.reload.content_types.collect { |c| [c.name, c.content_klass.to_s] }
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
module Locomotive
|
module Locomotive
|
||||||
class EmptyInput # < Formtastic::Inputs::HiddenInput
|
class EmptyInput
|
||||||
include Formtastic::Inputs::Base
|
include Formtastic::Inputs::Base
|
||||||
|
|
||||||
def to_html
|
def to_html
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
module Locomotive
|
module Locomotive
|
||||||
class FileInput # < Formtastic::Inputs::TextInput
|
class FileInput
|
||||||
|
|
||||||
include Formtastic::Inputs::Base
|
include Formtastic::Inputs::Base
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ module Locomotive
|
|||||||
|
|
||||||
## fields ##
|
## fields ##
|
||||||
field :_slug
|
field :_slug
|
||||||
|
field :_label_field_name
|
||||||
field :_position, :type => Integer, :default => 0
|
field :_position, :type => Integer, :default => 0
|
||||||
field :_visible, :type => Boolean, :default => true
|
field :_visible, :type => Boolean, :default => true
|
||||||
|
|
||||||
@ -22,6 +23,7 @@ module Locomotive
|
|||||||
## callbacks ##
|
## callbacks ##
|
||||||
before_validation :set_slug
|
before_validation :set_slug
|
||||||
before_save :set_visibility
|
before_save :set_visibility
|
||||||
|
before_save :set_label_field_name
|
||||||
before_create :add_to_list_bottom
|
before_create :add_to_list_bottom
|
||||||
after_create :send_notifications
|
after_create :send_notifications
|
||||||
|
|
||||||
@ -36,8 +38,12 @@ module Locomotive
|
|||||||
alias :_permalink= :_slug=
|
alias :_permalink= :_slug=
|
||||||
|
|
||||||
def _label(type = nil)
|
def _label(type = nil)
|
||||||
|
if self._label_field_name
|
||||||
|
self.send(self._label_field_name.to_sym)
|
||||||
|
else
|
||||||
self.send((type || self.content_type).label_field_name.to_sym)
|
self.send((type || self.content_type).label_field_name.to_sym)
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def visible?
|
def visible?
|
||||||
self._visible || self._visible.nil?
|
self._visible || self._visible.nil?
|
||||||
@ -114,6 +120,10 @@ module Locomotive
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def set_label_field_name
|
||||||
|
self._label_field_name = self.content_type.label_field_name
|
||||||
|
end
|
||||||
|
|
||||||
def add_to_list_bottom
|
def add_to_list_bottom
|
||||||
self._position = self.class.max(:_position).to_i + 1
|
self._position = self.class.max(:_position).to_i + 1
|
||||||
end
|
end
|
||||||
|
@ -33,6 +33,7 @@ module Locomotive
|
|||||||
before_validation :normalize_slug
|
before_validation :normalize_slug
|
||||||
after_validation :bubble_fields_errors_up
|
after_validation :bubble_fields_errors_up
|
||||||
before_save :set_default_values
|
before_save :set_default_values
|
||||||
|
before_update :update_label_field_name_in_entries
|
||||||
|
|
||||||
## validations ##
|
## validations ##
|
||||||
validates_presence_of :site, :name, :slug
|
validates_presence_of :site, :name, :slug
|
||||||
@ -114,6 +115,29 @@ module Locomotive
|
|||||||
self.errors.set(:entries_custom_fields, hash)
|
self.errors.set(:entries_custom_fields, hash)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def update_label_field_name_in_entries
|
||||||
|
self.klass_with_custom_fields(:entries).update_all :_label_field_name => self.label_field_name
|
||||||
|
end
|
||||||
|
|
||||||
|
# Makes sure the class_name filled in a belongs_to or has_many field
|
||||||
|
# does not belong to another site. Adds an error if it presents a
|
||||||
|
# security problem.
|
||||||
|
#
|
||||||
|
# @param [ CustomFields::Field ] field The field to check
|
||||||
|
#
|
||||||
|
def ensure_class_name_security(field)
|
||||||
|
if field.class_name =~ /^Locomotive::Entry([a-z0-9]+)$/
|
||||||
|
content_type = Locomotive::ContentType.find($1)
|
||||||
|
|
||||||
|
if content_type.site_id != self.site_id
|
||||||
|
field.errors.add :security
|
||||||
|
end
|
||||||
|
else
|
||||||
|
# for now, does not allow external classes
|
||||||
|
field.errors.add :security
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -6,36 +6,27 @@ module Locomotive
|
|||||||
extend ActiveSupport::Concern
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
included do
|
included do
|
||||||
include ::Mongoid::Acts::Tree
|
include ::Mongoid::Tree
|
||||||
|
include ::Mongoid::Tree::Ordering
|
||||||
## fields ##
|
|
||||||
field :position, :type => Integer
|
|
||||||
|
|
||||||
## indexes ##
|
## indexes ##
|
||||||
index :position
|
index :position
|
||||||
index [[:depth, :asc], [:position, :asc]]
|
index [:depth.asc, :position.asc]
|
||||||
|
|
||||||
## behaviours ##
|
|
||||||
acts_as_tree :order => ['position', 'asc']
|
|
||||||
|
|
||||||
## callbacks ##
|
|
||||||
before_validation :reset_parent
|
|
||||||
before_save { |p| p.send(:write_attribute, :parent_id, nil) if p.parent_id.blank? }
|
|
||||||
before_save :change_parent
|
|
||||||
before_create { |p| p.send(:fix_position, false) }
|
|
||||||
before_create :add_to_list_bottom
|
|
||||||
before_destroy :remove_from_list
|
|
||||||
|
|
||||||
# Fixme (Didier L.): Instances methods are defined before the include itself
|
|
||||||
alias :fix_position :hacked_fix_position
|
|
||||||
alias :descendants :hacked_descendants
|
|
||||||
end
|
end
|
||||||
|
|
||||||
module ClassMethods
|
module ClassMethods
|
||||||
|
|
||||||
# Warning: should be used only in read-only
|
# Returns the pages tree from the site with the most minimal amount of queries.
|
||||||
|
# This method should only be used for read-only purpose since
|
||||||
|
# the mongodb returns the minimal set of required attributes to build
|
||||||
|
# the tree.
|
||||||
|
#
|
||||||
|
# @param [ Locomotive::Site ] site The site owning the pages
|
||||||
|
#
|
||||||
|
# @return [ Array ] The first array of pages (depth = 0)
|
||||||
|
#
|
||||||
def quick_tree(site, minimal_attributes = true)
|
def quick_tree(site, minimal_attributes = true)
|
||||||
pages = (minimal_attributes ? site.pages.minimal_attributes : site.pages).order_by([[:depth, :asc], [:position, :asc]]).to_a
|
pages = (minimal_attributes ? site.pages.minimal_attributes : site.pages).order_by([:depth.asc, :position.asc]).to_a
|
||||||
|
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
@ -46,6 +37,7 @@ module Locomotive
|
|||||||
tmp
|
tmp
|
||||||
end
|
end
|
||||||
|
|
||||||
|
#:nodoc:
|
||||||
def _quick_tree(current_page, pages)
|
def _quick_tree(current_page, pages)
|
||||||
i, children = 0, []
|
i, children = 0, []
|
||||||
|
|
||||||
@ -75,85 +67,27 @@ module Locomotive
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
module InstanceMethods
|
# Returns the children of this node but with the minimal set of required attributes
|
||||||
|
#
|
||||||
def children?
|
# @return [ Array ] The children pages ordered by their position
|
||||||
self.class.where(self.parent_id_field => self.id).count
|
#
|
||||||
end
|
|
||||||
|
|
||||||
def children_with_minimal_attributes
|
def children_with_minimal_attributes
|
||||||
self.class.where(self.parent_id_field => self.id).
|
self.children.minimal_attributes
|
||||||
order_by(self.tree_order).
|
|
||||||
minimal_attributes
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Assigns the new position of each child of this node.
|
||||||
|
#
|
||||||
|
# @param [ Array ] ids The ordered list of page ids (string)
|
||||||
|
#
|
||||||
def sort_children!(ids)
|
def sort_children!(ids)
|
||||||
|
cached_children = self.children.to_a
|
||||||
ids.each_with_index do |id, position|
|
ids.each_with_index do |id, position|
|
||||||
child = self.children.detect { |p| p._id == BSON::ObjectId(id) }
|
child = cached_children.detect { |p| p._id == BSON::ObjectId(id) }
|
||||||
child.position = position
|
child.position = position
|
||||||
child.save
|
child.save
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def parent=(owner) # missing in acts_as_tree
|
|
||||||
@_parent = owner
|
|
||||||
self.fix_position(false)
|
|
||||||
self.instance_variable_set :@_will_move, true
|
|
||||||
end
|
|
||||||
|
|
||||||
def hacked_descendants
|
|
||||||
return [] if new_record?
|
|
||||||
self.class.all_in(path_field => [self._id]).order_by tree_order
|
|
||||||
end
|
|
||||||
|
|
||||||
protected
|
|
||||||
|
|
||||||
def change_parent
|
|
||||||
if self.parent_id_changed?
|
|
||||||
self.fix_position(false)
|
|
||||||
|
|
||||||
unless self.parent_id_was.nil?
|
|
||||||
self.position = nil # make it move to bottom
|
|
||||||
self.add_to_list_bottom
|
|
||||||
end
|
|
||||||
|
|
||||||
self.instance_variable_set :@_will_move, true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def hacked_fix_position(perform_save = true)
|
|
||||||
if parent.nil?
|
|
||||||
self.write_attribute parent_id_field, nil
|
|
||||||
self[path_field] = []
|
|
||||||
self[depth_field] = 0
|
|
||||||
else
|
|
||||||
self.write_attribute parent_id_field, parent._id
|
|
||||||
self[path_field] = parent[path_field] + [parent._id]
|
|
||||||
self[depth_field] = parent[depth_field] + 1
|
|
||||||
self.save if perform_save
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def reset_parent
|
|
||||||
if self.parent_id_changed?
|
|
||||||
@_parent = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def add_to_list_bottom
|
|
||||||
self.position ||= (self.class.where(:_id.ne => self._id).and(:parent_id => self.parent_id).max(:position) || 0) + 1
|
|
||||||
end
|
|
||||||
|
|
||||||
def remove_from_list
|
|
||||||
return if (self.site rescue nil).nil?
|
|
||||||
|
|
||||||
self.class.where(:parent_id => self.parent_id).and(:position.gt => self.position).each do |p|
|
|
||||||
p.position -= 1
|
|
||||||
p.save
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -23,7 +23,7 @@ module Locomotive
|
|||||||
field :cache_strategy, :default => 'none'
|
field :cache_strategy, :default => 'none'
|
||||||
|
|
||||||
## associations ##
|
## associations ##
|
||||||
referenced_in :site, :class_name => 'Locomotive::Site'
|
belongs_to :site, :class_name => 'Locomotive::Site'
|
||||||
|
|
||||||
## indexes ##
|
## indexes ##
|
||||||
index :site_id
|
index :site_id
|
||||||
@ -105,7 +105,7 @@ module Locomotive
|
|||||||
if self.index? || self.not_found?
|
if self.index? || self.not_found?
|
||||||
self.fullpath = self.slug
|
self.fullpath = self.slug
|
||||||
else
|
else
|
||||||
slugs = self.self_and_ancestors.sort_by(&:depth).map(&:slug)
|
slugs = self.ancestors_and_self.map(&:slug)
|
||||||
slugs.shift unless slugs.size == 1
|
slugs.shift unless slugs.size == 1
|
||||||
self.fullpath = File.join slugs.compact
|
self.fullpath = File.join slugs.compact
|
||||||
end
|
end
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
module Locomotive
|
module Locomotive
|
||||||
class ContentEntryPresenter < BasePresenter
|
class ContentEntryPresenter < BasePresenter
|
||||||
|
|
||||||
delegate :_slug, :_position, :seo_title, :meta_keywords, :meta_description, :to => :source
|
delegate :_label, :_slug, :_position, :seo_title, :meta_keywords, :meta_description, :to => :source
|
||||||
|
|
||||||
# Returns the value of a field in the context of the current entry.
|
# Returns the value of a field in the context of the current entry.
|
||||||
#
|
#
|
||||||
@ -33,11 +33,12 @@ module Locomotive
|
|||||||
case rule['type'].to_sym
|
case rule['type'].to_sym
|
||||||
when :date then "formatted_#{rule['name']}"
|
when :date then "formatted_#{rule['name']}"
|
||||||
when :file then [rule['name'], "remove_#{rule['name']}"]
|
when :file then [rule['name'], "remove_#{rule['name']}"]
|
||||||
when :select, :belongs_to then "#{rule['name']}_id"
|
when :select, :belongs_to then ["#{rule['name']}_id", "position_in_#{rule['name']}"]
|
||||||
|
when :has_many then nil
|
||||||
else
|
else
|
||||||
rule['name']
|
rule['name']
|
||||||
end
|
end
|
||||||
end.flatten + %w(_slug seo_title meta_keywords meta_description)
|
end.compact.flatten + %w(_slug seo_title meta_keywords meta_description _destroy)
|
||||||
end
|
end
|
||||||
|
|
||||||
def errors
|
def errors
|
||||||
@ -52,8 +53,12 @@ module Locomotive
|
|||||||
self.source.custom_fields_recipe['rules'].find_all { |rule| rule['type'] == 'file' }.map { |rule| rule['name'] }
|
self.source.custom_fields_recipe['rules'].find_all { |rule| rule['type'] == 'file' }.map { |rule| rule['name'] }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def _has_many_fields
|
||||||
|
self.source.custom_fields_recipe['rules'].find_all { |rule| rule['type'] == 'has_many' }.map { |rule| [rule['name'], rule['inverse_of']] }
|
||||||
|
end
|
||||||
|
|
||||||
def included_methods
|
def included_methods
|
||||||
default_list = %w(_slug _position content_type_slug _file_fields safe_attributes)
|
default_list = %w(_label _slug _position content_type_slug _file_fields _has_many_fields safe_attributes)
|
||||||
default_list << 'errors' if !!self.options[:include_errors]
|
default_list << 'errors' if !!self.options[:include_errors]
|
||||||
super + self.custom_fields_methods + default_list
|
super + self.custom_fields_methods + default_list
|
||||||
end
|
end
|
||||||
@ -81,6 +86,7 @@ module Locomotive
|
|||||||
when :date then "formatted_#{name}"
|
when :date then "formatted_#{name}"
|
||||||
when :file then "#{name}_url"
|
when :file then "#{name}_url"
|
||||||
when :belongs_to then "#{name}_id"
|
when :belongs_to then "#{name}_id"
|
||||||
|
# when :has_many then nil
|
||||||
else
|
else
|
||||||
name
|
name
|
||||||
end
|
end
|
||||||
|
@ -7,7 +7,11 @@
|
|||||||
|
|
||||||
= f.inputs :name => :attributes do
|
= f.inputs :name => :attributes do
|
||||||
- @content_type.ordered_entries_custom_fields.each_with_index do |field, index|
|
- @content_type.ordered_entries_custom_fields.each_with_index do |field, index|
|
||||||
= render "locomotive/custom_fields/types/#{field.type}", :f => f, :name => field.name.to_sym, :field => field, :highlighted => field._id == @content_type.label_field_id
|
= render "locomotive/custom_fields/types/#{field.type}",
|
||||||
|
:f => f,
|
||||||
|
:name => field.name.to_sym,
|
||||||
|
:field => field,
|
||||||
|
:highlighted => field._id == @content_type.label_field_id
|
||||||
|
|
||||||
= f.inputs :name => :advanced_options, :class => "inputs foldable #{'folded' if inputs_folded?(@content_entry)}" do
|
= f.inputs :name => :advanced_options, :class => "inputs foldable #{'folded' if inputs_folded?(@content_entry)}" do
|
||||||
|
|
||||||
|
@ -3,7 +3,10 @@
|
|||||||
|
|
||||||
- content_for :backbone_view_data do
|
- content_for :backbone_view_data do
|
||||||
:plain
|
:plain
|
||||||
{ content_type: #{@content_type.persisted? ? @content_type.to_json : 'null'} }
|
{
|
||||||
|
content_type: #{@content_type.persisted? ? @content_type.to_json : 'null'},
|
||||||
|
inverse_of_list: #{options_for_content_type_inverse_of.to_json}
|
||||||
|
}
|
||||||
|
|
||||||
= f.inputs :name => :information do
|
= f.inputs :name => :information do
|
||||||
|
|
||||||
|
@ -44,9 +44,11 @@
|
|||||||
|
|
||||||
= g.input :text_formatting, :as => :select, :collection => options_for_text_formatting, :include_blank => false, :wrapper_html => { :class => 'extra text-formatting' }, :input_html => { :class => 'text_formatting' }
|
= g.input :text_formatting, :as => :select, :collection => options_for_text_formatting, :include_blank => false, :wrapper_html => { :class => 'extra text-formatting' }, :input_html => { :class => 'text_formatting' }
|
||||||
|
|
||||||
= g.input :class_name, :as => :select, :collection => options_for_content_types, :include_blank => false, :wrapper_html => { :class => 'extra class-name', :style => 'display: none' }, :input_html => { :class => 'class_name' }
|
= g.input :class_name, :as => :select, :collection => options_for_content_type, :include_blank => false, :wrapper_html => { :class => 'extra class-name', :style => 'display: none' }, :input_html => { :class => 'class_name' }
|
||||||
|
|
||||||
/ = g.input :inverse_of, :input_html => { :class => 'inverse_of' }, :wrapper_html => { :style => 'display: none' }
|
= g.input :inverse_of, :as => :select, :collection => [], :wrapper_html => { :class => 'extra inverse-of', :style => 'display: none' }, :input_html => { :class => 'inverse_of' }
|
||||||
|
|
||||||
|
= g.input :ui_enabled, :as => :'Locomotive::Toggle', :wrapper_html => { :class => 'extra ui-enabled' }, :input_html => { :class => 'ui_enabled' }
|
||||||
|
|
||||||
%span.actions
|
%span.actions
|
||||||
= link_to 'toggle', '#', :class => 'toggle'
|
= link_to 'toggle', '#', :class => 'toggle'
|
||||||
|
@ -1,33 +1,70 @@
|
|||||||
= form.custom_input field._alias.to_sym, :label => field.label, :hint => field.hint, :css => 'has-many', :required => required do
|
- if !f.object.new_record? && field.ui_enabled?
|
||||||
|
|
||||||
.has-many-selector
|
= f.input name.to_sym,
|
||||||
|
:label => field.label,
|
||||||
|
:hint => field.hint,
|
||||||
|
:as => :'Locomotive::Empty',
|
||||||
|
:wrapper_html => { :id => "content_entry_#{name}_input", :class => 'empty relationship input' }
|
||||||
|
|
||||||
%p{ :style => form.object.send(field._alias.to_sym).empty? ? '' : 'display: none' }
|
- content_for :head do
|
||||||
= t('.empty')
|
|
||||||
|
%script{ :type => 'text/html', :id => "#{name}_list" }
|
||||||
|
|
||||||
|
%p.empty{ :style => 'display: none' }!= t('.empty')
|
||||||
|
|
||||||
%ul
|
%ul
|
||||||
|
|
||||||
%script{ :type => 'text/x-mustache-template', :name => 'template', :'data-base-input-name' => "content[#{field._alias.to_sym}]" }
|
%hr
|
||||||
%li{ :class => "item {{behaviour_flag}}" }
|
|
||||||
%span.handle
|
|
||||||
= image_tag 'admin/form/icons/drag.png'
|
|
||||||
|
|
||||||
{{^if_template}}
|
%p
|
||||||
%input{ :name => '{{base_name}}[]', :value => '{{{id}}}', :type => 'hidden', :'data-field' => 'id' }
|
= link_to t('.new_entry'), '#'
|
||||||
{{/if_template}}
|
|
||||||
|
|
||||||
%strong {{label}}
|
%script{ :type => 'text/html', :id => "#{name}_entry" }
|
||||||
|
%li
|
||||||
|
.handle.col
|
||||||
|
= image_tag 'locomotive/form/icons/drag.png'
|
||||||
|
|
||||||
{{#if_template}}
|
.label.col
|
||||||
= select_tag 'label', ''
|
{{label}}
|
||||||
{{/if_template}}
|
|
||||||
|
|
||||||
%span.actions
|
%span.actions
|
||||||
- if field.reverse_lookup?
|
= link_to 'x', '#', :class => 'remove', :confirm => t('locomotive.messages.confirm')
|
||||||
= link_to image_tag('admin/form/pen.png'), '#', :class => 'edit first'
|
|
||||||
= link_to image_tag('admin/form/icons/trash.png'), '#', :class => 'remove'
|
|
||||||
%button{ :class => 'button light mini add', :type => 'button' }
|
|
||||||
%span!= t('locomotive.buttons.new_item')
|
|
||||||
|
|
||||||
%script{ :type => 'text/javascript', :name => 'data' }
|
|
||||||
!= has_many_data_to_js(field, form.object)
|
/ - collection = f.object.send(name.to_sym)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/ = form.custom_input field._alias.to_sym, :label => field.label, :hint => field.hint, :css => 'has-many', :required => required do
|
||||||
|
/
|
||||||
|
/ .has-many-selector
|
||||||
|
/
|
||||||
|
/ %p{ :style => form.object.send(field._alias.to_sym).empty? ? '' : 'display: none' }
|
||||||
|
/ = t('.empty')
|
||||||
|
/
|
||||||
|
/ %ul
|
||||||
|
/
|
||||||
|
/ %script{ :type => 'text/x-mustache-template', :name => 'template', :'data-base-input-name' => "content[#{field._alias.to_sym}]" }
|
||||||
|
/ %li{ :class => "item {{behaviour_flag}}" }
|
||||||
|
/ %span.handle
|
||||||
|
/ = image_tag 'admin/form/icons/drag.png'
|
||||||
|
/
|
||||||
|
/ {{^if_template}}
|
||||||
|
/ %input{ :name => '{{base_name}}[]', :value => '{{{id}}}', :type => 'hidden', :'data-field' => 'id' }
|
||||||
|
/ {{/if_template}}
|
||||||
|
/
|
||||||
|
/ %strong {{label}}
|
||||||
|
/
|
||||||
|
/ {{#if_template}}
|
||||||
|
/ = select_tag 'label', ''
|
||||||
|
/ {{/if_template}}
|
||||||
|
/
|
||||||
|
/ %span.actions
|
||||||
|
/ - if field.reverse_lookup?
|
||||||
|
/ = link_to image_tag('admin/form/pen.png'), '#', :class => 'edit first'
|
||||||
|
/ = link_to image_tag('admin/form/icons/trash.png'), '#', :class => 'remove'
|
||||||
|
/ %button{ :class => 'button light mini add', :type => 'button' }
|
||||||
|
/ %span!= t('locomotive.buttons.new_item')
|
||||||
|
/
|
||||||
|
/ %script{ :type => 'text/javascript', :name => 'data' }
|
||||||
|
/ != has_many_data_to_js(field, form.object)
|
@ -1,5 +1,5 @@
|
|||||||
= f.input :"#{name}_id",
|
= f.input :"#{name}_id",
|
||||||
:label => field.label,
|
:label => field.label,
|
||||||
:hint => field.hint,
|
:hint => field.hint,
|
||||||
:as => 'select',
|
:as => :select,
|
||||||
:collection => field.ordered_select_options.map { |option| [option.name, option.id] }
|
:collection => field.ordered_select_options.map { |option| [option.name, option.id] }
|
@ -1,5 +1,5 @@
|
|||||||
= f.input field.name.to_sym,
|
= f.input field.name.to_sym,
|
||||||
:label => field.label,
|
:label => field.label,
|
||||||
:hint => field.hint,
|
:hint => field.hint,
|
||||||
:as => field.text_formatting == 'html' ? :'Locomotive::Rte' : 'text',
|
:as => field.text_formatting == 'html' ? :'Locomotive::Rte' : :text,
|
||||||
:input_html => { :class => field.text_formatting }
|
:input_html => { :class => field.text_formatting }
|
@ -17,6 +17,7 @@ en:
|
|||||||
liquid_syntax: "Liquid Syntax error ('%{error}' on '%{fullpath}')"
|
liquid_syntax: "Liquid Syntax error ('%{error}' on '%{fullpath}')"
|
||||||
liquid_extend: "The page '%{fullpath}' extends a template which does not exist"
|
liquid_extend: "The page '%{fullpath}' extends a template which does not exist"
|
||||||
too_few_custom_fields: "At least, one custom field is required"
|
too_few_custom_fields: "At least, one custom field is required"
|
||||||
|
security: "presents a security problem"
|
||||||
|
|
||||||
attributes:
|
attributes:
|
||||||
defaults:
|
defaults:
|
||||||
|
@ -3,12 +3,24 @@ CustomFields.options = {
|
|||||||
:reserved_names => Mongoid.destructive_fields + %w(created_at updated_at)
|
:reserved_names => Mongoid.destructive_fields + %w(created_at updated_at)
|
||||||
}
|
}
|
||||||
|
|
||||||
# Set correct paths
|
|
||||||
module CustomFields
|
module CustomFields
|
||||||
|
|
||||||
|
class Field
|
||||||
|
field :ui_enabled, :type => Boolean, :default => true
|
||||||
|
|
||||||
|
protected
|
||||||
|
|
||||||
|
def ensure_class_name_security
|
||||||
|
self._parent.send :ensure_class_name_security, self
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
module Types
|
module Types
|
||||||
|
|
||||||
module File
|
module File
|
||||||
class FileUploader < ::CarrierWave::Uploader::Base
|
class FileUploader < ::CarrierWave::Uploader::Base
|
||||||
|
|
||||||
|
# Set correct paths
|
||||||
def store_dir
|
def store_dir
|
||||||
"sites/#{model.site_id}/contents/#{model.class.model_name.underscore}/#{model.id}/files"
|
"sites/#{model.site_id}/contents/#{model.class.model_name.underscore}/#{model.id}/files"
|
||||||
end
|
end
|
||||||
|
@ -2,7 +2,7 @@ puts "\t...loading dependencies"
|
|||||||
|
|
||||||
require 'mongoid'
|
require 'mongoid'
|
||||||
require 'mongoid/railtie'
|
require 'mongoid/railtie'
|
||||||
require 'mongoid_acts_as_tree'
|
require 'mongoid/tree'
|
||||||
require 'devise'
|
require 'devise'
|
||||||
require 'devise/orm/mongoid'
|
require 'devise/orm/mongoid'
|
||||||
require 'kaminari'
|
require 'kaminari'
|
||||||
|
@ -18,7 +18,7 @@ module Locomotive
|
|||||||
end
|
end
|
||||||
|
|
||||||
def breadcrumbs
|
def breadcrumbs
|
||||||
@breadcrumbs ||= liquify(*self._source.self_and_ancestors)
|
@breadcrumbs ||= liquify(*self._source.ancestors_and_self)
|
||||||
end
|
end
|
||||||
|
|
||||||
def children
|
def children
|
||||||
|
@ -14,13 +14,13 @@ Gem::Specification.new do |s|
|
|||||||
s.email = ['didier@nocoffee.fr']
|
s.email = ['didier@nocoffee.fr']
|
||||||
s.homepage = 'http://www.locomotivecms.com'
|
s.homepage = 'http://www.locomotivecms.com'
|
||||||
s.summary = 'A Next Generation Sexy CMS for Rails 3'
|
s.summary = 'A Next Generation Sexy CMS for Rails 3'
|
||||||
s.description = 'Locomotive is a next generation CMS system with sexy admin tools, liquid templating, and inline editing powered by mongodb and rails 3.1'
|
s.description = 'Locomotive is a next generation CMS system with sexy admin tools, liquid templating, and inline editing powered by mongodb and rails 3.2'
|
||||||
|
|
||||||
s.required_rubygems_version = '>= 1.3.6'
|
s.required_rubygems_version = '>= 1.3.6'
|
||||||
|
|
||||||
s.add_dependency 'rake', '~> 0.9.2'
|
s.add_dependency 'rake', '~> 0.9.2'
|
||||||
|
|
||||||
s.add_dependency 'rails', '~> 3.1.3'
|
s.add_dependency 'rails', '~> 3.2.1'
|
||||||
|
|
||||||
s.add_dependency 'devise', '~> 1.5.3'
|
s.add_dependency 'devise', '~> 1.5.3'
|
||||||
s.add_dependency 'cancan', '~> 1.6.7'
|
s.add_dependency 'cancan', '~> 1.6.7'
|
||||||
@ -28,22 +28,23 @@ Gem::Specification.new do |s|
|
|||||||
s.add_dependency 'mongo', '~> 1.5.2'
|
s.add_dependency 'mongo', '~> 1.5.2'
|
||||||
s.add_dependency 'bson_ext', '~> 1.5.2'
|
s.add_dependency 'bson_ext', '~> 1.5.2'
|
||||||
s.add_dependency 'mongoid', '~> 2.4.3'
|
s.add_dependency 'mongoid', '~> 2.4.3'
|
||||||
s.add_dependency 'locomotive_mongoid_acts_as_tree', '~> 0.1.5.8'
|
s.add_dependency 'locomotive-mongoid-tree', '~> 0.6.2'
|
||||||
|
# s.add_dependency 'locomotive_mongoid_acts_as_tree', '~> 0.1.5.8'
|
||||||
|
|
||||||
s.add_dependency 'custom_fields', '~> 2.0.0.rc2'
|
s.add_dependency 'custom_fields', '~> 2.0.0.rc3'
|
||||||
|
|
||||||
s.add_dependency 'kaminari', '~> 0.13.0'
|
s.add_dependency 'kaminari', '~> 0.13.0'
|
||||||
|
|
||||||
s.add_dependency 'haml', '~> 3.1.3'
|
s.add_dependency 'haml', '~> 3.1.4'
|
||||||
s.add_dependency 'sass-rails', '~> 3.1.5'
|
# # s.add_dependency 'sass-rails', '~> 3.1.5'
|
||||||
s.add_dependency 'coffee-script', '~> 2.2.0'
|
# # s.add_dependency 'coffee-script', '~> 2.2.0'
|
||||||
s.add_dependency 'uglifier', '~> 1.2.2'
|
# # s.add_dependency 'uglifier', '~> 1.2.2'
|
||||||
s.add_dependency 'compass', '~> 0.12.alpha.4'
|
# # # s.add_dependency 'compass', '~> 0.12.rc.0'
|
||||||
s.add_dependency 'jquery-rails', '~> 1.0.16'
|
s.add_dependency 'jquery-rails', '~> 1.0.16'
|
||||||
s.add_dependency 'rails-backbone', '~> 0.5.4'
|
s.add_dependency 'rails-backbone', '~> 0.6.1'
|
||||||
s.add_dependency 'codemirror-rails', '~> 2.21'
|
s.add_dependency 'codemirror-rails', '~> 2.21'
|
||||||
s.add_dependency 'locomotive-tinymce-rails', '~> 3.4.7'
|
s.add_dependency 'locomotive-tinymce-rails', '~> 3.4.7.1'
|
||||||
s.add_dependency 'locomotive-aloha-rails', '~> 0.20.1'
|
s.add_dependency 'locomotive-aloha-rails', '~> 0.20.1.1'
|
||||||
s.add_dependency 'flash_cookie_session', '~> 1.1.1'
|
s.add_dependency 'flash_cookie_session', '~> 1.1.1'
|
||||||
|
|
||||||
s.add_dependency 'locomotive_liquid', '2.2.2'
|
s.add_dependency 'locomotive_liquid', '2.2.2'
|
||||||
|
@ -5,7 +5,8 @@ require 'action_mailer/railtie'
|
|||||||
require 'active_resource/railtie'
|
require 'active_resource/railtie'
|
||||||
require 'sprockets/railtie'
|
require 'sprockets/railtie'
|
||||||
|
|
||||||
Bundler.require
|
# Bundler.require
|
||||||
|
Bundler.require(*Rails.groups(:assets => %w(development test)))
|
||||||
require 'locomotive/engine'
|
require 'locomotive/engine'
|
||||||
|
|
||||||
module Dummy
|
module Dummy
|
||||||
@ -43,6 +44,10 @@ module Dummy
|
|||||||
|
|
||||||
# Version of your assets, change this if you want to expire all your assets
|
# Version of your assets, change this if you want to expire all your assets
|
||||||
config.assets.version = '1.0'
|
config.assets.version = '1.0'
|
||||||
|
|
||||||
|
# config.after_initialize do |c|
|
||||||
|
# c.middleware.delete(Sass::Plugin::Rack)
|
||||||
|
# end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user