leonardo 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +58 -0
- data/LICENSE +20 -0
- data/README.rdoc +115 -0
- data/lib/generators/erb/leosca/leosca_generator.rb +73 -0
- data/lib/generators/erb/leosca/templates/_form.html.erb +23 -0
- data/lib/generators/erb/leosca/templates/_list.erb +47 -0
- data/lib/generators/erb/leosca/templates/destroy.js.erb +1 -0
- data/lib/generators/erb/leosca/templates/edit.html.erb +11 -0
- data/lib/generators/erb/leosca/templates/formtastic/_form.html.erb +10 -0
- data/lib/generators/erb/leosca/templates/index.html.erb +35 -0
- data/lib/generators/erb/leosca/templates/index.js.erb +1 -0
- data/lib/generators/erb/leosca/templates/new.html.erb +7 -0
- data/lib/generators/erb/leosca/templates/show.html.erb +13 -0
- data/lib/generators/leolay/USAGE +21 -0
- data/lib/generators/leolay/leolay_generator.rb +195 -0
- data/lib/generators/leolay/templates/app/assets/stylesheets/formtastic.css +145 -0
- data/lib/generators/leolay/templates/app/assets/stylesheets/formtastic_changes.css +16 -0
- data/lib/generators/leolay/templates/app/views/devise/confirmations/new.html.erb +12 -0
- data/lib/generators/leolay/templates/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/lib/generators/leolay/templates/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/lib/generators/leolay/templates/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/lib/generators/leolay/templates/app/views/devise/passwords/edit.html.erb +16 -0
- data/lib/generators/leolay/templates/app/views/devise/passwords/new.html.erb +12 -0
- data/lib/generators/leolay/templates/app/views/devise/registrations/edit.html.erb +25 -0
- data/lib/generators/leolay/templates/app/views/devise/registrations/new.html.erb +18 -0
- data/lib/generators/leolay/templates/app/views/devise/sessions/new.html.erb +17 -0
- data/lib/generators/leolay/templates/app/views/devise/shared/_links.erb +25 -0
- data/lib/generators/leolay/templates/app/views/devise/unlocks/new.html.erb +12 -0
- data/lib/generators/leolay/templates/config/locales/devise.en.yml +53 -0
- data/lib/generators/leolay/templates/config/locales/devise.it.yml +51 -0
- data/lib/generators/leolay/templates/config/locales/en.yml +79 -0
- data/lib/generators/leolay/templates/config/locales/it.yml +176 -0
- data/lib/generators/leolay/templates/config/locales/kaminari.en.yml +10 -0
- data/lib/generators/leolay/templates/config/locales/kaminari.it.yml +10 -0
- data/lib/generators/leolay/templates/config.rb +11 -0
- data/lib/generators/leolay/templates/layout_helper.rb +39 -0
- data/lib/generators/leolay/templates/lib/utility.rb +48 -0
- data/lib/generators/leolay/templates/styles/cloudy/images/kaminari/nav.png +0 -0
- data/lib/generators/leolay/templates/styles/cloudy/images/style/bg_but_gray.png +0 -0
- data/lib/generators/leolay/templates/styles/cloudy/images/style/bg_top.png +0 -0
- data/lib/generators/leolay/templates/styles/cloudy/images/style/button_170_126.png +0 -0
- data/lib/generators/leolay/templates/styles/cloudy/images/style/button_229_170.png +0 -0
- data/lib/generators/leolay/templates/styles/cloudy/images/style/ico_back.png +0 -0
- data/lib/generators/leolay/templates/styles/cloudy/images/style/ico_next.png +0 -0
- data/lib/generators/leolay/templates/styles/cloudy/images/style/ico_v.png +0 -0
- data/lib/generators/leolay/templates/styles/cloudy/images/style/ico_x.png +0 -0
- data/lib/generators/leolay/templates/styles/cloudy/images/style/input_background_bn.png +0 -0
- data/lib/generators/leolay/templates/styles/cloudy/images/style/logo.png +0 -0
- data/lib/generators/leolay/templates/styles/cloudy/images/style/msg_error.gif +0 -0
- data/lib/generators/leolay/templates/styles/cloudy/images/style/msg_notice.gif +0 -0
- data/lib/generators/leolay/templates/styles/cloudy/stylesheet.sass +341 -0
- data/lib/generators/leolay/templates/styles/cloudy/views/kaminari/_next_page.html.erb +5 -0
- data/lib/generators/leolay/templates/styles/cloudy/views/kaminari/_page.html.erb +5 -0
- data/lib/generators/leolay/templates/styles/cloudy/views/kaminari/_paginator.html.erb +7 -0
- data/lib/generators/leolay/templates/styles/cloudy/views/kaminari/_prev_page.html.erb +5 -0
- data/lib/generators/leolay/templates/styles/cloudy/views/layout/_layout.html.erb +38 -0
- data/lib/generators/leolay/templates/styles/cloudy/views/layout/_message.html.erb +3 -0
- data/lib/generators/leolay/templates/styles/cloudy/views/layout/_session.html.erb +10 -0
- data/lib/generators/leolay/templates/styles/cloudy/views/layout/application.html.erb +13 -0
- data/lib/generators/leosca/USAGE +23 -0
- data/lib/generators/leosca/install_generator.rb +15 -0
- data/lib/generators/rails/leosca/USAGE +41 -0
- data/lib/generators/rails/leosca/leosca_generator.rb +26 -0
- data/lib/generators/rails/leosca/templates/leosca.css +56 -0
- data/lib/generators/rails/leosca_controller/USAGE +23 -0
- data/lib/generators/rails/leosca_controller/leosca_controller_generator.rb +159 -0
- data/lib/generators/rails/leosca_controller/templates/controller.rb +132 -0
- data/template.rb +104 -0
- metadata +132 -0
data/CHANGELOG
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
1.3.0 (August 22th, 2011) Marco Mastrodonato
|
2
|
+
* Add formtastic support and a new custom partial
|
3
|
+
|
4
|
+
|
5
|
+
|
6
|
+
1.2.0 (August 4th, 2011) Marco Mastrodonato
|
7
|
+
=== Bug Fix
|
8
|
+
* Fixed the migration for users creation: authorizations were not set correctly
|
9
|
+
* Sign out did not work: add method :delete
|
10
|
+
* Fixed minor bugs
|
11
|
+
|
12
|
+
=== Features
|
13
|
+
* Updated partial session to have i18n labels
|
14
|
+
* Add updated devise.it.yml
|
15
|
+
* Add customized devise views with i18n management (to be continue). Devise generator is not required anymore until they update it
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
1.1.1 (August 4th, 2011) Marco Mastrodonato
|
21
|
+
* Fixed minor things
|
22
|
+
* Improved cancan configuration
|
23
|
+
* Added user and manager creation as well as admin
|
24
|
+
* Improved documentation
|
25
|
+
|
26
|
+
=== To do
|
27
|
+
* Csv export does not work with ajax pagination
|
28
|
+
* Improve ajax management to show, add and edit in the list view
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
1.1.0 (August 3th, 2011) Marco Mastrodonato
|
33
|
+
|
34
|
+
=== Bug Fix
|
35
|
+
* Kaminari did not show pagination style
|
36
|
+
* Minor fix for ajax code
|
37
|
+
* Added Utility class i forgot to include
|
38
|
+
|
39
|
+
=== Features
|
40
|
+
* Added authorization management to support cancan
|
41
|
+
* Improved authentication management to support warden/devise
|
42
|
+
* Added seeds creation. You can avoid using --skip-seeds or change the default elements using --seeds_elements=60
|
43
|
+
* Ajax is now the default and add option to skip --skip-remote (to enable/disable ajax set remote to true into index view)
|
44
|
+
* Added destroy js template
|
45
|
+
* Added localization management into application controller and use lang variable on url (ex: localhost:3000?lang=it)
|
46
|
+
* Added class odd/even to tables tr
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
1.0.0 (August 2th, 2011) Marco Mastrodonato
|
51
|
+
|
52
|
+
* First stable release
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
0.0.1 (July 27th, 2011) Marco Mastrodonato
|
57
|
+
|
58
|
+
* Starting project
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 Marco Mastrodonato
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
= Leolay Generators
|
2
|
+
|
3
|
+
A layout and customized scaffold generator for Rails 3.1
|
4
|
+
Generate a layout using the ERGO Insurance Group\'s style, you can customize it or add your own. It also provides a customized scaffold to generates cool sites ajax ready.
|
5
|
+
|
6
|
+
|
7
|
+
== Install
|
8
|
+
|
9
|
+
gem install leonardo
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
== Usage
|
15
|
+
|
16
|
+
Once you install the gem, the generators will be available to all Rails applications on your system.
|
17
|
+
|
18
|
+
To run the generator, go to your rails project directory and call it using rails generate or destroy command:
|
19
|
+
rails g leolay or rails destroy leolay
|
20
|
+
rails g leosca or rails destroy leosca
|
21
|
+
|
22
|
+
PS: Ergosca destroy do not remove variables parts like the attributes inserted into i18n yaml
|
23
|
+
PPS: You can run it more times and right like scaffold, is smart and won't generate tons of identical code
|
24
|
+
|
25
|
+
=== Step by step
|
26
|
+
|
27
|
+
1. Firstly, create layout and initialize your project:
|
28
|
+
rails new AppExample -m template.rb
|
29
|
+
(You could find a template into gem root folder)
|
30
|
+
|
31
|
+
there will be only a conflict on locales/en.yml which you can force
|
32
|
+
|
33
|
+
Will be:
|
34
|
+
* Created an application layout with a nice and dynamic stylesheet based on sass
|
35
|
+
* Customized views (only erb atm) and controller ajax ready and filters based on attributes, i18n messages ecc.
|
36
|
+
* Customized application.rb to exclude javascript and stylesheet for every resource you will create
|
37
|
+
* Customized application controller to manage i18n and others stuff like authentication, authorization ecc [optionals]
|
38
|
+
* Created customized partials for pagination with kaminari [optional]
|
39
|
+
|
40
|
+
2. If you have used my template you have an application ready to work:
|
41
|
+
run rails s and try it on localhost:3000
|
42
|
+
if you choosed authentication you have to sign in, try with this different profile:
|
43
|
+
email: admin@AppExample.com, password: AppExample
|
44
|
+
[this profile can do everything]
|
45
|
+
or
|
46
|
+
email: manager@AppExample.com, password: AppExample
|
47
|
+
[can read, create and update]
|
48
|
+
or
|
49
|
+
email: user@AppExample.com, password: AppExample
|
50
|
+
[can read, create, update and destroy]
|
51
|
+
|
52
|
+
Profile exists only if you choosed authorization as well.
|
53
|
+
That are default and ready to be customized to suit your needs.
|
54
|
+
|
55
|
+
3. Create your resource:
|
56
|
+
rails g leosca product name:string description:text active:boolean items:integer price:decimal
|
57
|
+
|
58
|
+
This will act as a normal scaffold more new stuff:
|
59
|
+
* will be invoked new leosca_controller which is a customized scaffold_controller
|
60
|
+
* customized views with new layout and ajax ready [set remote to true into index]
|
61
|
+
* attributes will be insert into i18n files for fast translation
|
62
|
+
* seeds will be created for you to populate new table
|
63
|
+
|
64
|
+
4. Apply on db
|
65
|
+
rake db:migrate
|
66
|
+
rake db:seed
|
67
|
+
|
68
|
+
READY!
|
69
|
+
|
70
|
+
|
71
|
+
You could also customize it, copy under your project folder running:
|
72
|
+
rails g leosca:install
|
73
|
+
|
74
|
+
Then go to lib\generators\erb to change erb views like you would do with original scaffold
|
75
|
+
go to lib\generators\rails if you want to customize more.
|
76
|
+
|
77
|
+
|
78
|
+
For more information about usage:
|
79
|
+
|
80
|
+
rails g leolay --help
|
81
|
+
rails g leosca --help
|
82
|
+
|
83
|
+
|
84
|
+
=== Example:
|
85
|
+
|
86
|
+
leolay:
|
87
|
+
|
88
|
+
rails generate leolay
|
89
|
+
rails generate leolay --main_color=#c8c8c8
|
90
|
+
rails generate leolay layout1 --main_color=rgb(200,150,200) --second-color=yellow
|
91
|
+
rails generate leolay layout2 --skip-pagination --skip-authentication --skip-authorization
|
92
|
+
|
93
|
+
leosca:
|
94
|
+
|
95
|
+
rails generate leosca product name:string
|
96
|
+
rails generate leosca product name:string --skip-remote => if you do not want ajax
|
97
|
+
rails generate leosca product name:string --skip-seeds
|
98
|
+
rails generate leosca product name:string --seeds=60 => if you need more records
|
99
|
+
|
100
|
+
PS: Of course, these options are in addition to those provided by the original scaffold
|
101
|
+
|
102
|
+
|
103
|
+
=== Available layout
|
104
|
+
|
105
|
+
* ergo [default]
|
106
|
+
|
107
|
+
|
108
|
+
== Found a bug?
|
109
|
+
|
110
|
+
If you are having a problem please submit an issue at m.mastrodonato@gmail.com
|
111
|
+
|
112
|
+
|
113
|
+
== Rails 2 and Rails 3.0.x
|
114
|
+
|
115
|
+
This Generators does not work with versions earlier 3.1
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'rails/generators/erb'
|
2
|
+
require 'rails/generators/resource_helpers'
|
3
|
+
|
4
|
+
module Erb
|
5
|
+
module Generators
|
6
|
+
class LeoscaGenerator < Base
|
7
|
+
include Rails::Generators::ResourceHelpers
|
8
|
+
#puts 'erb:leosca'
|
9
|
+
|
10
|
+
source_root File.expand_path('../templates', __FILE__)
|
11
|
+
argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
|
12
|
+
class_option :authorization, :type => :boolean, :default => true, :description => "Add code to manage authorization with cancan"
|
13
|
+
class_option :remote, :type => :boolean, :default => true, :description => "Enable ajax. You can also do later set remote to true into index view."
|
14
|
+
|
15
|
+
def create_root_folder
|
16
|
+
empty_directory File.join("app/views", controller_file_path)
|
17
|
+
end
|
18
|
+
|
19
|
+
def copy_view_files
|
20
|
+
available_views.each do |view|
|
21
|
+
filenames = filenames_all_formats(view, source_paths)
|
22
|
+
filenames.each do |filename|
|
23
|
+
#Looking for custom filename into subfolder
|
24
|
+
filename_source = "#{"formtastic/" if formtastic?}#{filename}"
|
25
|
+
search_into_subfolder = nil
|
26
|
+
source_paths.each do |path|
|
27
|
+
if File.exists?(File.join(path,filename_source))
|
28
|
+
search_into_subfolder = true
|
29
|
+
break
|
30
|
+
end
|
31
|
+
end
|
32
|
+
filename_source = filename unless search_into_subfolder
|
33
|
+
|
34
|
+
template filename_source, File.join("app/views", controller_file_path, filename)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
protected
|
41
|
+
|
42
|
+
def available_views
|
43
|
+
%w(index edit show new _form _list destroy)
|
44
|
+
end
|
45
|
+
|
46
|
+
def filenames_all_formats(name, paths=[], formats=[:html, :js, nil])
|
47
|
+
filenames = []
|
48
|
+
paths.each do |path|
|
49
|
+
formats.each do |format|
|
50
|
+
filename = filename_with_extensions(format, name)
|
51
|
+
if File.exists?(File.join(path, filename))
|
52
|
+
filenames << filename
|
53
|
+
end
|
54
|
+
end
|
55
|
+
break if filenames.any?
|
56
|
+
end
|
57
|
+
filenames
|
58
|
+
end
|
59
|
+
def filename_with_extensions(format, name, parser=:erb)
|
60
|
+
[name, format, parser].compact.join(".")
|
61
|
+
end
|
62
|
+
|
63
|
+
def authorization?
|
64
|
+
File.exists? "app/models/ability.rb"
|
65
|
+
end
|
66
|
+
|
67
|
+
def formtastic?
|
68
|
+
File.exists? "config/initializers/formtastic.rb"
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
<%%= form_for(@<%= singular_table_name %>) do |f| %>
|
2
|
+
<%% if @<%= singular_table_name %>.errors.any? %>
|
3
|
+
<div id="error_explanation">
|
4
|
+
<h2><%%= pluralize(@<%= singular_table_name %>.errors.count, "error") %> prohibited this <%= singular_table_name %> from being saved:</h2>
|
5
|
+
|
6
|
+
<ul>
|
7
|
+
<%% @<%= singular_table_name %>.errors.full_messages.each do |msg| %>
|
8
|
+
<li><%%= msg %></li>
|
9
|
+
<%% end %>
|
10
|
+
</ul>
|
11
|
+
</div>
|
12
|
+
<%% end %>
|
13
|
+
|
14
|
+
<% attributes.each do |attribute| -%>
|
15
|
+
<div class="field">
|
16
|
+
<%%= f.label :<%= attribute.name %> %><br />
|
17
|
+
<%%= f.<%= attribute.field_type %> :<%= attribute.name %> %>
|
18
|
+
</div>
|
19
|
+
<% end -%>
|
20
|
+
<div class="actions">
|
21
|
+
<%%= f.submit :class => 'button large' %>
|
22
|
+
</div>
|
23
|
+
<%% end %>
|
@@ -0,0 +1,47 @@
|
|
1
|
+
<%%= paginate @<%= plural_table_name %>, :remote => remote %>
|
2
|
+
<div class="separator"></div>
|
3
|
+
|
4
|
+
<table class='user' cellspacing='0'>
|
5
|
+
<thead>
|
6
|
+
<tr>
|
7
|
+
<%- attributes.each do |attribute| -%>
|
8
|
+
<th><%%= t('attributes.<%= singular_table_name %>.<%= attribute.name %>') %></th>
|
9
|
+
<%- end -%>
|
10
|
+
<th></th>
|
11
|
+
<th></th>
|
12
|
+
<th></th>
|
13
|
+
</tr>
|
14
|
+
</thead>
|
15
|
+
<tbody>
|
16
|
+
<%% @<%= plural_table_name %>.each do |<%= singular_table_name %>| %>
|
17
|
+
<tr id="tr<%%= <%= singular_table_name %>.id %>" class="<%%= cycle("odd", "even")%>">
|
18
|
+
<%- attributes.each do |attribute| -%>
|
19
|
+
<%- case attribute.type
|
20
|
+
when :boolean -%>
|
21
|
+
<td><%%= <%= singular_table_name %>.<%= attribute.name %> ? style_image_tag("ico_v.png") : style_image_tag('ico_x.png') %></td>
|
22
|
+
<%- else -%>
|
23
|
+
<td><%%= <%= singular_table_name %>.<%= attribute.name %> %></td>
|
24
|
+
<%- end -%>
|
25
|
+
<%- end -%>
|
26
|
+
<td><%%= link_to t(:show), <%= singular_table_name %> %></td>
|
27
|
+
<% if authorization? -%>
|
28
|
+
<%% if can? :update, <%= singular_table_name %> -%>
|
29
|
+
<% end -%>
|
30
|
+
<td><%%= link_to t(:edit), edit_<%= singular_table_name %>_path(<%= singular_table_name %>) %></td>
|
31
|
+
<% if authorization? -%>
|
32
|
+
<%% end -%>
|
33
|
+
<% end -%>
|
34
|
+
<% if authorization? -%>
|
35
|
+
<%% if can? :destroy, <%= singular_table_name %> -%>
|
36
|
+
<% end -%>
|
37
|
+
<td><%%= link_to t(:destroy), <%= singular_table_name %>, <%= key_value :confirm, "t(:sure?)" %>, <%= key_value :method, ":delete" %>, :remote => remote %></td>
|
38
|
+
<% if authorization? -%>
|
39
|
+
<%% end -%>
|
40
|
+
<% end -%>
|
41
|
+
</tr>
|
42
|
+
<%% end %>
|
43
|
+
</tbody>
|
44
|
+
</table>
|
45
|
+
|
46
|
+
<div class="separator"></div>
|
47
|
+
<%%= paginate @<%= plural_table_name %>, :remote => remote %>
|
@@ -0,0 +1 @@
|
|
1
|
+
$("#tr<%%= @<%= singular_table_name %>.id %>").hide('fast');
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<%% secondary_navigation({:value => link_to(t(:list), <%= plural_table_name %>_path)},
|
2
|
+
({:value => link_to(t(:add), new_<%= singular_table_name %>_path)}<%= " if can?(:create, @#{singular_table_name})" if authorization? %>),
|
3
|
+
{:value => t(:edit), :active => true},
|
4
|
+
{:value => link_to(t(:show), @<%= singular_table_name %>)}
|
5
|
+
) %>
|
6
|
+
|
7
|
+
<%% title t('attributes.<%= singular_table_name %>.op_edit') %>
|
8
|
+
|
9
|
+
<%%= render 'form' %>
|
10
|
+
<!--<%%#= link_to t(:show), @<%= singular_table_name %> %> |-->
|
11
|
+
<!--<%%#= link_to t(:back), <%= index_helper %>_path %>-->
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<%%= semantic_form_for(@<%= singular_table_name %>) do |f| %>
|
2
|
+
<%%= f.inputs do %>
|
3
|
+
<% attributes.each do |attribute| -%>
|
4
|
+
<%%= f.input :<%= attribute.name %> %>
|
5
|
+
<% end -%>
|
6
|
+
<%% end %>
|
7
|
+
<%%= f.buttons do %>
|
8
|
+
<%%= f.commit_button :button_html => { :class => "button large" } %>
|
9
|
+
<%% end %>
|
10
|
+
<%% end %>
|
@@ -0,0 +1,35 @@
|
|
1
|
+
<%% secondary_navigation({:value => t(:list), :active => true},
|
2
|
+
({:value => link_to(t(:add), new_<%= singular_table_name %>_path)}<%= " if can?(:create, @#{singular_table_name})" if authorization? %>)
|
3
|
+
) %>
|
4
|
+
|
5
|
+
<%% title t('attributes.<%= singular_table_name %>.op_index') %>
|
6
|
+
|
7
|
+
<%% remote = <%= options.remote? %> %>
|
8
|
+
<%%= form_for :<%= singular_table_name %>, :remote => remote, :html => { :method => :get, :id => "form_search" } do |f| %>
|
9
|
+
<div class="filter-container">
|
10
|
+
<%- attributes.each do |attribute| -%>
|
11
|
+
<div class="filter-field">
|
12
|
+
<b><%%= f.label t('attributes.<%= singular_table_name %>.<%= attribute.name %>') %></b><br />
|
13
|
+
<%- case attribute.type -%>
|
14
|
+
<%- when :boolean -%>
|
15
|
+
<%%= radio_button("<%= singular_table_name %>", "<%= attribute.name %>", "1", {:checked => (@<%= singular_table_name %>.<%= attribute.name %>)}) %><%%= label_tag "<%= singular_table_name %>_<%= attribute.name %>_1", t(:yes) %><br />
|
16
|
+
<%%= radio_button("<%= singular_table_name %>", "<%= attribute.name %>", "0", {:checked => (!@<%= singular_table_name %>.<%= attribute.name %>)}) %><%%= label_tag "<%= singular_table_name %>_<%= attribute.name %>_0", t(:no) %><br />
|
17
|
+
<%%= radio_button("<%= singular_table_name %>", "<%= attribute.name %>", "") %><%%= label_tag "<%= singular_table_name %>_<%= attribute.name %>_", t(:all) %>
|
18
|
+
<%- when :text -%>
|
19
|
+
<%%= f.text_field :<%= attribute.name %> %>
|
20
|
+
<%- else -%>
|
21
|
+
<%%= f.<%= attribute.field_type %> :<%= attribute.name %> %>
|
22
|
+
<%- end -%>
|
23
|
+
|
24
|
+
</div>
|
25
|
+
<%- end -%>
|
26
|
+
<div style="clear:both;">
|
27
|
+
<%%= f.submit t(:search), {:class=>'button medium'} %>
|
28
|
+
<%%= f.submit 'Csv', {:class=>'button medium csv'} %>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
<%% end %>
|
32
|
+
|
33
|
+
<div id="list">
|
34
|
+
<%%= render 'list', :remote => remote %>
|
35
|
+
</div>
|
@@ -0,0 +1 @@
|
|
1
|
+
$("#list").html("<%%= escape_javascript(render('list', :remote => true))%>");
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<%% secondary_navigation({:value => link_to(t(:list),<%= plural_table_name %>_path)},
|
2
|
+
({:value => link_to(t(:add), new_<%= singular_table_name %>_path)}<%= " if can?(:create, @#{singular_table_name})" if authorization? %>),
|
3
|
+
({:value => link_to(t(:edit), edit_<%= singular_table_name %>_path(@<%= singular_table_name %>))}<%= " if can?(:update, @#{singular_table_name})" if authorization? %>),
|
4
|
+
{:value => link_to(t(:show), @<%= singular_table_name %>), :active => true}
|
5
|
+
)%>
|
6
|
+
|
7
|
+
<% attributes.each do |attribute| -%>
|
8
|
+
<p>
|
9
|
+
<b><%%= t('attributes.<%= singular_table_name %>.<%= attribute.name %>') %>:</b>
|
10
|
+
<%%= @<%= singular_table_name %>.<%= attribute.name %> %>
|
11
|
+
</p>
|
12
|
+
|
13
|
+
<% end -%>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
Description:
|
2
|
+
A layout and customized scaffold generator for Rails 3.1
|
3
|
+
|
4
|
+
Rails version supported:
|
5
|
+
3.1
|
6
|
+
|
7
|
+
Available layout:
|
8
|
+
ergo [default]
|
9
|
+
|
10
|
+
Example:
|
11
|
+
rails generate leolay
|
12
|
+
rails generate leolay --main_color=#c8c8c8
|
13
|
+
rails generate leolay layout1 --main_color=rgb(200,150,200) --second-color=yellow
|
14
|
+
rails generate leolay layout2 --skip-pagination --skip-authentication --skip-authorization
|
15
|
+
|
16
|
+
Will be:
|
17
|
+
Created an application layout with a nice and dynamic stylesheet based on sass
|
18
|
+
Customized views (only erb atm) and controller ajax ready and filters based on attributes, i18n messages ecc.
|
19
|
+
Customized application.rb to exclude javascript and stylesheet for every resource you will create
|
20
|
+
Customized application controller to manage i18n and others stuff like authentication, authorization ecc [optionals]
|
21
|
+
Created customized partials for pagination with kaminari [optional]
|
@@ -0,0 +1,195 @@
|
|
1
|
+
class LeolayGenerator < Rails::Generators::Base
|
2
|
+
source_root File.expand_path('../templates', __FILE__)
|
3
|
+
argument :style, :type => :string, :default => "cloudy"
|
4
|
+
class_option :pagination, :type => :boolean, :default => true, :description => "Include pagination files"
|
5
|
+
class_option :main_color, :type => :string, :default => nil, :description => "Force a main color for the stylesheet"
|
6
|
+
class_option :second_color, :type => :string, :default => nil, :description => "Force a secondary color for the stylesheet"
|
7
|
+
class_option :authentication, :type => :boolean, :default => true, :description => "Add code to manage authentication with devise"
|
8
|
+
class_option :authorization, :type => :boolean, :default => true, :description => "Add code to manage authorization with cancan"
|
9
|
+
class_option :user_class, :type => :boolean, :default => 'user', :description => "Set the user class name"
|
10
|
+
class_option :formtastic, :type => :boolean, :default => true, :description => "Copy formtastic files into leosca custom folder (inside project)"
|
11
|
+
|
12
|
+
|
13
|
+
def generate_layout
|
14
|
+
template "config.rb", "config/initializers/config.rb"
|
15
|
+
|
16
|
+
template "styles/#{style_name}/stylesheet.sass",
|
17
|
+
"app/assets/stylesheets/#{style_name}.sass"
|
18
|
+
|
19
|
+
copy_file "layout_helper.rb", "app/helpers/layout_helper.rb"
|
20
|
+
|
21
|
+
copy_file "styles/#{style_name}/views/layout/application.html.erb", "app/views/layouts/application.html.erb", :force => true
|
22
|
+
template "styles/#{style_name}/views/layout/_layout.html.erb", "app/views/layouts/_#{style_name}.html.erb"
|
23
|
+
#{:authentication => options.authentication?,
|
24
|
+
#:authorization => options.authorization?}
|
25
|
+
copy_file "styles/#{style_name}/views/layout/_message.html.erb", "app/views/application/_message.html.erb"
|
26
|
+
copy_file "styles/#{style_name}/views/layout/_session.html.erb", "app/views/application/_session.html.erb" if options.authentication?
|
27
|
+
|
28
|
+
copy_file "config/locales/en.yml", "config/locales/en.yml"
|
29
|
+
copy_file "config/locales/it.yml", "config/locales/it.yml"
|
30
|
+
|
31
|
+
copy_file "lib/utility.rb", "lib/extras/utility.rb"
|
32
|
+
|
33
|
+
if options.pagination?
|
34
|
+
copy_file "config/locales/kaminari.en.yml", "config/locales/kaminari.en.yml"
|
35
|
+
copy_file "config/locales/kaminari.it.yml", "config/locales/kaminari.it.yml"
|
36
|
+
|
37
|
+
copy_file "styles/#{style_name}/views/kaminari/_next_page.html.erb", "app/views/kaminari/_next_page.html.erb"
|
38
|
+
copy_file "styles/#{style_name}/views/kaminari/_page.html.erb", "app/views/kaminari/_page.html.erb"
|
39
|
+
copy_file "styles/#{style_name}/views/kaminari/_paginator.html.erb", "app/views/kaminari/_paginator.html.erb"
|
40
|
+
copy_file "styles/#{style_name}/views/kaminari/_prev_page.html.erb", "app/views/kaminari/_prev_page.html.erb"
|
41
|
+
|
42
|
+
copy_file "styles/#{style_name}/images/kaminari/nav.png", "app/assets/images/styles/#{style_name}/kaminari/nav.png"
|
43
|
+
end
|
44
|
+
|
45
|
+
directory "styles/#{style_name}/images/style", "app/assets/images/styles/#{style_name}"
|
46
|
+
|
47
|
+
if options.authentication?
|
48
|
+
copy_file "config/locales/devise.en.yml", "config/locales/devise.en.yml"
|
49
|
+
copy_file "config/locales/devise.it.yml", "config/locales/devise.it.yml"
|
50
|
+
directory "app/views/devise", "app/views/devise"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def setup_application
|
55
|
+
application do
|
56
|
+
<<-FILE.gsub(/^ /, '')
|
57
|
+
config.generators do |g|
|
58
|
+
g.stylesheets false
|
59
|
+
g.javascripts false
|
60
|
+
g.leosca_controller :leosca_controller
|
61
|
+
end
|
62
|
+
|
63
|
+
config.autoload_paths += %W(\#{config.root}/lib/extras)
|
64
|
+
FILE
|
65
|
+
end
|
66
|
+
|
67
|
+
file = "app/controllers/application_controller.rb"
|
68
|
+
if File.exists?(file)
|
69
|
+
inject_into_class file, ApplicationController do
|
70
|
+
<<-FILE.gsub(/^ /, '')
|
71
|
+
rescue_from CanCan::AccessDenied do |exception|
|
72
|
+
redirect_to root_url, :alert => exception.message
|
73
|
+
end
|
74
|
+
FILE
|
75
|
+
end if options.authorization?
|
76
|
+
|
77
|
+
#{options.authentication? ? ", :authenticate_user!" : ""}
|
78
|
+
inject_into_class file, ApplicationController do
|
79
|
+
<<-FILE.gsub(/^ /, '')
|
80
|
+
before_filter :localizate
|
81
|
+
|
82
|
+
def localizate
|
83
|
+
if params[:lang]
|
84
|
+
session[:lang] = params[:lang]
|
85
|
+
else
|
86
|
+
session[:lang] ||= I18n.default_locale
|
87
|
+
end
|
88
|
+
I18n.locale = session[:lang]
|
89
|
+
end
|
90
|
+
FILE
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def setup_authentication
|
96
|
+
file = "app/models/#{options.user_class}.rb"
|
97
|
+
#puts "File #{file} #{File.exists?(file) ? "" : "does not"} exists!"
|
98
|
+
return unless options.authentication? and File.exists?(file)
|
99
|
+
|
100
|
+
inject_into_class file, User do
|
101
|
+
<<-FILE.gsub(/^ /, '')
|
102
|
+
ROLES = %w[admin manager user guest]
|
103
|
+
scope :with_role, lambda { |role| {:conditions => "roles_mask & \#{2**ROLES.index(role.to_s)} > 0 "} }
|
104
|
+
|
105
|
+
def roles=(roles)
|
106
|
+
self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.sum
|
107
|
+
end
|
108
|
+
def roles
|
109
|
+
ROLES.reject { |r| ((roles_mask || 0) & 2**ROLES.index(r)).zero? }
|
110
|
+
end
|
111
|
+
def role_symbols
|
112
|
+
roles.map(&:to_sym)
|
113
|
+
end
|
114
|
+
def role?(role)
|
115
|
+
roles.include? role.to_s
|
116
|
+
end
|
117
|
+
FILE
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
def setup_authorization
|
123
|
+
file = "app/models/ability.rb"
|
124
|
+
return unless File.exists?(file)
|
125
|
+
inject_into_file file, :before => " end\nend" do
|
126
|
+
<<-FILE.gsub(/^ /, '')
|
127
|
+
user ||= User.new
|
128
|
+
can :manage, :all if user.role? :admin
|
129
|
+
|
130
|
+
FILE
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
|
135
|
+
def create_admin_migration
|
136
|
+
file = "db/migrate/*_create_admin.rb"
|
137
|
+
return unless options.authentication? and Dir[file].empty?
|
138
|
+
file = file.sub('*', Time.now.strftime("%Y%m%d%H9999"))
|
139
|
+
create_file file do
|
140
|
+
<<-FILE.gsub(/^ /, '')
|
141
|
+
class CreateAdmin < ActiveRecord::Migration
|
142
|
+
def self.up
|
143
|
+
add_column :users, :roles_mask, :integer
|
144
|
+
user=User.new :email => 'admin@#{app_name}.com', :password => '#{app_name}', :password_confirmation => '#{app_name}'
|
145
|
+
user.roles=['admin']
|
146
|
+
user.save
|
147
|
+
user=User.new :email => 'manager@#{app_name}.com', :password => '#{app_name}', :password_confirmation => '#{app_name}'
|
148
|
+
user.roles=['manager']
|
149
|
+
user.save
|
150
|
+
user=User.new :email => 'user@#{app_name}.com', :password => '#{app_name}', :password_confirmation => '#{app_name}'
|
151
|
+
user.roles=['user']
|
152
|
+
user.save
|
153
|
+
end
|
154
|
+
def self.down
|
155
|
+
User.delete User.find_all_by_email(['admin@#{app_name.downcase}.com',
|
156
|
+
'manager@#{app_name.downcase}.com',
|
157
|
+
'user@#{app_name.downcase}.com']).map(&:id)
|
158
|
+
remove_column :users, :roles_mask
|
159
|
+
end
|
160
|
+
end
|
161
|
+
FILE
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def setup_formtastic
|
166
|
+
return unless options.formtastic?
|
167
|
+
|
168
|
+
file = "app/assets/stylesheets/formtastic.css"
|
169
|
+
copy_file file, file
|
170
|
+
file = "app/assets/stylesheets/formtastic_changes.css"
|
171
|
+
copy_file file, file
|
172
|
+
|
173
|
+
#New version include custom partial _form
|
174
|
+
#file_source = "lib/templates/erb/scaffold/_form.html.erb"
|
175
|
+
#file_destination = "lib/templates/erb/leosca/_form.html.erb"
|
176
|
+
#copy_file file_source, file_destination if File.exists?(file_source) and not File.exists?(file_destination)
|
177
|
+
|
178
|
+
file = "config/initializers/formtastic.rb"
|
179
|
+
inject_into_file file, :after => "# Formtastic::SemanticFormBuilder.i18n_lookups_by_default = false" do
|
180
|
+
<<-FILE.gsub(/^ /, '')
|
181
|
+
|
182
|
+
Formtastic::SemanticFormBuilder.i18n_lookups_by_default = true
|
183
|
+
FILE
|
184
|
+
end if File.exists?(file)
|
185
|
+
end
|
186
|
+
|
187
|
+
private
|
188
|
+
def style_name
|
189
|
+
style.underscore
|
190
|
+
end
|
191
|
+
|
192
|
+
def app_name
|
193
|
+
File.basename(Dir.pwd)
|
194
|
+
end
|
195
|
+
end
|