bootstrap_plus 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +58 -0
  4. data/Rakefile +32 -0
  5. data/app/assets/config/bootstrap_plus_manifest.js +2 -0
  6. data/app/assets/javascripts/bootstrap.js +4521 -0
  7. data/app/assets/javascripts/bootstrap_plus/application.js +15 -0
  8. data/app/assets/javascripts/jquery3.js +10598 -0
  9. data/app/assets/javascripts/popper.js +2624 -0
  10. data/app/assets/stylesheets/bootstrap_plus/bootstrap.css.erb +7 -0
  11. data/app/helpers/badge_label_helper.rb +16 -0
  12. data/app/helpers/bootstrap_flash_helper.rb +30 -0
  13. data/app/helpers/flash_block_helper.rb +17 -0
  14. data/app/helpers/form_errors_helper.rb +22 -0
  15. data/app/helpers/glyph_helper.rb +23 -0
  16. data/app/helpers/modal_helper.rb +59 -0
  17. data/app/helpers/navbar_helper.rb +209 -0
  18. data/app/helpers/twitter_breadcrumbs_helper.rb +14 -0
  19. data/app/views/layouts/bootstrap_plus/application.html.erb +16 -0
  20. data/config/routes.rb +2 -0
  21. data/lib/bootstrap_plus.rb +5 -0
  22. data/lib/bootstrap_plus/engine.rb +32 -0
  23. data/lib/bootstrap_plus/version.rb +3 -0
  24. data/lib/generators/bootstrap_plus/install/install_generator.rb +86 -0
  25. data/lib/generators/bootstrap_plus/install/templates/application.css +7 -0
  26. data/lib/generators/bootstrap_plus/install/templates/application.js +11 -0
  27. data/lib/generators/bootstrap_plus/install/templates/bootstrap.coffee +3 -0
  28. data/lib/generators/bootstrap_plus/install/templates/bootstrap.js +4 -0
  29. data/lib/generators/bootstrap_plus/install/templates/bootstrap_and_overrides.css +3 -0
  30. data/lib/generators/bootstrap_plus/install/templates/en.bootstrap.yml +23 -0
  31. data/lib/generators/bootstrap_plus/layout/layout_generator.rb +20 -0
  32. data/lib/generators/bootstrap_plus/layout/templates/layout.html.erb +71 -0
  33. data/lib/generators/bootstrap_plus/resource_view/resource_view_generator.rb +148 -0
  34. data/lib/generators/bootstrap_plus/resource_view/templates/_form.html.erb +34 -0
  35. data/lib/generators/bootstrap_plus/resource_view/templates/_form.html.haml +12 -0
  36. data/lib/generators/bootstrap_plus/resource_view/templates/_form.html.slim +13 -0
  37. data/lib/generators/bootstrap_plus/resource_view/templates/edit.html.erb +9 -0
  38. data/lib/generators/bootstrap_plus/resource_view/templates/edit.html.haml +4 -0
  39. data/lib/generators/bootstrap_plus/resource_view/templates/edit.html.slim +4 -0
  40. data/lib/generators/bootstrap_plus/resource_view/templates/index.html.erb +48 -0
  41. data/lib/generators/bootstrap_plus/resource_view/templates/index.html.haml +26 -0
  42. data/lib/generators/bootstrap_plus/resource_view/templates/index.html.slim +28 -0
  43. data/lib/generators/bootstrap_plus/resource_view/templates/new.html.erb +9 -0
  44. data/lib/generators/bootstrap_plus/resource_view/templates/new.html.haml +4 -0
  45. data/lib/generators/bootstrap_plus/resource_view/templates/new.html.slim +4 -0
  46. data/lib/generators/bootstrap_plus/resource_view/templates/show.html.erb +30 -0
  47. data/lib/generators/bootstrap_plus/resource_view/templates/show.html.haml +15 -0
  48. data/lib/generators/bootstrap_plus/resource_view/templates/show.html.slim +16 -0
  49. data/lib/generators/bootstrap_plus/resource_view/templates/simple_form/_form.html.erb +14 -0
  50. data/lib/generators/bootstrap_plus/resource_view/templates/simple_form/_form.html.haml +11 -0
  51. data/lib/generators/bootstrap_plus/resource_view/templates/simple_form/_form.html.slim +12 -0
  52. data/lib/tasks/bootstrap_plus_tasks.rake +4 -0
  53. metadata +124 -0
