fix js bug when changing layout in page editing + improve nav tag
This commit is contained in:
parent
c4f4979203
commit
35e0120cab
18
Gemfile
18
Gemfile
@ -13,7 +13,7 @@ gem 'mongoid_acts_as_tree', '0.1.5'
|
|||||||
gem 'mongo_session_store', '2.0.0.pre'
|
gem 'mongo_session_store', '2.0.0.pre'
|
||||||
gem 'warden'
|
gem 'warden'
|
||||||
gem 'devise', '1.1.rc1'
|
gem 'devise', '1.1.rc1'
|
||||||
gem 'haml', '3.0.1'
|
gem 'haml', '3.0.13'
|
||||||
gem 'rmagick', '2.12.2'
|
gem 'rmagick', '2.12.2'
|
||||||
gem 'aws'
|
gem 'aws'
|
||||||
gem 'mimetype-fu', :require => 'mimetype_fu'
|
gem 'mimetype-fu', :require => 'mimetype_fu'
|
||||||
@ -36,12 +36,12 @@ group :development do
|
|||||||
end
|
end
|
||||||
|
|
||||||
group :test do
|
group :test do
|
||||||
gem 'rspec-rails', '2.0.0.beta.11'
|
gem 'rspec-rails', '2.0.0.beta.11'
|
||||||
gem 'factory_girl_rails'
|
gem 'factory_girl_rails'
|
||||||
gem 'capybara'
|
gem 'capybara'
|
||||||
gem 'cucumber'
|
gem 'cucumber'
|
||||||
gem 'cucumber-rails'
|
gem 'cucumber-rails'
|
||||||
gem 'spork'
|
gem 'spork'
|
||||||
gem 'launchy'
|
gem 'launchy'
|
||||||
gem 'mocha', :git => 'git://github.com/floehopper/mocha.git'
|
gem 'mocha', :git => 'git://github.com/floehopper/mocha.git'
|
||||||
end
|
end
|
@ -1,12 +1,15 @@
|
|||||||
module Admin
|
module Admin
|
||||||
class PagePartsController < BaseController
|
class PagePartsController < BaseController
|
||||||
|
|
||||||
layout nil
|
layout nil
|
||||||
|
|
||||||
|
respond_to :json
|
||||||
|
|
||||||
def index
|
def index
|
||||||
parts = current_site.layouts.find(params[:layout_id]).parts
|
parts = current_site.layouts.find(params[:layout_id]).parts
|
||||||
render :json => { :parts => parts }
|
|
||||||
|
respond_with parts.collect(&:attributes)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
@ -1,31 +1,31 @@
|
|||||||
module Admin
|
module Admin
|
||||||
class PagesController < BaseController
|
class PagesController < BaseController
|
||||||
|
|
||||||
sections 'contents'
|
sections 'contents'
|
||||||
|
|
||||||
respond_to :json, :only => [:update, :sort]
|
respond_to :json, :only => [:update, :sort, :get_path]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@pages = current_site.pages.roots
|
@pages = current_site.pages.roots
|
||||||
end
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
@page = current_site.pages.build
|
@page = current_site.pages.build
|
||||||
@page.parts << PagePart.build_body_part
|
@page.parts << PagePart.build_body_part
|
||||||
end
|
end
|
||||||
|
|
||||||
def sort
|
def sort
|
||||||
@page = current_site.pages.find(params[:id])
|
@page = current_site.pages.find(params[:id])
|
||||||
@page.sort_children!(params[:children])
|
@page.sort_children!(params[:children])
|
||||||
|
|
||||||
respond_with @page
|
respond_with @page
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_path
|
def get_path
|
||||||
page = current_site.pages.build(:parent => current_site.pages.find(params[:parent_id]), :slug => params[:slug].slugify)
|
page = current_site.pages.build(:parent => current_site.pages.find(params[:parent_id]), :slug => params[:slug].slugify)
|
||||||
|
|
||||||
render :json => { :url => page.url, :slug => page.slug }
|
render :json => { :url => page.url, :slug => page.slug }
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
@ -34,9 +34,6 @@ class Site
|
|||||||
named_scope :match_domain, lambda { |domain| { :where => { :domains => domain } } }
|
named_scope :match_domain, lambda { |domain| { :where => { :domains => domain } } }
|
||||||
named_scope :match_domain_with_exclusion_of, lambda { |domain, site| { :where => { :domains => domain, :_id.ne => site.id } } }
|
named_scope :match_domain_with_exclusion_of, lambda { |domain, site| { :where => { :domains => domain, :_id.ne => site.id } } }
|
||||||
|
|
||||||
## behaviours ##
|
|
||||||
liquid_methods :name, :meta_keywords, :meta_description
|
|
||||||
|
|
||||||
## methods ##
|
## methods ##
|
||||||
|
|
||||||
def accounts
|
def accounts
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
en:
|
en:
|
||||||
admin:
|
admin:
|
||||||
buttons:
|
buttons:
|
||||||
login: Log in
|
login: Log in
|
||||||
send_password: Send
|
send_password: Send
|
||||||
change_password: Update
|
change_password: Update
|
||||||
new_item: "+ add"
|
new_item: "+ add"
|
||||||
|
|
||||||
messages:
|
messages:
|
||||||
confirm: Are you sure ?
|
confirm: Are you sure ?
|
||||||
|
|
||||||
shared:
|
shared:
|
||||||
header:
|
header:
|
||||||
welcome: Welcome, %{name}
|
welcome: Welcome, %{name}
|
||||||
@ -30,7 +30,7 @@ en:
|
|||||||
back: Back without saving
|
back: Back without saving
|
||||||
create: Create
|
create: Create
|
||||||
update: Update
|
update: Update
|
||||||
|
|
||||||
custom_fields:
|
custom_fields:
|
||||||
edit:
|
edit:
|
||||||
title: Editing custom field
|
title: Editing custom field
|
||||||
@ -40,7 +40,7 @@ en:
|
|||||||
category: Select
|
category: Select
|
||||||
boolean: Checkbox
|
boolean: Checkbox
|
||||||
date: Date
|
date: Date
|
||||||
file: File
|
file: File
|
||||||
text_formatting:
|
text_formatting:
|
||||||
none: None
|
none: None
|
||||||
html: HTML
|
html: HTML
|
||||||
@ -53,7 +53,7 @@ en:
|
|||||||
custom_form:
|
custom_form:
|
||||||
edit_categories: Edit options
|
edit_categories: Edit options
|
||||||
delete_file: Delete file
|
delete_file: Delete file
|
||||||
|
|
||||||
sessions:
|
sessions:
|
||||||
new:
|
new:
|
||||||
title: Login
|
title: Login
|
||||||
@ -70,8 +70,8 @@ en:
|
|||||||
title: Update my password
|
title: Update my password
|
||||||
link: "→ Back to login page"
|
link: "→ Back to login page"
|
||||||
password: "Your new password"
|
password: "Your new password"
|
||||||
password_confirmation: "Confirmation of your new password"
|
password_confirmation: "Confirmation of your new password"
|
||||||
|
|
||||||
pages:
|
pages:
|
||||||
index:
|
index:
|
||||||
title: Listing pages
|
title: Listing pages
|
||||||
@ -96,7 +96,7 @@ en:
|
|||||||
day: 1 day
|
day: 1 day
|
||||||
week: 1 week
|
week: 1 week
|
||||||
month: 1 month
|
month: 1 month
|
||||||
|
|
||||||
layouts:
|
layouts:
|
||||||
index:
|
index:
|
||||||
title: Listing layouts
|
title: Listing layouts
|
||||||
@ -127,28 +127,28 @@ en:
|
|||||||
help: "Fill in the form below to update your snippet."
|
help: "Fill in the form below to update your snippet."
|
||||||
snippet:
|
snippet:
|
||||||
updated_at: Updated at
|
updated_at: Updated at
|
||||||
|
|
||||||
sites:
|
sites:
|
||||||
new:
|
new:
|
||||||
title: New site
|
title: New site
|
||||||
help: "Fill in the form below to create your new site."
|
help: "Fill in the form below to create your new site."
|
||||||
|
|
||||||
current_sites:
|
current_sites:
|
||||||
edit:
|
edit:
|
||||||
new_membership: add account
|
new_membership: add account
|
||||||
help: "The site name can be updated by clicking it."
|
help: "The site name can be updated by clicking it."
|
||||||
ask_for_name: "Please type the new site name"
|
ask_for_name: "Please type the new site name"
|
||||||
|
|
||||||
memberships:
|
memberships:
|
||||||
new:
|
new:
|
||||||
title: New membership
|
title: New membership
|
||||||
help: "Please give the account email to add. If it does not exist, you will be redirected to the account creation form."
|
help: "Please give the account email to add. If it does not exist, you will be redirected to the account creation form."
|
||||||
|
|
||||||
accounts:
|
accounts:
|
||||||
new:
|
new:
|
||||||
title: New account
|
title: New account
|
||||||
help: "Fill in the form below to add a new account."
|
help: "Fill in the form below to add a new account."
|
||||||
|
|
||||||
my_accounts:
|
my_accounts:
|
||||||
edit:
|
edit:
|
||||||
help: "Your name can be updated by clicking it."
|
help: "Your name can be updated by clicking it."
|
||||||
@ -156,7 +156,7 @@ en:
|
|||||||
en: English
|
en: English
|
||||||
fr: French
|
fr: French
|
||||||
ask_for_name: "Please type your new name"
|
ask_for_name: "Please type your new name"
|
||||||
|
|
||||||
theme_assets:
|
theme_assets:
|
||||||
index:
|
index:
|
||||||
title: Listing theme files
|
title: Listing theme files
|
||||||
@ -180,7 +180,7 @@ en:
|
|||||||
images:
|
images:
|
||||||
title: Listing images
|
title: Listing images
|
||||||
no_items: "There are no files for now."
|
no_items: "There are no files for now."
|
||||||
|
|
||||||
asset_collections:
|
asset_collections:
|
||||||
index:
|
index:
|
||||||
title: Asset collections
|
title: Asset collections
|
||||||
@ -196,7 +196,7 @@ en:
|
|||||||
destroy: remove collection
|
destroy: remove collection
|
||||||
no_items: "There are no assets for now. Just click <a href=\"%{url}\">here</a> to create the first one."
|
no_items: "There are no assets for now. Just click <a href=\"%{url}\">here</a> to create the first one."
|
||||||
ask_for_name: "Please type the new name"
|
ask_for_name: "Please type the new name"
|
||||||
|
|
||||||
assets:
|
assets:
|
||||||
new:
|
new:
|
||||||
title: New asset
|
title: New asset
|
||||||
@ -204,7 +204,7 @@ en:
|
|||||||
edit:
|
edit:
|
||||||
title: Edit asset
|
title: Edit asset
|
||||||
help: "Fill in the form below to update your asset."
|
help: "Fill in the form below to update your asset."
|
||||||
|
|
||||||
content_types:
|
content_types:
|
||||||
index:
|
index:
|
||||||
new: new model
|
new: new model
|
||||||
@ -220,27 +220,27 @@ en:
|
|||||||
order_by:
|
order_by:
|
||||||
updated_at: 'By "updated at" date'
|
updated_at: 'By "updated at" date'
|
||||||
position_in_list: Manually
|
position_in_list: Manually
|
||||||
|
|
||||||
contents:
|
contents:
|
||||||
index:
|
index:
|
||||||
title: 'Listing "%{type}"'
|
title: 'Listing "%{type}"'
|
||||||
edit: edit model
|
edit: edit model
|
||||||
destroy: remove model
|
destroy: remove model
|
||||||
download: download items
|
download: download items
|
||||||
new: new item
|
new: new item
|
||||||
category_noname: "No name"
|
category_noname: "No name"
|
||||||
lastest_items: "Lastest items"
|
lastest_items: "Lastest items"
|
||||||
updated_at: "Updated at"
|
updated_at: "Updated at"
|
||||||
list:
|
list:
|
||||||
no_items: "There are no items for now. Just click <a href=\"%{url}\">here</a> to create the first one."
|
no_items: "There are no items for now. Just click <a href=\"%{url}\">here</a> to create the first one."
|
||||||
new:
|
new:
|
||||||
title: '%{type} — new item'
|
title: '%{type} — new item'
|
||||||
edit:
|
edit:
|
||||||
title: '%{type} — editing item'
|
title: '%{type} — editing item'
|
||||||
|
|
||||||
image_picker:
|
image_picker:
|
||||||
link: Insert an image into the code
|
link: Insert an image into the code
|
||||||
|
|
||||||
formtastic:
|
formtastic:
|
||||||
titles:
|
titles:
|
||||||
information: General information
|
information: General information
|
||||||
@ -268,7 +268,7 @@ en:
|
|||||||
custom_fields:
|
custom_fields:
|
||||||
field:
|
field:
|
||||||
_alias: Alias
|
_alias: Alias
|
||||||
|
|
||||||
hints:
|
hints:
|
||||||
page:
|
page:
|
||||||
published: "Only authenticated accounts can view unpublished pages."
|
published: "Only authenticated accounts can view unpublished pages."
|
||||||
@ -277,8 +277,8 @@ en:
|
|||||||
snippet:
|
snippet:
|
||||||
slug: "You need to know it in order to insert the snippet inside a page or a layout"
|
slug: "You need to know it in order to insert the snippet inside a page or a layout"
|
||||||
site:
|
site:
|
||||||
meta_keywords: "Meta keywords used within the head tag of the page. They are separeted by an empty space. Required for SEO."
|
meta_keywords: "Meta keywords used within the head tag of the page. They are separeted by an empty space. Required for SEO."
|
||||||
meta_description: "Meta description used within the head tag of the page. Required for SEO."
|
meta_description: "Meta description used within the head tag of the page. Required for SEO."
|
||||||
domain_name: "ex: locomotiveapp.org"
|
domain_name: "ex: locomotiveapp.org"
|
||||||
theme_asset:
|
theme_asset:
|
||||||
slug: "You do not need to add the extension file (.css or .js)"
|
slug: "You do not need to add the extension file (.css or .js)"
|
||||||
@ -288,4 +288,4 @@ en:
|
|||||||
field:
|
field:
|
||||||
_alias: "Property available in liquid templates"
|
_alias: "Property available in liquid templates"
|
||||||
hint: "Text displayed in the model form just below the field"
|
hint: "Text displayed in the model form just below the field"
|
||||||
|
|
||||||
|
@ -5,5 +5,5 @@ site.memberships.build :account => account, :admin => true
|
|||||||
site.save!
|
site.save!
|
||||||
|
|
||||||
puts "Your first website has been created !"
|
puts "Your first website has been created !"
|
||||||
puts "Admin url: http://test.example.com/admin"
|
puts "Admin url: http://test.example.com:3000/admin"
|
||||||
puts "Crendetials: admin@example.com / locomotive"
|
puts "Crendetials: admin@example.com / locomotive"
|
4
doc/TODO
4
doc/TODO
@ -1,8 +1,8 @@
|
|||||||
BOARD:
|
BOARD:
|
||||||
|
|
||||||
- refactor slugify method (use parameterize + create a module)
|
- refactor slugify method (use parameterize + create a module)
|
||||||
- send email when new content added thru api
|
- send email when new content added thru api
|
||||||
|
|
||||||
BACKLOG:
|
BACKLOG:
|
||||||
|
|
||||||
- rack app to map pretty asset url to S3
|
- rack app to map pretty asset url to S3
|
||||||
|
15
lib/locomotive/liquid/drops/site.rb
Normal file
15
lib/locomotive/liquid/drops/site.rb
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
module Locomotive
|
||||||
|
module Liquid
|
||||||
|
module Drops
|
||||||
|
class Site < Base
|
||||||
|
|
||||||
|
liquid_attributes << :name << :meta_keywords << :meta_description
|
||||||
|
|
||||||
|
def index
|
||||||
|
@index ||= @source.pages.index.first
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@ -28,8 +28,6 @@ module Locomotive
|
|||||||
path = [path, File.join(dirname, 'content_type_template').gsub(/^\//, '')]
|
path = [path, File.join(dirname, 'content_type_template').gsub(/^\//, '')]
|
||||||
end
|
end
|
||||||
|
|
||||||
# TODO: path is not correctly built + find content instance in order to render a 404 page if not found
|
|
||||||
|
|
||||||
if page = current_site.pages.any_in(:fullpath => [*path]).first
|
if page = current_site.pages.any_in(:fullpath => [*path]).first
|
||||||
if not page.published? and current_admin.nil?
|
if not page.published? and current_admin.nil?
|
||||||
page = nil
|
page = nil
|
||||||
|
@ -1,88 +1,88 @@
|
|||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
|
|
||||||
// slider
|
// slider
|
||||||
var resetSlider = function() {
|
var resetSlider = function() {
|
||||||
$('#page-parts .wrapper ul').wslide({
|
$('#page-parts .wrapper ul').wslide({
|
||||||
width: 880,
|
width: 880,
|
||||||
height: 400,
|
height: 400,
|
||||||
autolink: false,
|
autolink: false,
|
||||||
duration: 300,
|
duration: 300,
|
||||||
horiz: true
|
horiz: true
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
resetSlider();
|
resetSlider();
|
||||||
|
|
||||||
// codemirror
|
// codemirror
|
||||||
$('#parts code textarea').each(function() { addCodeMirrorEditor('liquid', $(this)); });
|
$('#parts code textarea').each(function() { addCodeMirrorEditor('liquid', $(this)); });
|
||||||
|
|
||||||
var refreshParts = function(parts) {
|
var refreshParts = function(parts) {
|
||||||
// console.log('refreshParts');
|
// console.log('refreshParts');
|
||||||
$('#page-parts .nav a').removeClass('enabled');
|
$('#page-parts .nav a').removeClass('enabled');
|
||||||
|
|
||||||
$(parts).each(function() {
|
$(parts).each(function() {
|
||||||
// console.log("iterating..." + this.slug);
|
// console.log("iterating..." + this.slug);
|
||||||
var control = $('#control-part-' + this.slug);
|
var control = $('#control-part-' + this.slug);
|
||||||
|
|
||||||
// adding missing part
|
// adding missing part
|
||||||
if (control.size() == 0) {
|
if (control.size() == 0) {
|
||||||
// console.log('adding part');
|
// console.log('adding part');
|
||||||
var nbParts = $('#page-parts .nav a').size();
|
var nbParts = $('#page-parts .nav a').size();
|
||||||
$('#page-parts .nav .clear').before('<a id="control-part-' + this.slug + '" class="enabled part-' + nbParts + '" href="#parts-' + (nbParts + 1) + '"><span>' + this.name + '</span></a>');
|
$('#page-parts .nav .clear').before('<a id="control-part-' + this.slug + '" class="enabled part-' + nbParts + '" href="#parts-' + (nbParts + 1) + '"><span>' + this.name + '</span></a>');
|
||||||
|
|
||||||
var textareaInput = '<textarea rows="20" name="page[parts_attributes][' + nbParts + '][value]" id="page_parts_attributes_' + nbParts + '_value"/>';
|
var textareaInput = '<textarea rows="20" name="page[parts_attributes][' + nbParts + '][value]" id="page_parts_attributes_' + nbParts + '_value"/>';
|
||||||
var hiddenInputs = '<input type="hidden" name="page[parts_attributes][' + nbParts + '][name]" value="' + this.name + '" />'
|
var hiddenInputs = '<input type="hidden" name="page[parts_attributes][' + nbParts + '][name]" value="' + this.name + '" />'
|
||||||
hiddenInputs += '<input type="hidden" name="page[parts_attributes][' + nbParts + '][slug]" value="' + this.slug + '" />'
|
hiddenInputs += '<input type="hidden" name="page[parts_attributes][' + nbParts + '][slug]" value="' + this.slug + '" />'
|
||||||
$('#page-parts .wrapper ul').append('<li id="part-' + nbParts + '" class="new"><code>' + textareaInput + '</code>' + hiddenInputs + '</li>');
|
$('#page-parts .wrapper ul').append('<li id="part-' + nbParts + '" class="new"><code>' + textareaInput + '</code>' + hiddenInputs + '</li>');
|
||||||
|
|
||||||
resetSlider();
|
resetSlider();
|
||||||
$('#parts li:last code textarea').each(function() { addCodeMirrorEditor('liquid', $(this)); });
|
$('#parts li:last code textarea').each(function() { addCodeMirrorEditor('liquid', $(this)); });
|
||||||
} else {
|
} else {
|
||||||
var index = parseInt(control.attr('class').match(/part-(.+)/)[1]) + 1;
|
var index = parseInt(control.attr('class').match(/part-(.+)/)[1]) + 1;
|
||||||
var wrapper = $('#parts-' + index);
|
var wrapper = $('#parts-' + index);
|
||||||
|
|
||||||
// updating part
|
// updating part
|
||||||
wrapper.find('input.disabled').val(this.disabled == true ? 'true' : 'false');
|
wrapper.find('input.disabled').val(this.disabled == true ? 'true' : 'false');
|
||||||
if (this.disabled == false) {
|
if (this.disabled == false) {
|
||||||
control.html('<span>' + this.name + '</span>').addClass('enabled').show();
|
control.html('<span>' + this.name + '</span>').addClass('enabled').show();
|
||||||
wrapper.show();
|
wrapper.show();
|
||||||
} else {
|
} else {
|
||||||
control.hide();
|
control.hide();
|
||||||
wrapper.hide();
|
wrapper.hide();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// removing or hiding parts
|
// removing or hiding parts
|
||||||
$('#page-parts .nav a:not(.enabled)').each(function() {
|
$('#page-parts .nav a:not(.enabled)').each(function() {
|
||||||
var index = parseInt($(this).attr('class').match(/part-(.+)/)[1]) + 1;
|
var index = parseInt($(this).attr('class').match(/part-(.+)/)[1]) + 1;
|
||||||
var wrapper = $('#parts-' + index);
|
var wrapper = $('#parts-' + index);
|
||||||
if (wrapper.hasClass('new')) {
|
if (wrapper.hasClass('new')) {
|
||||||
$(this).remove(); wrapper.remove();
|
$(this).remove(); wrapper.remove();
|
||||||
} else {
|
} else {
|
||||||
wrapper.find('input.disabled').val('true');
|
wrapper.find('input.disabled').val('true');
|
||||||
$(this).hide(); wrapper.hide();
|
$(this).hide(); wrapper.hide();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// go to the first one if we hid the selected wrapper
|
// go to the first one if we hide the selected wrapper
|
||||||
var selectedNav = $('#page-parts .nav a.on');
|
var selectedNav = $('#page-parts .nav a.on');
|
||||||
if (selectedNav.size() == 1) {
|
if (selectedNav.size() == 1) {
|
||||||
var index = parseInt(selectedNav.attr('class').match(/part-(.+)/)[1]) + 1;
|
var index = parseInt(selectedNav.attr('class').match(/part-(.+)/)[1]) + 1;
|
||||||
if ($('#parts-' + index + ':visible').size() == 0)
|
if ($('#parts-' + index + ':visible').size() == 0)
|
||||||
$('#page-parts .nav a:first').click();
|
$('#page-parts .nav a:first').click();
|
||||||
} else
|
} else
|
||||||
$('#page-parts .nav a:first').click();
|
$('#page-parts .nav a:first').click();
|
||||||
}
|
}
|
||||||
|
|
||||||
var loadPartsFromLayout = function() {
|
var loadPartsFromLayout = function() {
|
||||||
if ($('#page_layout_id').val() == '')
|
if ($('#page_layout_id').val() == '')
|
||||||
return ;
|
return ;
|
||||||
|
|
||||||
var url = $('#page_layout_id').attr('data_url').replace('_id_to_replace_', $('#page_layout_id').val());
|
var url = $('#page_layout_id').attr('data_url').replace('_id_to_replace_', $('#page_layout_id').val());
|
||||||
$.get(url, '', function(data) { refreshParts(data.parts); }, 'json');
|
$.get(url, '', function(data) { refreshParts(data); }, 'json');
|
||||||
}
|
}
|
||||||
|
|
||||||
$('#page_layout_id').change(loadPartsFromLayout);
|
$('#page_layout_id').change(loadPartsFromLayout);
|
||||||
|
|
||||||
});
|
});
|
Loading…
Reference in New Issue
Block a user