radiant-predefined_parts-extension 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +10 -0
- data/Rakefile +120 -0
- data/app/views/admin/pages/_predefined_parts_includes.html.erb +52 -0
- data/lib/radiant-predefined_parts-extension.rb +2 -0
- data/lib/radiant-predefined_parts-extension/version.rb +3 -0
- data/lib/tasks/predefined_parts_extension_tasks.rake +28 -0
- data/predefined_parts_extension.rb +13 -0
- data/public/images/admin/arrow_down.gif +0 -0
- data/public/javascripts/admin/combobox.js +97 -0
- data/radiant-predefined_parts-extension.gemspec +24 -0
- metadata +77 -0
data/README.rdoc
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
= Predefined Parts Extension
|
2
|
+
|
3
|
+
This extension overrides the default add-part popup to give the user a dropdown list of predefined parts, as well as allow him to add their own.
|
4
|
+
|
5
|
+
== Installation
|
6
|
+
|
7
|
+
To install this plugin get the source from github in your `vendor/extensions`. Then run the update `rake` task:
|
8
|
+
rake radiant:extensions:predefined_parts:update
|
9
|
+
|
10
|
+
Which will copy all required files to your public directory.
|
data/Rakefile
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
# I think this is the one that should be moved to the extension Rakefile template
|
2
|
+
|
3
|
+
# In rails 1.2, plugins aren't available in the path until they're loaded.
|
4
|
+
# Check to see if the rspec plugin is installed first and require
|
5
|
+
# it if it is. If not, use the gem version.
|
6
|
+
|
7
|
+
# Determine where the RSpec plugin is by loading the boot
|
8
|
+
unless defined? RADIANT_ROOT
|
9
|
+
ENV["RAILS_ENV"] = "test"
|
10
|
+
case
|
11
|
+
when ENV["RADIANT_ENV_FILE"]
|
12
|
+
require File.dirname(ENV["RADIANT_ENV_FILE"]) + "/boot"
|
13
|
+
when File.dirname(__FILE__) =~ %r{vendor/radiant/vendor/extensions}
|
14
|
+
require "#{File.expand_path(File.dirname(__FILE__) + "/../../../../../")}/config/boot"
|
15
|
+
else
|
16
|
+
require "#{File.expand_path(File.dirname(__FILE__) + "/../../../")}/config/boot"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'rake'
|
21
|
+
require 'rake/rdoctask'
|
22
|
+
require 'rake/testtask'
|
23
|
+
|
24
|
+
rspec_base = File.expand_path(RADIANT_ROOT + '/vendor/plugins/rspec/lib')
|
25
|
+
$LOAD_PATH.unshift(rspec_base) if File.exist?(rspec_base)
|
26
|
+
require 'spec/rake/spectask'
|
27
|
+
# require 'spec/translator'
|
28
|
+
|
29
|
+
# Cleanup the RADIANT_ROOT constant so specs will load the environment
|
30
|
+
Object.send(:remove_const, :RADIANT_ROOT)
|
31
|
+
|
32
|
+
extension_root = File.expand_path(File.dirname(__FILE__))
|
33
|
+
|
34
|
+
task :default => :spec
|
35
|
+
task :stats => "spec:statsetup"
|
36
|
+
|
37
|
+
desc "Run all specs in spec directory"
|
38
|
+
Spec::Rake::SpecTask.new(:spec) do |t|
|
39
|
+
t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
|
40
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
41
|
+
end
|
42
|
+
|
43
|
+
namespace :spec do
|
44
|
+
desc "Run all specs in spec directory with RCov"
|
45
|
+
Spec::Rake::SpecTask.new(:rcov) do |t|
|
46
|
+
t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
|
47
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
48
|
+
t.rcov = true
|
49
|
+
t.rcov_opts = ['--exclude', 'spec', '--rails']
|
50
|
+
end
|
51
|
+
|
52
|
+
desc "Print Specdoc for all specs"
|
53
|
+
Spec::Rake::SpecTask.new(:doc) do |t|
|
54
|
+
t.spec_opts = ["--format", "specdoc", "--dry-run"]
|
55
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
56
|
+
end
|
57
|
+
|
58
|
+
[:models, :controllers, :views, :helpers].each do |sub|
|
59
|
+
desc "Run the specs under spec/#{sub}"
|
60
|
+
Spec::Rake::SpecTask.new(sub) do |t|
|
61
|
+
t.spec_opts = ['--options', "\"#{extension_root}/spec/spec.opts\""]
|
62
|
+
t.spec_files = FileList["spec/#{sub}/**/*_spec.rb"]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Hopefully no one has written their extensions in pre-0.9 style
|
67
|
+
# desc "Translate specs from pre-0.9 to 0.9 style"
|
68
|
+
# task :translate do
|
69
|
+
# translator = ::Spec::Translator.new
|
70
|
+
# dir = RAILS_ROOT + '/spec'
|
71
|
+
# translator.translate(dir, dir)
|
72
|
+
# end
|
73
|
+
|
74
|
+
# Setup specs for stats
|
75
|
+
task :statsetup do
|
76
|
+
require 'code_statistics'
|
77
|
+
::STATS_DIRECTORIES << %w(Model\ specs spec/models)
|
78
|
+
::STATS_DIRECTORIES << %w(View\ specs spec/views)
|
79
|
+
::STATS_DIRECTORIES << %w(Controller\ specs spec/controllers)
|
80
|
+
::STATS_DIRECTORIES << %w(Helper\ specs spec/views)
|
81
|
+
::CodeStatistics::TEST_TYPES << "Model specs"
|
82
|
+
::CodeStatistics::TEST_TYPES << "View specs"
|
83
|
+
::CodeStatistics::TEST_TYPES << "Controller specs"
|
84
|
+
::CodeStatistics::TEST_TYPES << "Helper specs"
|
85
|
+
::STATS_DIRECTORIES.delete_if {|a| a[0] =~ /test/}
|
86
|
+
end
|
87
|
+
|
88
|
+
namespace :db do
|
89
|
+
namespace :fixtures do
|
90
|
+
desc "Load fixtures (from spec/fixtures) into the current environment's database. Load specific fixtures using FIXTURES=x,y"
|
91
|
+
task :load => :environment do
|
92
|
+
require 'active_record/fixtures'
|
93
|
+
ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
|
94
|
+
(ENV['FIXTURES'] ? ENV['FIXTURES'].split(/,/) : Dir.glob(File.join(RAILS_ROOT, 'spec', 'fixtures', '*.{yml,csv}'))).each do |fixture_file|
|
95
|
+
Fixtures.create_fixtures('spec/fixtures', File.basename(fixture_file, '.*'))
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
desc 'Generate documentation for the predefined_parts extension.'
|
103
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
104
|
+
rdoc.rdoc_dir = 'rdoc'
|
105
|
+
rdoc.title = 'PredefinedPartsExtension'
|
106
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
107
|
+
rdoc.rdoc_files.include('README')
|
108
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
109
|
+
end
|
110
|
+
|
111
|
+
# For extensions that are in transition
|
112
|
+
desc 'Test the predefined_parts extension.'
|
113
|
+
Rake::TestTask.new(:test) do |t|
|
114
|
+
t.libs << 'lib'
|
115
|
+
t.pattern = 'test/**/*_test.rb'
|
116
|
+
t.verbose = true
|
117
|
+
end
|
118
|
+
|
119
|
+
# Load any custom rakefiles for extension
|
120
|
+
Dir[File.dirname(__FILE__) + '/tasks/*.rake'].sort.each { |f| require f }
|
@@ -0,0 +1,52 @@
|
|
1
|
+
<%
|
2
|
+
include_javascript 'admin/controls'
|
3
|
+
include_javascript 'admin/combobox'
|
4
|
+
%>
|
5
|
+
|
6
|
+
<% content_for :page_scripts do %>
|
7
|
+
document.observe('dom:loaded', function() {
|
8
|
+
if (popup = $('add_part_popup')) {
|
9
|
+
var predefined_parts = <%= Radiant::Config['predefined_parts.parts'].to_s.inspect %>.split(/\s*,\s*/)
|
10
|
+
var field_container = popup.select('p').first();
|
11
|
+
field_container.writeAttribute('id', 'parts_field');
|
12
|
+
field_container.insert({after: "<div id='parts_results'></div>"})
|
13
|
+
|
14
|
+
new ComboBox('parts_field', 'parts_results', predefined_parts)
|
15
|
+
}
|
16
|
+
})
|
17
|
+
<% end %>
|
18
|
+
|
19
|
+
<% content_for :page_css do %>
|
20
|
+
#parts_results ul {
|
21
|
+
margin: 0;
|
22
|
+
padding: 0;
|
23
|
+
list-style-type: none;
|
24
|
+
border: 1px solid #666;
|
25
|
+
}
|
26
|
+
|
27
|
+
#parts_results li {
|
28
|
+
list-style-type: none;
|
29
|
+
margin: 0;
|
30
|
+
padding: 0 4px;
|
31
|
+
background-color: white;
|
32
|
+
}
|
33
|
+
|
34
|
+
* html #parts_results ul {
|
35
|
+
position: relative;
|
36
|
+
height: 1%;
|
37
|
+
}
|
38
|
+
|
39
|
+
|
40
|
+
#parts_results li.selected {
|
41
|
+
color: #fff;
|
42
|
+
background: #004376;
|
43
|
+
}
|
44
|
+
|
45
|
+
#parts_field input {
|
46
|
+
width: 200px;
|
47
|
+
}
|
48
|
+
|
49
|
+
#popups .popup {
|
50
|
+
z-index: 5000;
|
51
|
+
}
|
52
|
+
<% end %>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
namespace :radiant do
|
2
|
+
namespace :extensions do
|
3
|
+
namespace :predefined_parts do
|
4
|
+
|
5
|
+
desc "Runs the migration of the Predefined Parts extension"
|
6
|
+
task :migrate => :environment do
|
7
|
+
require 'radiant/extension_migrator'
|
8
|
+
if ENV["VERSION"]
|
9
|
+
PredefinedPartsExtension.migrator.migrate(ENV["VERSION"].to_i)
|
10
|
+
else
|
11
|
+
PredefinedPartsExtension.migrator.migrate
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "Copies public assets of the Predefined Parts to the instance public/ directory."
|
16
|
+
task :update => :environment do
|
17
|
+
is_svn_or_dir = proc {|path| path =~ /\.svn/ || File.directory?(path) }
|
18
|
+
puts "Copying assets from PredefinedPartsExtension"
|
19
|
+
Dir[PredefinedPartsExtension.root + "/public/**/*"].reject(&is_svn_or_dir).each do |file|
|
20
|
+
path = file.sub(PredefinedPartsExtension.root, '')
|
21
|
+
directory = File.dirname(path)
|
22
|
+
mkdir_p RAILS_ROOT + directory
|
23
|
+
cp file, RAILS_ROOT + path
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'radiant-predefined_parts-extension/version'
|
2
|
+
class PredefinedPartsExtension < Radiant::Extension
|
3
|
+
version RadiantPredefinedPartsExtension::VERSION
|
4
|
+
description "Have a list of predefined parts to select from"
|
5
|
+
url "http://github.com/jomz/radiant-predefined-parts-extension"
|
6
|
+
|
7
|
+
def activate
|
8
|
+
Radiant::Config['predefined_parts.parts'] ||= 'body, content-sec, video' if Radiant::Config.table_exists?
|
9
|
+
|
10
|
+
admin.page.edit.add :main, 'predefined_parts_includes', :before => 'edit_header'
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
Binary file
|
@@ -0,0 +1,97 @@
|
|
1
|
+
var ComboBox = Class.create();
|
2
|
+
|
3
|
+
ComboBox.Autocompleter = Autocompleter.Local;
|
4
|
+
|
5
|
+
ComboBox.Autocompleter.prototype.onBlur = function(event) {
|
6
|
+
if (Element.getStyle(this.update, 'display') == 'none') { return; }
|
7
|
+
setTimeout(this.hide.bind(this), 250);
|
8
|
+
this.hasFocus = false;
|
9
|
+
this.active = false;
|
10
|
+
}
|
11
|
+
|
12
|
+
|
13
|
+
ComboBox.prototype = {
|
14
|
+
initialize: function(textElement, resultsElement, array, options) {
|
15
|
+
this.textElement = $(textElement);
|
16
|
+
|
17
|
+
// the first text box inside the container
|
18
|
+
this.textBox = $A( this.textElement.getElementsByTagName('INPUT') ).findAll( function(input) {
|
19
|
+
return (input.getAttribute('type') == 'text');
|
20
|
+
})[0];
|
21
|
+
|
22
|
+
this.results = $(resultsElement);
|
23
|
+
this.textBox.paddingRight = '20px';
|
24
|
+
this.textElement.style.width = (this.textBox.offsetWidth) + 'px';
|
25
|
+
this.textElement.style.position = 'relative';
|
26
|
+
|
27
|
+
// we dynamically insert a SPAN that will serve as the drop-down 'arrow'
|
28
|
+
this.arrow = new Element('span');
|
29
|
+
Object.extend(this.arrow.style, {
|
30
|
+
cursor: 'default',
|
31
|
+
color: '#000',
|
32
|
+
width: '20px',
|
33
|
+
position: 'absolute',
|
34
|
+
top: '0',
|
35
|
+
right: '0px',
|
36
|
+
textAlign: 'center',
|
37
|
+
fontSize: 'small',
|
38
|
+
height: (this.textElement.offsetHeight - 1) + 'px'
|
39
|
+
});
|
40
|
+
|
41
|
+
if (document.all) {
|
42
|
+
this.arrow.setStyle({ padding: '2px 0 0 3px', width: '18px', height: '17px'});
|
43
|
+
|
44
|
+
}
|
45
|
+
this.arrow.innerHTML = '<img src="/images/admin/arrow_down.gif" style="margin-top: 9px"/>';
|
46
|
+
this.textElement.appendChild(this.arrow);
|
47
|
+
this.array = array;
|
48
|
+
|
49
|
+
this.results.style.display = 'none';
|
50
|
+
|
51
|
+
this.events = {
|
52
|
+
showChoices: this.showChoices.bindAsEventListener(this),
|
53
|
+
hideChoices: this.hideChoices.bindAsEventListener(this),
|
54
|
+
click: this.click.bindAsEventListener(this),
|
55
|
+
keyDown: this.keyDown.bindAsEventListener(this)
|
56
|
+
}
|
57
|
+
|
58
|
+
this.autocompleter = new ComboBox.Autocompleter(this.textBox, this.results, this.array, options);
|
59
|
+
|
60
|
+
Event.observe(this.arrow, 'click', this.events.click);
|
61
|
+
Event.observe(this.textBox, 'keydown', this.events.keyDown);
|
62
|
+
},
|
63
|
+
|
64
|
+
getAllChoices: function(e) {
|
65
|
+
var choices = this.array.collect( function(choice) { return '<li>' + choice + '</li>'; } );
|
66
|
+
var html = '<ul>' + choices.join('') + '</ul>';
|
67
|
+
this.autocompleter.updateChoices(html);
|
68
|
+
},
|
69
|
+
|
70
|
+
keyDown: function(e) {
|
71
|
+
if (e.keyCode == Event.KEY_DOWN && this.choicesVisible() ) {
|
72
|
+
this.showChoices();
|
73
|
+
}
|
74
|
+
},
|
75
|
+
|
76
|
+
// returns boolean indicating whether the choices are displayed
|
77
|
+
choicesVisible: function() { return (Element.getStyle(this.autocompleter.update, 'display') == 'none'); },
|
78
|
+
|
79
|
+
click: function() {
|
80
|
+
if (this.choicesVisible() ) {
|
81
|
+
this.showChoices();
|
82
|
+
} else {
|
83
|
+
this.hideChoices();
|
84
|
+
}
|
85
|
+
},
|
86
|
+
|
87
|
+
showChoices: function() {
|
88
|
+
this.textBox.focus();
|
89
|
+
this.autocompleter.changed = false;
|
90
|
+
this.autocompleter.hasFocus = true;
|
91
|
+
this.getAllChoices();
|
92
|
+
},
|
93
|
+
|
94
|
+
hideChoices: function() {
|
95
|
+
this.autocompleter.onBlur();
|
96
|
+
}
|
97
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "radiant-predefined_parts-extension/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "radiant-predefined_parts-extension"
|
7
|
+
s.version = RadiantPredefinedPartsExtension::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Benny Degezelle"]
|
10
|
+
s.email = ["benny@gorilla-webdesign.be"]
|
11
|
+
s.homepage = "http://github.com/jomz/radiant-predefined_parts-extension"
|
12
|
+
s.summary = %q{Predefined Parts for Radiant CMS}
|
13
|
+
s.description = %q{Suggests a configurable list of page part names when adding a page part}
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
s.post_install_message = %{
|
21
|
+
Add this to your radiant project with:
|
22
|
+
config.gem 'radiant-predefined_parts-extension', :version => '#{RadiantPredefinedPartsExtension::VERSION}'
|
23
|
+
}
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: radiant-predefined_parts-extension
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 19
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 1.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Benny Degezelle
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-06-12 00:00:00 +02:00
|
19
|
+
default_executable:
|
20
|
+
dependencies: []
|
21
|
+
|
22
|
+
description: Suggests a configurable list of page part names when adding a page part
|
23
|
+
email:
|
24
|
+
- benny@gorilla-webdesign.be
|
25
|
+
executables: []
|
26
|
+
|
27
|
+
extensions: []
|
28
|
+
|
29
|
+
extra_rdoc_files: []
|
30
|
+
|
31
|
+
files:
|
32
|
+
- README.rdoc
|
33
|
+
- Rakefile
|
34
|
+
- app/views/admin/pages/_predefined_parts_includes.html.erb
|
35
|
+
- lib/radiant-predefined_parts-extension.rb
|
36
|
+
- lib/radiant-predefined_parts-extension/version.rb
|
37
|
+
- lib/tasks/predefined_parts_extension_tasks.rake
|
38
|
+
- predefined_parts_extension.rb
|
39
|
+
- public/images/admin/arrow_down.gif
|
40
|
+
- public/javascripts/admin/combobox.js
|
41
|
+
- radiant-predefined_parts-extension.gemspec
|
42
|
+
has_rdoc: true
|
43
|
+
homepage: http://github.com/jomz/radiant-predefined_parts-extension
|
44
|
+
licenses: []
|
45
|
+
|
46
|
+
post_install_message: "\n Add this to your radiant project with:\n config.gem 'radiant-predefined_parts-extension', :version => '1.1.0'\n "
|
47
|
+
rdoc_options: []
|
48
|
+
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
hash: 3
|
57
|
+
segments:
|
58
|
+
- 0
|
59
|
+
version: "0"
|
60
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ">="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
hash: 3
|
66
|
+
segments:
|
67
|
+
- 0
|
68
|
+
version: "0"
|
69
|
+
requirements: []
|
70
|
+
|
71
|
+
rubyforge_project:
|
72
|
+
rubygems_version: 1.3.7
|
73
|
+
signing_key:
|
74
|
+
specification_version: 3
|
75
|
+
summary: Predefined Parts for Radiant CMS
|
76
|
+
test_files: []
|
77
|
+
|