@@ -0,0 +1,3 @@
1
+ module BootstrapPlus
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,86 @@
1
+ require 'rails/generators'
2
+
3
+ module BootstrapPlus
4
+ module Generators
5
+ class InstallGenerator < ::Rails::Generators::Base
6
+
7
+ source_root File.expand_path("../templates", __FILE__)
8
+ desc "This generator installs Bootstrap to Asset Pipeline of your Rails Application"
9
+ argument :stylesheets_type, type: :string, default: 'less', banner: '*less or static'
10
+ class_option :'no-coffeescript', type: :boolean, default: false, desc: 'Skips coffeescript replacement into app generators'
11
+
12
+ def add_assets
13
+
14
+ js_manifest = 'app/assets/javascripts/application.js'
15
+
16
+ if File.exist?(js_manifest)
17
+ insert_into_file js_manifest, "//= require jquery3\n", after: "rails-ujs\n"
18
+ insert_into_file js_manifest, "//= require popper\n", after: "jquery3\n"
19
+ insert_into_file js_manifest, "//= require bootstrap\n", after: "popper\n"
20
+ else
21
+ copy_file "application.js", js_manifest
22
+ end
23
+
24
+ css_manifest = 'app/assets/stylesheets/application.css'
25
+
26
+ if File.exist?(css_manifest)
27
+ # Add our own require:
28
+ content = File.read(css_manifest)
29
+ if content.match(/require_tree\s+\.\s*$/)
30
+ # Good enough - that'll include our bootstrap_and_overrides.css.less
31
+ else
32
+ style_require_block = " *= require bootstrap_and_overrides\n"
33
+ insert_into_file css_manifest, style_require_block, after: "require_self\n"
34
+ end
35
+ else
36
+ copy_file "application.css", "app/assets/stylesheets/application.css"
37
+ end
38
+
39
+ end
40
+
41
+ def add_bootstrap
42
+ # copy_file "bootstrap.js", "app/assets/javascripts/bootstrap.js"
43
+ copy_file "bootstrap_and_overrides.css", "app/assets/stylesheets/bootstrap_and_overrides.css"
44
+ # if use_coffeescript?
45
+ # copy_file "bootstrap.coffee", "app/assets/javascripts/bootstrap.js.coffee"
46
+ # else
47
+ # end
48
+ # if use_less?
49
+ # copy_file "bootstrap_and_overrides.less", "app/assets/stylesheets/bootstrap_and_overrides.css.less"
50
+ # else
51
+ # end
52
+ end
53
+
54
+ def add_locale
55
+ if File.exist?("config/locales/en.bootstrap.yml")
56
+ localez = File.read("config/locales/en.bootstrap.yml")
57
+ insert_into_file "config/locales/en.bootstrap.yml", localez, :after => "en\n"
58
+ else
59
+ copy_file "en.bootstrap.yml", "config/locales/en.bootstrap.yml"
60
+ end
61
+ end
62
+
63
+ def cleanup_legacy
64
+ # Remove old requires (if any) that included twitter/bootstrap directly:
65
+ gsub_file("app/assets/stylesheets/application.css", %r|\s*\*=\s*twitter/bootstrap\s*\n|, "")
66
+ if File.exist?('app/assets/stylesheets/bootstrap_override.css.less')
67
+ puts <<-EOM
68
+ Warning:
69
+ app/assets/stylesheets/bootstrap_override.css.less exists
70
+ It should be removed, as it has been superceded by app/assets/stylesheets/bootstrap_and_overrides.css.less
71
+ EOM
72
+ end
73
+ end
74
+
75
+ private
76
+ def use_less?
77
+ (defined?(Less) && (stylesheets_type!='static') ) || (stylesheets_type=='less')
78
+ end
79
+
80
+ def use_coffeescript?
81
+ return false if options[:'no-coffeescript']
82
+ ::Rails.configuration.app_generators.rails[:javascript_engine] == :coffee
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,7 @@
1
+ /*
2
+ * This is a manifest file that'll automatically include all the stylesheets available in this directory
3
+ * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
4
+ * the top of the compiled file, but it's generally better to create a new file per style scope.
5
+ *= require_self
6
+ *= require_tree .
7
+ */
@@ -0,0 +1,11 @@
1
+ // This is a manifest file that'll be compiled into including all the files listed below.
2
+ // Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
3
+ // be included in the compiled file accessible from http://example.com/assets/application.js
4
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
5
+ // the compiled file.
6
+ //
7
+ //= require rails-ujs
8
+ //= require jquery3
9
+ //= require popper
10
+ //= require bootstrap
11
+ //= require_tree .
@@ -0,0 +1,3 @@
1
+ jQuery ->
2
+ $("a[rel~=popover], .has-popover").popover()
3
+ $("a[rel~=tooltip], .has-tooltip").tooltip()
@@ -0,0 +1,4 @@
1
+ jQuery(function() {
2
+ $("a[rel~=popover], .has-popover").popover();
3
+ $("a[rel~=tooltip], .has-tooltip").tooltip();
4
+ });
@@ -0,0 +1,3 @@
1
+ /*
2
+ =require bootstrap_plus/bootstrap
3
+ */
@@ -0,0 +1,23 @@
1
+ # Sample localization file for English. Add more files in this directory for other locales.
2
+ # See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
3
+
4
+ en:
5
+ breadcrumbs:
6
+ application:
7
+ root: "Index"
8
+ pages:
9
+ pages: "Pages"
10
+ helpers:
11
+ actions: "Actions"
12
+ links:
13
+ back: "Back"
14
+ cancel: "Cancel"
15
+ confirm: "Are you sure?"
16
+ destroy: "Delete"
17
+ new: "New"
18
+ edit: "Edit"
19
+ titles:
20
+ edit: "Edit %{model}"
21
+ save: "Save %{model}"
22
+ new: "New %{model}"
23
+ delete: "Delete %{model}"
@@ -0,0 +1,20 @@
1
+ require 'rails/generators'
2
+
3
+ module BootstrapPlus
4
+ module Generators
5
+ class LayoutGenerator < ::Rails::Generators::Base
6
+ source_root File.expand_path("../templates", __FILE__)
7
+ desc "This generator generates layout file with navigation."
8
+ argument :layout_name, type: :string, default: "application"
9
+
10
+ attr_reader :app_name
11
+
12
+ def generate_layout
13
+ app = ::Rails.application
14
+ @app_name = app.class.to_s.split("::").first
15
+ ext = app.config.generators.options[:rails][:template_engine] || :erb
16
+ template "layout.html.#{ext}", "app/views/layouts/#{layout_name}.html.#{ext}"
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,71 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
+ <title><%%= content_for?(:title) ? yield(:title) : "<%= app_name %>" %></title>
8
+ <%%= csrf_meta_tags %>
9
+
10
+ <%%= stylesheet_link_tag "application", :media => "all" %>
11
+
12
+ <%%= javascript_include_tag "application" %>
13
+
14
+ <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
15
+ <!--[if lt IE 9]>
16
+ <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.2/html5shiv.min.js" type="text/javascript"></script>
17
+ <![endif]-->
18
+ </head>
19
+ <body>
20
+
21
+ <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
22
+ <a class="navbar-brand" href="/">Navbar</a>
23
+ <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
24
+ <span class="navbar-toggler-icon"></span>
25
+ </button>
26
+
27
+ <div class="collapse navbar-collapse" id="navbarSupportedContent">
28
+ <ul class="navbar-nav mr-auto">
29
+ <li class="nav-item active">
30
+ <a class="nav-link" href="javascript:void(0)">Home <span class="sr-only">(current)</span></a>
31
+ </li>
32
+ <li class="nav-item">
33
+ <a class="nav-link" href="javascript:void(0)">Link</a>
34
+ </li>
35
+ <li class="nav-item dropdown">
36
+ <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
37
+ Dropdown
38
+ </a>
39
+ <div class="dropdown-menu" aria-labelledby="navbarDropdown">
40
+ <a class="dropdown-item" href="javascript:void(0)">Action</a>
41
+ <a class="dropdown-item" href="javascript:void(0)">Another action</a>
42
+ <div class="dropdown-divider"></div>
43
+ <a class="dropdown-item" href="javascript:void(0)">Something else here</a>
44
+ </div>
45
+ </li>
46
+ <li class="nav-item">
47
+ <a class="nav-link disabled" href="javascript:void(0)" tabindex="-1" aria-disabled="true">Disabled</a>
48
+ </li>
49
+ </ul>
50
+ <form class="form-inline my-2 my-lg-0">
51
+ <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search">
52
+ <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
53
+ </form>
54
+ </div>
55
+ </nav>
56
+
57
+ <div class="container mb-5">
58
+ <div class="row">
59
+ <div class="col-12">
60
+ <%%= bootstrap_flash %>
61
+ <%%= yield %>
62
+ </div>
63
+ </div>
64
+ </div>
65
+
66
+ <footer class="mt-5">
67
+ <p>&copy; Company <%= Date.today.year %></p>
68
+ </footer>
69
+
70
+ </body>
71
+ </html>
@@ -0,0 +1,148 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/generated_attribute'
3
+
4
+ module BootstrapPlus
5
+ module Generators
6
+ class ResourceViewGenerator < ::Rails::Generators::Base
7
+ source_root File.expand_path('../templates', __FILE__)
8
+ argument :controller_path, type: :string
9
+ argument :model_name, type: :string, required: false
10
+ argument :layout, type: :string, default: "application",
11
+ banner: "Specify application layout"
12
+
13
+ class_option :excluded_columns, type: :array, required: false
14
+
15
+ def initialize(args, *options)
16
+ super(args, *options)
17
+ initialize_views_variables
18
+ end
19
+
20
+ def copy_views
21
+ generate_views
22
+ end
23
+
24
+ protected
25
+
26
+ def initialize_views_variables
27
+ @base_name, @controller_class_path, @controller_file_path, @controller_class_nesting, @controller_class_nesting_depth = extract_modules(controller_path)
28
+ @controller_routing_path = @controller_file_path.gsub(/\//, '_')
29
+ @model_name = @controller_class_nesting + "::#{@base_name.singularize.camelize}" unless @model_name
30
+ @model_name = @model_name.camelize
31
+ end
32
+
33
+ def controller_routing_path
34
+ ActiveModel::Naming.route_key(@model_name.constantize)
35
+ end
36
+
37
+ def singular_controller_routing_path
38
+ ActiveModel::Naming.singular_route_key(@model_name.constantize)
39
+ end
40
+
41
+ def model_name
42
+ @model_name
43
+ end
44
+
45
+ def plural_model_name
46
+ @model_name.pluralize
47
+ end
48
+
49
+ def resource_name
50
+ @model_name.demodulize.underscore
51
+ end
52
+
53
+ def plural_resource_name
54
+ resource_name.pluralize
55
+ end
56
+
57
+ def columns
58
+ retrieve_columns.reject {|c| excluded?(c.name) }.map do |c|
59
+ new_attribute(c.name, c.type.to_s)
60
+ end
61
+ end
62
+
63
+ def excluded_columns_names
64
+ %w[_id _type id created_at updated_at]
65
+ end
66
+
67
+ def excluded_columns_pattern
68
+ [
69
+ /.*_checksum/,
70
+ /.*_count/,
71
+ ]
72
+ end
73
+
74
+ def excluded_columns
75
+ options['excluded_columns']||[]
76
+ end
77
+
78
+ def excluded?(name)
79
+ excluded_columns_names.include?(name) ||
80
+ excluded_columns_pattern.any? {|p| name =~ p } ||
81
+ excluded_columns.include?(name)
82
+ end
83
+
84
+ def retrieve_columns
85
+ if defined?(ActiveRecord) == "constant" && ActiveRecord.class == Module
86
+ rescue_block ActiveRecord::StatementInvalid do
87
+ @model_name.constantize.columns
88
+ end
89
+ else
90
+ rescue_block do
91
+ @model_name.constantize.fields.map {|c| c[1] }
92
+ end
93
+ end
94
+ end
95
+
96
+ def new_attribute(name, type)
97
+ ::Rails::Generators::GeneratedAttribute.new(name, type)
98
+ end
99
+
100
+ def rescue_block(exception=Exception)
101
+ yield if block_given?
102
+ rescue exception => e
103
+ say e.message, :red
104
+ exit
105
+ end
106
+
107
+ def extract_modules(name)
108
+ modules = name.include?('/') ? name.split('/') : name.split('::')
109
+ name = modules.pop
110
+ path = modules.map { |m| m.underscore }
111
+ file_path = (path + [name.underscore]).join('/')
112
+ nesting = modules.map { |m| m.camelize }.join('::')
113
+ [name, path, file_path, nesting, modules.size]
114
+ end
115
+
116
+ def generate_views
117
+ options.engine == generate_erb(selected_views)
118
+ end
119
+
120
+ def selected_views
121
+ {
122
+ "index.html.#{ext}" => File.join('app/views', @controller_file_path, "index.html.#{ext}"),
123
+ "new.html.#{ext}" => File.join('app/views', @controller_file_path, "new.html.#{ext}"),
124
+ "edit.html.#{ext}" => File.join('app/views', @controller_file_path, "edit.html.#{ext}"),
125
+ "#{form_builder}_form.html.#{ext}" => File.join('app/views', @controller_file_path, "_form.html.#{ext}"),
126
+ "show.html.#{ext}" => File.join('app/views', @controller_file_path, "show.html.#{ext}")
127
+ }
128
+ end
129
+
130
+ def generate_erb(views)
131
+ views.each do |template_name, output_path|
132
+ template template_name, output_path
133
+ end
134
+ end
135
+
136
+ def ext
137
+ ::Rails.application.config.generators.options[:rails][:template_engine] || :erb
138
+ end
139
+
140
+ def form_builder
141
+ defined?(::SimpleForm) ? 'simple_form/' : ''
142
+ end
143
+ end
144
+ end
145
+ end
146
+
147
+
148
+
@@ -0,0 +1,34 @@
1
+ <%%= form_for @<%= resource_name %>, html: { class: "form-horizontal <%= resource_name %>" } do |f| %>
2
+
3
+ <%% if @<%= resource_name %>.errors.any? %>
4
+ <div id="error_expl" class="panel panel-danger">
5
+ <div class="panel-heading">
6
+ <h3 class="panel-title"><%%= pluralize(@<%= resource_name %>.errors.count, "error") %> prohibited this <%= resource_name %> from being saved:</h3>
7
+ </div>
8
+ <div class="panel-body">
9
+ <ul>
10
+ <%% @<%= resource_name %>.errors.full_messages.each do |msg| %>
11
+ <li><%%= msg %></li>
12
+ <%% end %>
13
+ </ul>
14
+ </div>
15
+ </div>
16
+ <%% end %>
17
+
18
+ <%- columns.each do |column| -%>
19
+ <div class="form-group">
20
+ <%%= f.label :<%= column.name %>, class: 'control-label' %>
21
+ <%%= f.<%= column.field_type %> :<%= column.name %>, class: 'form-control rounded-0' %><br>
22
+ <%%=f.error_span(:<%= column.name %>) %>
23
+ </div>
24
+ <%- end -%>
25
+
26
+ <div class="form-group">
27
+ <div class="col-lg-offset-2 col-lg-10">
28
+ <%%= f.submit nil, class: 'btn btn-primary' %>
29
+ <%%= link_to t('.cancel', default: t("helpers.links.cancel")),
30
+ <%= controller_routing_path %>_path, class: 'btn btn-outline-primary' %>
31
+ </div>
32
+ </div>
33
+
34
+ <%% end %>
@@ -0,0 +1,12 @@
1
+ = form_for @<%= resource_name %>, html: { class: "form form-horizontal <%= resource_name %>" } do |f|
2
+ <%- columns.each do |column| -%>
3
+ .form-group
4
+ = f.label :<%= column.name %>, class: 'control-label col-lg-2'
5
+ .col-lg-10
6
+ = f.<%= column.field_type %> :<%= column.name %>, class: 'form-control', required: true
7
+ = f.error_span(:<%= column.name %>)
8
+ <%- end -%>
9
+ .form-group
10
+ .col-lg-offset-2.col-lg-10
11
+ = f.submit nil,class: 'btn btn-primary'
12
+ = link_to t('.cancel', :default => t("helpers.links.cancel")), <%= controller_routing_path %>_path, :class => 'btn btn-default'
@@ -0,0 +1,13 @@
1
+ = form_for @<%= resource_name %>, html: { class: "form form-horizontal <%= resource_name %>" } do |f|
2
+ <%- columns.each do |column| -%>
3
+ .form-group
4
+ = f.label :<%= column.name %>, :class => 'control-label col-lg-2'
5
+ .col-lg-10
6
+ = f.<%= column.field_type %> :<%= column.name %>, :class => 'form-control'
7
+ = f.error_span(:<%= column.name %>)
8
+ <%- end -%>
9
+ .form-group
10
+ .col-lg-offset-2.col-lg-10
11
+ = f.submit nil, :class => 'btn btn-primary'
12
+ '
13
+ = link_to t('.cancel', :default => t("helpers.links.cancel")), <%= controller_routing_path %>_path, :class => 'btn'