sunrise-scaffold 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +8 -0
- data/Rakefile +44 -0
- data/lib/generators/sunrise_scaffold/USAGE +6 -0
- data/lib/generators/sunrise_scaffold/manage_generator.rb +112 -0
- data/lib/generators/sunrise_scaffold/templates/multiplay/controller.rb +36 -0
- data/lib/generators/sunrise_scaffold/templates/multiplay/functional_test.rb +103 -0
- data/lib/generators/sunrise_scaffold/templates/multiplay/helper.rb +2 -0
- data/lib/generators/sunrise_scaffold/templates/multiplay/views/edit.html.erb +6 -0
- data/lib/generators/sunrise_scaffold/templates/multiplay/views/form.html.erb +29 -0
- data/lib/generators/sunrise_scaffold/templates/multiplay/views/index.html.erb +32 -0
- data/lib/generators/sunrise_scaffold/templates/multiplay/views/item.html.erb +27 -0
- data/lib/generators/sunrise_scaffold/templates/multiplay/views/model_filter.html.erb +31 -0
- data/lib/generators/sunrise_scaffold/templates/multiplay/views/new.html.erb +6 -0
- data/lib/generators/sunrise_scaffold/templates/multiplay/views/show.html.erb +17 -0
- data/lib/generators/sunrise_scaffold/templates/single/controller.rb +31 -0
- data/lib/generators/sunrise_scaffold/templates/single/functional_test.rb +98 -0
- data/lib/generators/sunrise_scaffold/templates/single/helper.rb +2 -0
- data/lib/generators/sunrise_scaffold/templates/single/views/edit.html.erb +6 -0
- data/lib/generators/sunrise_scaffold/templates/single/views/form.html.erb +29 -0
- data/lib/generators/sunrise_scaffold/templates/single/views/index.html.erb +30 -0
- data/lib/generators/sunrise_scaffold/templates/single/views/item.html.erb +27 -0
- data/lib/generators/sunrise_scaffold/templates/single/views/model_filter.html.erb +31 -0
- data/lib/generators/sunrise_scaffold/templates/single/views/new.html.erb +6 -0
- data/lib/generators/sunrise_scaffold/templates/single/views/show.html.erb +17 -0
- data/lib/sunrise_scaffold.rb +5 -0
- data/lib/sunrise_scaffold/utils.rb +46 -0
- data/lib/sunrise_scaffold/version.rb +4 -0
- metadata +94 -0
data/README.rdoc
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
= SunRise CMS scaffold
|
2
|
+
|
3
|
+
== USAGE
|
4
|
+
|
5
|
+
# before this, you must generate model (rails g model model_name) and create it in db (rake db:migrate)
|
6
|
+
rails generate sunrise_scaffold:manage model_name
|
7
|
+
|
8
|
+
rails generate sunrise_scaffold:manage model_name --parent=parent_model
|
data/Rakefile
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/testtask'
|
4
|
+
require 'rake/rdoctask'
|
5
|
+
require File.join(File.dirname(__FILE__), 'lib', 'sunrise_scaffold', 'version')
|
6
|
+
|
7
|
+
desc 'Default: run unit tests.'
|
8
|
+
task :default => :test
|
9
|
+
|
10
|
+
desc 'Test the sunrise plugin.'
|
11
|
+
Rake::TestTask.new(:test) do |t|
|
12
|
+
t.libs << 'lib'
|
13
|
+
t.libs << 'test'
|
14
|
+
t.pattern = 'test/**/*_test.rb'
|
15
|
+
t.verbose = true
|
16
|
+
end
|
17
|
+
|
18
|
+
desc 'Generate documentation for the sunrise plugin.'
|
19
|
+
Rake::RDocTask.new(:rdoc) do |rdoc|
|
20
|
+
rdoc.rdoc_dir = 'rdoc'
|
21
|
+
rdoc.title = 'Sunrise Scaffold'
|
22
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
23
|
+
rdoc.rdoc_files.include('README')
|
24
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
25
|
+
end
|
26
|
+
|
27
|
+
begin
|
28
|
+
require 'jeweler'
|
29
|
+
Jeweler::Tasks.new do |s|
|
30
|
+
s.name = "sunrise-scaffold"
|
31
|
+
s.version = SunriseScaffold::VERSION.dup
|
32
|
+
s.summary = "Rails CMS"
|
33
|
+
s.description = "Sunrise is a Aimbulance CMS"
|
34
|
+
s.email = "galeta.igor@gmail.com"
|
35
|
+
s.homepage = "https://github.com/galetahub/sunrise-scaffold"
|
36
|
+
s.authors = ["Igor Galeta", "Pavlo Galeta"]
|
37
|
+
s.files = FileList["[A-Z]*", "lib/**/*"]
|
38
|
+
s.extra_rdoc_files = FileList["[A-Z]*"] - %w(Gemfile Rakefile)
|
39
|
+
end
|
40
|
+
|
41
|
+
Jeweler::GemcutterTasks.new
|
42
|
+
rescue LoadError
|
43
|
+
puts "Jeweler not available. Install it with: gem install jeweler"
|
44
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'sunrise_scaffold/utils'
|
3
|
+
|
4
|
+
module SunriseScaffold
|
5
|
+
class ManageGenerator < Rails::Generators::NamedBase
|
6
|
+
check_class_collision :suffix => "Controller"
|
7
|
+
|
8
|
+
class_option :parent, :type => :string, :default => nil,
|
9
|
+
:desc => "Parent model"
|
10
|
+
|
11
|
+
def self.source_root
|
12
|
+
@source_root ||= File.expand_path(File.join(File.dirname(__FILE__), "/templates"))
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_controller_files
|
16
|
+
template "#{generator_dir}/controller.rb",
|
17
|
+
File.join('app/controllers', manage_path, "#{controller_file_name}_controller.rb")
|
18
|
+
|
19
|
+
template "#{generator_dir}/helper.rb",
|
20
|
+
File.join('app/helpers', manage_path, "#{controller_file_name}_helper.rb")
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_tests_files
|
24
|
+
template "#{generator_dir}/functional_test.rb",
|
25
|
+
File.join('test/functional', manage_path, "#{controller_file_name}_controller_test.rb")
|
26
|
+
end
|
27
|
+
|
28
|
+
def create_views_files
|
29
|
+
# model form
|
30
|
+
template "#{generator_dir}/views/form.html.erb",
|
31
|
+
File.join('app/views', manage_path, controller_file_name, "_form.html.erb")
|
32
|
+
|
33
|
+
# search filter
|
34
|
+
template "#{generator_dir}/views/model_filter.html.erb",
|
35
|
+
File.join('app/views', manage_path, controller_file_name, "_model_filter.html.erb")
|
36
|
+
|
37
|
+
# collection view partial
|
38
|
+
template "#{generator_dir}/views/item.html.erb",
|
39
|
+
File.join('app/views', manage_path, controller_file_name, "_#{singular_name}.html.erb")
|
40
|
+
|
41
|
+
# other templates
|
42
|
+
[:index, :new, :edit, :show].each do |action|
|
43
|
+
template "#{generator_dir}/views/#{action}.html.erb",
|
44
|
+
File.join('app/views', manage_path, controller_file_name, "#{action}.html.erb")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
protected
|
49
|
+
|
50
|
+
def manage_path
|
51
|
+
"manage"
|
52
|
+
end
|
53
|
+
|
54
|
+
def klass
|
55
|
+
# First priority is the namespaced modek, e.g. User::Group
|
56
|
+
@klass ||= begin
|
57
|
+
namespaced_class = name.singularize
|
58
|
+
namespaced_class.constantize
|
59
|
+
rescue NameError
|
60
|
+
nil
|
61
|
+
end
|
62
|
+
|
63
|
+
# Second priority the camelcased c, i.e. UserGroup
|
64
|
+
@klass ||= begin
|
65
|
+
camelcased_class = name.gsub('::', '').singularize
|
66
|
+
camelcased_class.constantize
|
67
|
+
rescue NameError
|
68
|
+
nil
|
69
|
+
end
|
70
|
+
|
71
|
+
@klass ||= model_name.constantize
|
72
|
+
|
73
|
+
@klass
|
74
|
+
end
|
75
|
+
|
76
|
+
def model
|
77
|
+
@model ||= klass.new
|
78
|
+
end
|
79
|
+
|
80
|
+
def model_name
|
81
|
+
@model_name ||= name.camelize
|
82
|
+
@model_name
|
83
|
+
end
|
84
|
+
|
85
|
+
def controller_class_name
|
86
|
+
@controller_class_name ||= name.pluralize.camelize
|
87
|
+
end
|
88
|
+
|
89
|
+
def controller_file_name
|
90
|
+
@controller_file_name ||= file_name.pluralize
|
91
|
+
end
|
92
|
+
|
93
|
+
def generator_dir
|
94
|
+
options[:parent] ? "multiplay" : "single"
|
95
|
+
end
|
96
|
+
|
97
|
+
def parent_class_name
|
98
|
+
@parent_class_name ||= parent_singular_name.camelize
|
99
|
+
@parent_class_name
|
100
|
+
end
|
101
|
+
|
102
|
+
def parent_singular_name
|
103
|
+
@parent_singular_name ||= options[:parent].singularize
|
104
|
+
@parent_singular_name
|
105
|
+
end
|
106
|
+
|
107
|
+
def translated_columns
|
108
|
+
@translated_columns ||= klass.translated_attribute_names if klass.respond_to?(:translated_attribute_names)
|
109
|
+
@translated_columns ||= []
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class Manage::<%= controller_class_name %>Controller < Manage::BaseController
|
2
|
+
inherit_resources
|
3
|
+
defaults :route_prefix => 'manage'
|
4
|
+
belongs_to :<%= parent_singular_name %>
|
5
|
+
|
6
|
+
before_filter :make_filter, :only=>[:index]
|
7
|
+
|
8
|
+
load_and_authorize_resource :<%= singular_name %>, :through => :<%= parent_singular_name %>
|
9
|
+
|
10
|
+
def create
|
11
|
+
create!{ manage_<%= parent_singular_name %>_<%= plural_name %>_path(@<%= parent_singular_name %>.id) }
|
12
|
+
end
|
13
|
+
|
14
|
+
def update
|
15
|
+
update!{ manage_<%= parent_singular_name %>_<%= plural_name %>_path(@<%= parent_singular_name %>.id) }
|
16
|
+
end
|
17
|
+
|
18
|
+
def destroy
|
19
|
+
destroy!{ manage_<%= parent_singular_name %>_<%= plural_name %>_path(@<%= parent_singular_name %>.id) }
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
|
24
|
+
def begin_of_association_chain
|
25
|
+
@<%= parent_singular_name %>
|
26
|
+
end
|
27
|
+
|
28
|
+
def collection
|
29
|
+
@<%= plural_name %> = (@<%= plural_name %> || end_of_association_chain).merge(@search.scoped).page(params[:page])
|
30
|
+
end
|
31
|
+
|
32
|
+
def make_filter
|
33
|
+
@search = Sunrise::ModelFilter.new(<%= model_name %>, :attributes=>[ <%= model.attributes.keys.map{ |a| ":#{a}" }.join(', ') %> ] )
|
34
|
+
@search.update_attributes(params[:search])
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Manage::<%= controller_class_name %>ControllerTest < ActionController::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@admin = users(:admin)
|
7
|
+
@<%= parent_singular_name %> = <%= parent_class_name %>.find(:first)
|
8
|
+
end
|
9
|
+
|
10
|
+
test "index" do
|
11
|
+
get :index, {:<%= parent_singular_name %>_id => @<%= parent_singular_name %>.id }, {:user_id=>@admin.id}
|
12
|
+
|
13
|
+
assert_response :success
|
14
|
+
assert_not_nil assigns(:<%= plural_name %>)
|
15
|
+
end
|
16
|
+
|
17
|
+
test "new" do
|
18
|
+
get :new, {:<%= parent_singular_name %>_id => @<%= parent_singular_name %>.id }, {:user_id=>@admin.id}
|
19
|
+
|
20
|
+
assert_response :success
|
21
|
+
assert_not_nil assigns(:<%= singular_name %>)
|
22
|
+
assert assigns(:<%= singular_name %>).new_record?
|
23
|
+
end
|
24
|
+
|
25
|
+
test "should_create_<%= singular_name %>" do
|
26
|
+
assert_difference('<%= model_name %>.count') do
|
27
|
+
post :create, {:<%= singular_name %> => { :title => '<%= model_name %> test title'},
|
28
|
+
:<%= parent_singular_name %>_id => @<%= parent_singular_name %>.id},
|
29
|
+
{:user_id=>@admin.id}
|
30
|
+
end
|
31
|
+
|
32
|
+
assert assigns(:<%= singular_name %>).valid?
|
33
|
+
assert_equal assigns(:<%= singular_name %>).title, '<%= model_name %> test title'
|
34
|
+
|
35
|
+
assert_redirected_to manage_<%= parent_singular_name %>_<%= plural_name %>_path(@<%= parent_singular_name %>.id)
|
36
|
+
end
|
37
|
+
|
38
|
+
test "should_error_create_<%= singular_name %>" do
|
39
|
+
assert_no_difference('<%= model_name %>.count') do
|
40
|
+
post :create, {:<%= singular_name %> => { :title => nil},
|
41
|
+
:<%= parent_singular_name %>_id => @<%= parent_singular_name %>.id },
|
42
|
+
{:user_id=>@admin.id}
|
43
|
+
end
|
44
|
+
|
45
|
+
assert !assigns(:<%= singular_name %>).valid?
|
46
|
+
assert !assigns(:<%= singular_name %>).errors.empty?
|
47
|
+
assert assigns(:<%= singular_name %>).errors.on(:title)
|
48
|
+
|
49
|
+
assert_response :success
|
50
|
+
end
|
51
|
+
|
52
|
+
test "should_update_<%= singular_name %>" do
|
53
|
+
<%= singular_name %> = <%= model_name %>.create(:title=>'<%= model_name %> test title')
|
54
|
+
|
55
|
+
assert_no_difference('<%= model_name %>.count') do
|
56
|
+
put :update, {:id=><%= singular_name %>.id, :<%= singular_name %> => {
|
57
|
+
:title => '<%= model_name %> test title updated'},
|
58
|
+
:<%= parent_singular_name %>_id => @<%= parent_singular_name %>.id },
|
59
|
+
{:user_id=>@admin.id}
|
60
|
+
end
|
61
|
+
|
62
|
+
assert assigns(:<%= singular_name %>).valid?
|
63
|
+
assert_equal assigns(:<%= singular_name %>).title, '<%= model_name %> test title updated'
|
64
|
+
|
65
|
+
assert_redirected_to manage_<%= parent_singular_name %>_<%= plural_name %>_path(@<%= parent_singular_name %>.id)
|
66
|
+
end
|
67
|
+
|
68
|
+
test "should_error_update_<%= singular_name %>" do
|
69
|
+
<%= singular_name %> = <%= model_name %>.create(:title=>'<%= model_name %> test title')
|
70
|
+
|
71
|
+
assert_no_difference('<%= model_name %>.count') do
|
72
|
+
put :update, {:id=><%= singular_name %>.id, :<%= singular_name %> => { :title =>nil},
|
73
|
+
:<%= parent_singular_name %>_id => @<%= parent_singular_name %>.id },
|
74
|
+
{:user_id=>@admin.id}
|
75
|
+
end
|
76
|
+
|
77
|
+
assert !assigns(:<%= singular_name %>).valid?
|
78
|
+
assert !assigns(:<%= singular_name %>).errors.empty?
|
79
|
+
assert assigns(:<%= singular_name %>).errors.on(:title)
|
80
|
+
|
81
|
+
assert_response :success
|
82
|
+
end
|
83
|
+
|
84
|
+
test "should_destroy_<%= singular_name %>" do
|
85
|
+
<%= singular_name %> = <%= model_name %>.create(:title=>'<%= model_name %> test title')
|
86
|
+
|
87
|
+
assert_difference('<%= model_name %>.count', -1) do
|
88
|
+
delete :destroy, {:id=><%= singular_name %>.id, :<%= parent_singular_name %>_id => @<%= parent_singular_name %>.id }, {:user_id=>@admin.id}
|
89
|
+
end
|
90
|
+
|
91
|
+
assert_redirected_to manage_<%= parent_singular_name %>_<%= plural_name %>_path(@<%= parent_singular_name %>.id)
|
92
|
+
|
93
|
+
assert_raise(ActiveRecord::RecordNotFound) {
|
94
|
+
<%= model_name %>.find(<%= singular_name %>.id)
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
test "should_redirect_to_login" do
|
99
|
+
get :index
|
100
|
+
|
101
|
+
assert_redirected_to login_path
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<%%= manage_form_for [@<%= parent_singular_name %>, @<%= singular_name %>] do |f| %>
|
2
|
+
|
3
|
+
<% unless translated_columns.empty? -%>
|
4
|
+
<%%= render(:partial=>"manage/shared/locale") %>
|
5
|
+
|
6
|
+
<%% Sunrise.available_locales.each do |locale|%>
|
7
|
+
<%%= content_tag :div, :id=>"s#{locale}_block", :class=>"add-white-bl", :style=>(I18n.locale.to_s == locale.to_s ? nil : 'display:none;') do %>
|
8
|
+
<div class="bot-bg">
|
9
|
+
<div class="inputs-bl">
|
10
|
+
<% translated_columns.each do |attribute| -%>
|
11
|
+
<%%= f.input :<%= attribute%>, :locale => locale %>
|
12
|
+
<% end -%>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
<%% end -%>
|
16
|
+
<%% end -%>
|
17
|
+
<% end -%>
|
18
|
+
|
19
|
+
<div class="edit-cont">
|
20
|
+
<div class="inputs-bl">
|
21
|
+
<% model.attributes.each do |attribute, value| -%>
|
22
|
+
<% next if translated_columns.include?(attribute.to_sym) %>
|
23
|
+
<%%= f.input :<%= attribute%> %>
|
24
|
+
<% end -%>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
|
28
|
+
<%%= f.button :submit, :url => manage_<%= parent_singular_name %>_<%= plural_name %>_path(@<%= parent_singular_name %>.id) %>
|
29
|
+
<%% end %>
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<div class="duo-bl">
|
2
|
+
<div class="left-part">
|
3
|
+
<div class="content">
|
4
|
+
<div class="row-container">
|
5
|
+
<div class="white-row">
|
6
|
+
<div class="r-corn">
|
7
|
+
<%%= link_to t('manage.menu.<%= plural_name %>'), manage_<%= parent_singular_name %>_<%= plural_name %>_path(@<%= parent_singular_name %>.id), :class=>"dark-text" %>
|
8
|
+
<div class="act-bl">
|
9
|
+
<%%= link_to t('manage.add'), new_manage_<%= parent_singular_name %>_<%= singular_name %>_path(@<%= parent_singular_name %>.id), :class=>"create" %>
|
10
|
+
</div>
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
</div>
|
14
|
+
<div id="<%= plural_name %>" class="stage">
|
15
|
+
<%%= render :partial=>"manage/<%= plural_name %>/<%= singular_name %>", :collection=>@<%= plural_name %> %>
|
16
|
+
<%%= paginate @<%= plural_name %> %>
|
17
|
+
</div>
|
18
|
+
|
19
|
+
<script type='text/javascript'>
|
20
|
+
$(document).ready(function(){
|
21
|
+
Manage.init_collection('<%= plural_name %>', 'dinamic-bl');
|
22
|
+
});
|
23
|
+
</script>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
|
27
|
+
<div class="right-part">
|
28
|
+
<div class="filter-right">
|
29
|
+
<%%= render :partial=>"manage/<%= plural_name %>/model_filter" %>
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
</div>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<%%= content_tag(:div, :id=>dom_id(<%= singular_name %>), :class=>"dinamic-bl") do %>
|
2
|
+
<div class="act-bl" style="display:none;">
|
3
|
+
<%%= link_to image_tag("manage/ico_edit.gif", :alt=>t('manage.edit'), :title=>t('manage.edit')), edit_manage_<%= parent_singular_name %>_<%= singular_name %>_path(@<%= parent_singular_name %>.id, <%= singular_name %>.id), :class=>"icons" %>
|
4
|
+
|
5
|
+
<%%= link_to image_tag("manage/ico_del.gif", :alt=>t('manage.delete'), :title=>t('manage.delete')), manage_<%= parent_singular_name %>_<%= singular_name %>_path(@<%= parent_singular_name %>.id, <%= singular_name %>.id),
|
6
|
+
:method=>:delete, :confirm=>t("manage.confirm_delete"), :class=>"icons" %>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div class="bot-bg">
|
10
|
+
<div class="dinamic-container">
|
11
|
+
<div class="right-data">
|
12
|
+
<div class="right-data-cont">
|
13
|
+
<div class="dinamic-inner">
|
14
|
+
<div class="r-block">
|
15
|
+
<div class="r-block-cont">
|
16
|
+
<%%= link_to <%= singular_name %>.title, edit_manage_<%= parent_singular_name %>_<%= singular_name %>_path(@<%= parent_singular_name %>.id, <%= singular_name %>.id), :class=>"title" %>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
<div class="left-data">
|
23
|
+
<span class="data"><%%= raw I18n.l(<%= singular_name %>.created_at, :format=>"<span>%d/%m</span>%Y") %></span>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
<%% end %>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<div class="bot-bg">
|
2
|
+
<div class="filt-bl">
|
3
|
+
<%%= link_to_function t('manage.model_filter.title'), "Manage.toggle_element('block_filter')", :class=>"dark-arr" %>
|
4
|
+
|
5
|
+
<%%= cookie_content_tag(:div, :id=>"block_filter", :class=>"filt") do %>
|
6
|
+
<%%= form_for @search, :as => :search, :url=>manage_<%= parent_singular_name %>_<%= plural_name %>_path(@<%= parent_singular_name %>.id), :html=>{:method=>:get, :id=>"form_filter"} do |f| %>
|
7
|
+
<% model.attributes.each do |attribute, value| -%>
|
8
|
+
<%%= f.label :<%= attribute %>, t('activerecord.attributes.<%= singular_name %>.<%= attribute %>') %>
|
9
|
+
<%%= f.text_field :<%= attribute %>, :class=>"text" %>
|
10
|
+
<% end -%>
|
11
|
+
|
12
|
+
<div class="buts">
|
13
|
+
<%%= f.submit t('manage.model_filter.search'), :style=>"display:none;" %>
|
14
|
+
<%%= link_to_function content_tag(:span, t('manage.model_filter.search')), "$('#form_filter').submit()", :class=>"gr" %>
|
15
|
+
<%%= link_to t('manage.model_filter.clear'), manage_<%= parent_singular_name %>_<%= plural_name %>_path(@<%= parent_singular_name %>.id), :class=>"erase" %>
|
16
|
+
</div>
|
17
|
+
<%% end %>
|
18
|
+
<%% end %>
|
19
|
+
</div>
|
20
|
+
<div class="sort">
|
21
|
+
<label><%%= t('manage.sort') %></label>
|
22
|
+
<div class="select-input"><%%= link_to_function t("<%= plural_name %>.#{@search.order_column}_#{@search.order_type}", :scope => [:manage, :sort_columns], :default => :"#{@search.order_column}_#{@search.order_type}"), "SelectList.toggle(event)", :class=>"corn", :id=>'sort_select' %></div>
|
23
|
+
<div id='sort_select_list' class="select-list" style='display:none;'>
|
24
|
+
<% model.attributes.each do |attribute, value| -%>
|
25
|
+
<%%= link_to_sort(t('<%= plural_name %>.<%= attribute %>_desc', :scope => [:manage, :sort_columns], :default => :<%= attribute %>_desc), :name => <%= attribute.inspect %>, :order_type => 'desc') %>
|
26
|
+
<%%= link_to_sort(t('<%= plural_name %>.<%= attribute %>_asc', :scope => [:manage, :sort_columns], :default => :<%= attribute %>_asc), :name => <%= attribute.inspect %>, :order_type => 'asc') %>
|
27
|
+
<% end %>
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
|
31
|
+
</div>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<div class="edit-bl">
|
2
|
+
<div class="bot-bg">
|
3
|
+
<div class="block-title"><%%= @<%= singular_name %>.name %>:</div>
|
4
|
+
<div class="edit-cont">
|
5
|
+
<table border="0" cellspacing="0" cellpadding="0" class="page-info">
|
6
|
+
<tbody>
|
7
|
+
<%% @<%= singular_name %>.attributes.each do |attribute, value| %>
|
8
|
+
<tr>
|
9
|
+
<td><strong><%%= attribute %></strong></td>
|
10
|
+
<td><%%= value %></td>
|
11
|
+
</tr>
|
12
|
+
<%% end %>
|
13
|
+
</tbody>
|
14
|
+
</table>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
</div>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class Manage::<%= controller_class_name %>Controller < Manage::BaseController
|
2
|
+
inherit_resources
|
3
|
+
defaults :route_prefix => 'manage'
|
4
|
+
|
5
|
+
before_filter :make_filter, :only=>[:index]
|
6
|
+
|
7
|
+
load_and_authorize_resource :class => <%= class_name %>
|
8
|
+
|
9
|
+
def create
|
10
|
+
create!{ manage_<%= plural_name %>_path }
|
11
|
+
end
|
12
|
+
|
13
|
+
def update
|
14
|
+
update!{ manage_<%= plural_name %>_path }
|
15
|
+
end
|
16
|
+
|
17
|
+
def destroy
|
18
|
+
destroy!{ manage_<%= plural_name %>_path }
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
|
23
|
+
def collection
|
24
|
+
@<%= plural_name %> = (@<%= plural_name %> || end_of_association_chain).merge(@search.scoped).page(params[:page])
|
25
|
+
end
|
26
|
+
|
27
|
+
def make_filter
|
28
|
+
@search = Sunrise::ModelFilter.new(<%= class_name %>, :attributes=>[ <%= model.attributes.keys.map{ |a| ":#{a}" }.join(', ') %> ] )
|
29
|
+
@search.update_attributes(params[:search])
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Manage::<%= controller_class_name %>ControllerTest < ActionController::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
@admin = users(:admin)
|
7
|
+
end
|
8
|
+
|
9
|
+
test "index" do
|
10
|
+
get :index, nil, {:user_id=>@admin.id}
|
11
|
+
|
12
|
+
assert_response :success
|
13
|
+
assert_not_nil assigns(:<%= plural_name %>)
|
14
|
+
end
|
15
|
+
|
16
|
+
test "new" do
|
17
|
+
get :new, nil, {:user_id=>@admin.id}
|
18
|
+
|
19
|
+
assert_response :success
|
20
|
+
assert_not_nil assigns(:<%= singular_name %>)
|
21
|
+
assert assigns(:<%= singular_name %>).new_record?
|
22
|
+
end
|
23
|
+
|
24
|
+
test "should_create_<%= singular_name %>" do
|
25
|
+
assert_difference('<%= model_name %>.count') do
|
26
|
+
post :create, {:<%= singular_name %> => { :title => '<%= model_name %> test title'} },
|
27
|
+
{:user_id=>@admin.id}
|
28
|
+
end
|
29
|
+
|
30
|
+
assert assigns(:<%= singular_name %>).valid?
|
31
|
+
assert_equal assigns(:<%= singular_name %>).title, '<%= model_name %> test title'
|
32
|
+
|
33
|
+
assert_redirected_to manage_<%= plural_name %>_path
|
34
|
+
end
|
35
|
+
|
36
|
+
test "should_error_create_<%= singular_name %>" do
|
37
|
+
assert_no_difference('<%= model_name %>.count') do
|
38
|
+
post :create, {:<%= singular_name %> => { :title => nil} },
|
39
|
+
{:user_id=>@admin.id}
|
40
|
+
end
|
41
|
+
|
42
|
+
assert !assigns(:<%= singular_name %>).valid?
|
43
|
+
assert !assigns(:<%= singular_name %>).errors.empty?
|
44
|
+
assert assigns(:<%= singular_name %>).errors.on(:title)
|
45
|
+
|
46
|
+
assert_response :success
|
47
|
+
end
|
48
|
+
|
49
|
+
test "should_update_<%= singular_name %>" do
|
50
|
+
<%= singular_name %> = <%= model_name %>.create(:title=>'<%= model_name %> test title')
|
51
|
+
|
52
|
+
assert_no_difference('<%= model_name %>.count') do
|
53
|
+
put :update, {:id=><%= singular_name %>.id, :<%= singular_name %> => {
|
54
|
+
:title => '<%= model_name %> test title updated'} },
|
55
|
+
{:user_id=>@admin.id}
|
56
|
+
end
|
57
|
+
|
58
|
+
assert assigns(:<%= singular_name %>).valid?
|
59
|
+
assert_equal assigns(:<%= singular_name %>).title, '<%= model_name %> test title updated'
|
60
|
+
|
61
|
+
assert_redirected_to manage_<%= plural_name %>_path
|
62
|
+
end
|
63
|
+
|
64
|
+
test "should_error_update_<%= singular_name %>" do
|
65
|
+
<%= singular_name %> = <%= model_name %>.create(:title=>'<%= model_name %> test title')
|
66
|
+
|
67
|
+
assert_no_difference('<%= model_name %>.count') do
|
68
|
+
put :update, {:id=><%= singular_name %>.id, :<%= singular_name %> => { :title =>nil} },
|
69
|
+
{:user_id=>@admin.id}
|
70
|
+
end
|
71
|
+
|
72
|
+
assert !assigns(:<%= singular_name %>).valid?
|
73
|
+
assert !assigns(:<%= singular_name %>).errors.empty?
|
74
|
+
assert assigns(:<%= singular_name %>).errors.on(:title)
|
75
|
+
|
76
|
+
assert_response :success
|
77
|
+
end
|
78
|
+
|
79
|
+
test "should_destroy_<%= singular_name %>" do
|
80
|
+
<%= singular_name %> = <%= model_name %>.create(:title=>'<%= model_name %> test title')
|
81
|
+
|
82
|
+
assert_difference('<%= model_name %>.count', -1) do
|
83
|
+
delete :destroy, {:id=><%= singular_name %>.id}, {:user_id=>@admin.id}
|
84
|
+
end
|
85
|
+
|
86
|
+
assert_redirected_to manage_<%= plural_name %>_path
|
87
|
+
|
88
|
+
assert_raise(ActiveRecord::RecordNotFound) {
|
89
|
+
<%= model_name %>.find(<%= singular_name %>.id)
|
90
|
+
}
|
91
|
+
end
|
92
|
+
|
93
|
+
test "should_redirect_to_login" do
|
94
|
+
get :index
|
95
|
+
|
96
|
+
assert_redirected_to login_path
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<%%= manage_form_for @<%= singular_name %> do |f| %>
|
2
|
+
|
3
|
+
<% unless translated_columns.empty? -%>
|
4
|
+
<%%= render(:partial=>"manage/shared/locale") %>
|
5
|
+
|
6
|
+
<%% Sunrise.available_locales.each do |locale|%>
|
7
|
+
<%%= content_tag :div, :id=>"s#{locale}_block", :class=>"add-white-bl", :style=>(I18n.locale.to_s == locale.to_s ? nil : 'display:none;') do %>
|
8
|
+
<div class="bot-bg">
|
9
|
+
<div class="inputs-bl">
|
10
|
+
<% translated_columns.each do |attribute| -%>
|
11
|
+
<%%= f.input :<%= attribute%>, :locale => locale %>
|
12
|
+
<% end -%>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
<%% end -%>
|
16
|
+
<%% end -%>
|
17
|
+
<% end -%>
|
18
|
+
|
19
|
+
<div class="edit-cont">
|
20
|
+
<div class="inputs-bl">
|
21
|
+
<% model.attributes.each do |attribute, value| -%>
|
22
|
+
<% next if translated_columns.include?(attribute.to_sym) %>
|
23
|
+
<%%= f.input :<%= attribute%> %>
|
24
|
+
<% end -%>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
|
28
|
+
<%%= f.button :submit %>
|
29
|
+
<%% end %>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<div class="duo-bl">
|
2
|
+
<div class="left-part">
|
3
|
+
<div class="content">
|
4
|
+
<div class="row-container">
|
5
|
+
<div class="white-row">
|
6
|
+
<div class="r-corn">
|
7
|
+
<%%= link_to t('manage.menu.<%= plural_name %>'), manage_<%= plural_name %>_path, :class=>"dark-text" %>
|
8
|
+
<div class="act-bl">
|
9
|
+
<%%= link_to t('manage.add'), new_manage_<%= singular_name %>_path, :class=>"create" %>
|
10
|
+
</div>
|
11
|
+
</div>
|
12
|
+
</div>
|
13
|
+
</div>
|
14
|
+
<div id="<%= plural_name %>" class="stage">
|
15
|
+
<%%= render :partial=>"manage/<%= plural_name %>/<%= singular_name %>", :collection=>@<%= plural_name %> %>
|
16
|
+
<%%= paginate @<%= plural_name %> %>
|
17
|
+
</div>
|
18
|
+
<script type='text/javascript'>
|
19
|
+
$(document).ready(function(){
|
20
|
+
Manage.init_collection('<%= plural_name %>', 'dinamic-bl');
|
21
|
+
});
|
22
|
+
</script>
|
23
|
+
</div>
|
24
|
+
</div>
|
25
|
+
<div class="right-part">
|
26
|
+
<div class="filter-right">
|
27
|
+
<%%= render :partial=>"manage/<%= plural_name %>/model_filter" %>
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
</div>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<%%= content_tag(:div, :id=>dom_id(<%= singular_name %>), :class=>"dinamic-bl") do %>
|
2
|
+
<div class="act-bl" style="display:none;">
|
3
|
+
<%%= link_to image_tag("manage/ico_edit.gif", :alt=>t('manage.edit'), :title=>t('manage.edit')), edit_manage_<%= singular_name %>_path(:id=><%= singular_name %>.id), :class=>"icons" %>
|
4
|
+
|
5
|
+
<%%= link_to image_tag("manage/ico_del.gif", :alt=>t('manage.delete'), :title=>t('manage.delete')), manage_<%= singular_name %>_path(:id=><%= singular_name %>.id),
|
6
|
+
:method=>:delete, :confirm=>t("manage.confirm_delete"), :class=>"icons" %>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div class="bot-bg">
|
10
|
+
<div class="dinamic-container">
|
11
|
+
<div class="right-data">
|
12
|
+
<div class="right-data-cont">
|
13
|
+
<div class="dinamic-inner">
|
14
|
+
<div class="r-block">
|
15
|
+
<div class="r-block-cont">
|
16
|
+
<%%= link_to <%= singular_name %>.title, edit_manage_<%= singular_name %>_path(:id=><%= singular_name %>.id), :class=>"title" %>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
<div class="left-data">
|
23
|
+
<span class="data"><%%= raw I18n.l(<%= singular_name %>.created_at, :format=>"<span>%d/%m</span>%Y") %></span>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
<%% end %>
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<div class="bot-bg">
|
2
|
+
<div class="filt-bl">
|
3
|
+
<%%= link_to_function t('manage.model_filter.title'), "Manage.toggle_element('block_filter')", :class=>"dark-arr" %>
|
4
|
+
|
5
|
+
<%%= cookie_content_tag(:div, :id=>"block_filter", :class=>"filt") do %>
|
6
|
+
<%%= form_for @search, :as => :search, :url=>manage_<%= plural_name %>_path, :html=>{:method=>:get, :id=>"form_filter"} do |f| %>
|
7
|
+
<% model.attributes.each do |attribute, value| -%>
|
8
|
+
<%%= f.label :<%= attribute %>, t('<%= singular_name %>.<%= attribute %>', :scope => [:activerecord, :attributes]) %>
|
9
|
+
<%%= f.text_field :<%= attribute %>, :class=>"text" %>
|
10
|
+
<% end -%>
|
11
|
+
|
12
|
+
<div class="buts">
|
13
|
+
<%%= f.submit t('manage.model_filter.search'), :style=>"display:none;" %>
|
14
|
+
<%%= link_to_function content_tag(:span, t('manage.model_filter.search')), "$('#form_filter').submit()", :class=>"gr" %>
|
15
|
+
<%%= link_to t('manage.model_filter.clear'), manage_<%= plural_name %>_path, :class=>"erase" %>
|
16
|
+
</div>
|
17
|
+
<%% end %>
|
18
|
+
<%% end %>
|
19
|
+
</div>
|
20
|
+
<div class="sort">
|
21
|
+
<label><%%= t('manage.sort') %></label>
|
22
|
+
<div class="select-input"><%%= link_to_function t("<%= plural_name %>.#{@search.order_column}_#{@search.order_type}", :scope => [:manage, :sort_columns], :default => :"#{@search.order_column}_#{@search.order_type}"), "SelectList.toggle(event)", :class=>"corn", :id=>'sort_select' %></div>
|
23
|
+
<div id='sort_select_list' class="select-list" style='display:none;'>
|
24
|
+
<% model.attributes.each do |attribute, value| %>
|
25
|
+
<%%= link_to_sort(t('<%= plural_name %>.<%= attribute %>_desc', :scope => [:manage, :sort_columns], :default => :<%= attribute %>_desc), :name => <%= attribute.inspect %>, :order_type => 'desc') %>
|
26
|
+
<%%= link_to_sort(t('<%= plural_name %>.<%= attribute %>_asc', :scope => [:manage, :sort_columns], :default => :<%= attribute %>_asc), :name => <%= attribute.inspect %>, :order_type => 'asc') %>
|
27
|
+
<% end %>
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
|
31
|
+
</div>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<div class="edit-bl">
|
2
|
+
<div class="bot-bg">
|
3
|
+
<div class="block-title"><%%= @<%= singular_name %>.name %>:</div>
|
4
|
+
<div class="edit-cont">
|
5
|
+
<table border="0" cellspacing="0" cellpadding="0" class="page-info">
|
6
|
+
<tbody>
|
7
|
+
<%% @<%= singular_name %>.attributes.each do |attribute, value| %>
|
8
|
+
<tr>
|
9
|
+
<td><strong><%%= attribute %></strong></td>
|
10
|
+
<td><%%= value %></td>
|
11
|
+
</tr>
|
12
|
+
<%% end %>
|
13
|
+
</tbody>
|
14
|
+
</table>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
</div>
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module SunriseScaffold
|
3
|
+
class Utils
|
4
|
+
class << self
|
5
|
+
def parameterize_filename(filename)
|
6
|
+
extension = File.extname(filename)
|
7
|
+
basename = filename.gsub(/#{extension}$/, "")
|
8
|
+
|
9
|
+
[basename.parameterize('_'), extension].join.downcase
|
10
|
+
end
|
11
|
+
|
12
|
+
def form_field(form_name, field_name, column, options={})
|
13
|
+
field = case column.type
|
14
|
+
when :string, :binary, :integer, :float, :decimal then
|
15
|
+
options[:class] = "'text'"
|
16
|
+
"text_field"
|
17
|
+
when :boolean then "check_box"
|
18
|
+
when :datetime, :date, :timestamp, :time then
|
19
|
+
options[:extra_html] ||= "<script type='text/javascript'>
|
20
|
+
$(function() {
|
21
|
+
$('\##{form_name}_#{field_name}').datepicker({
|
22
|
+
numberOfMonths: 1,
|
23
|
+
dateFormat: 'dd.mm.yy'
|
24
|
+
});
|
25
|
+
});
|
26
|
+
</script>"
|
27
|
+
'text_field'
|
28
|
+
when :text then
|
29
|
+
options[:cols] ||= 70
|
30
|
+
options[:rows] ||= 5
|
31
|
+
"text_area"
|
32
|
+
end
|
33
|
+
|
34
|
+
extra_html = options.delete(:extra_html) || ''
|
35
|
+
|
36
|
+
options_fields = []
|
37
|
+
options.each { |k, v| options_fields << ":#{k}=>#{v}" }
|
38
|
+
|
39
|
+
options_str = ", {#{options_fields.join(', ')}}" unless options_fields.empty?
|
40
|
+
options_str ||= ''
|
41
|
+
|
42
|
+
"<%= #{form_name}.#{field} #{field_name}#{options_str} %>#{extra_html}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
metadata
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sunrise-scaffold
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Igor Galeta
|
14
|
+
- Pavlo Galeta
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2011-05-18 00:00:00 +03:00
|
20
|
+
default_executable:
|
21
|
+
dependencies: []
|
22
|
+
|
23
|
+
description: Sunrise is a Aimbulance CMS
|
24
|
+
email: galeta.igor@gmail.com
|
25
|
+
executables: []
|
26
|
+
|
27
|
+
extensions: []
|
28
|
+
|
29
|
+
extra_rdoc_files:
|
30
|
+
- README.rdoc
|
31
|
+
files:
|
32
|
+
- README.rdoc
|
33
|
+
- Rakefile
|
34
|
+
- lib/generators/sunrise_scaffold/USAGE
|
35
|
+
- lib/generators/sunrise_scaffold/manage_generator.rb
|
36
|
+
- lib/generators/sunrise_scaffold/templates/multiplay/controller.rb
|
37
|
+
- lib/generators/sunrise_scaffold/templates/multiplay/functional_test.rb
|
38
|
+
- lib/generators/sunrise_scaffold/templates/multiplay/helper.rb
|
39
|
+
- lib/generators/sunrise_scaffold/templates/multiplay/views/edit.html.erb
|
40
|
+
- lib/generators/sunrise_scaffold/templates/multiplay/views/form.html.erb
|
41
|
+
- lib/generators/sunrise_scaffold/templates/multiplay/views/index.html.erb
|
42
|
+
- lib/generators/sunrise_scaffold/templates/multiplay/views/item.html.erb
|
43
|
+
- lib/generators/sunrise_scaffold/templates/multiplay/views/model_filter.html.erb
|
44
|
+
- lib/generators/sunrise_scaffold/templates/multiplay/views/new.html.erb
|
45
|
+
- lib/generators/sunrise_scaffold/templates/multiplay/views/show.html.erb
|
46
|
+
- lib/generators/sunrise_scaffold/templates/single/controller.rb
|
47
|
+
- lib/generators/sunrise_scaffold/templates/single/functional_test.rb
|
48
|
+
- lib/generators/sunrise_scaffold/templates/single/helper.rb
|
49
|
+
- lib/generators/sunrise_scaffold/templates/single/views/edit.html.erb
|
50
|
+
- lib/generators/sunrise_scaffold/templates/single/views/form.html.erb
|
51
|
+
- lib/generators/sunrise_scaffold/templates/single/views/index.html.erb
|
52
|
+
- lib/generators/sunrise_scaffold/templates/single/views/item.html.erb
|
53
|
+
- lib/generators/sunrise_scaffold/templates/single/views/model_filter.html.erb
|
54
|
+
- lib/generators/sunrise_scaffold/templates/single/views/new.html.erb
|
55
|
+
- lib/generators/sunrise_scaffold/templates/single/views/show.html.erb
|
56
|
+
- lib/sunrise_scaffold.rb
|
57
|
+
- lib/sunrise_scaffold/utils.rb
|
58
|
+
- lib/sunrise_scaffold/version.rb
|
59
|
+
has_rdoc: true
|
60
|
+
homepage: https://github.com/galetahub/sunrise-scaffold
|
61
|
+
licenses: []
|
62
|
+
|
63
|
+
post_install_message:
|
64
|
+
rdoc_options: []
|
65
|
+
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
hash: 3
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
version: "0"
|
77
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
|
+
none: false
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
hash: 3
|
83
|
+
segments:
|
84
|
+
- 0
|
85
|
+
version: "0"
|
86
|
+
requirements: []
|
87
|
+
|
88
|
+
rubyforge_project:
|
89
|
+
rubygems_version: 1.6.2
|
90
|
+
signing_key:
|
91
|
+
specification_version: 3
|
92
|
+
summary: Rails CMS
|
93
|
+
test_files: []
|
94
|
+
|