ngenerators 0.0.1

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.
Files changed (35) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +1 -0
  3. data/.ruby-version +1 -0
  4. data/README.md +3 -0
  5. data/install +3 -0
  6. data/lib/generators/ng.rb +1 -0
  7. data/lib/generators/ng/api_controller/USAGE +13 -0
  8. data/lib/generators/ng/api_controller/api_controller_generator.rb +29 -0
  9. data/lib/generators/ng/api_controller/templates/api_controller.rb +17 -0
  10. data/lib/generators/ng/api_controller/templates/index.json.jbuilder +4 -0
  11. data/lib/generators/ng/api_controller/templates/show.json.jbuilder +1 -0
  12. data/lib/generators/ng/base.rb +55 -0
  13. data/lib/generators/ng/directive/USAGE +9 -0
  14. data/lib/generators/ng/directive/directive_generator.rb +21 -0
  15. data/lib/generators/ng/directive/templates/directive.coffee +10 -0
  16. data/lib/generators/ng/directive/templates/directive.html +0 -0
  17. data/lib/generators/ng/form/USAGE +10 -0
  18. data/lib/generators/ng/form/form_generator.rb +27 -0
  19. data/lib/generators/ng/form/templates/form.html.erb +35 -0
  20. data/lib/generators/ng/form/templates/form_ctrl.coffee +6 -0
  21. data/lib/generators/ng/form/templates/spec.rb.erb +26 -0
  22. data/lib/generators/ng/index/USAGE +10 -0
  23. data/lib/generators/ng/index/index_generator.rb +33 -0
  24. data/lib/generators/ng/index/templates/index.html.erb +145 -0
  25. data/lib/generators/ng/index/templates/index_ctrl.coffee +19 -0
  26. data/lib/generators/ng/index/templates/spec.rb.erb +117 -0
  27. data/lib/generators/ng/resource/USAGE +8 -0
  28. data/lib/generators/ng/resource/resource_generator.rb +13 -0
  29. data/lib/generators/ng/resource/templates/resource.coffee +8 -0
  30. data/lib/generators/ng/show/USAGE +9 -0
  31. data/lib/generators/ng/show/show_generator.rb +23 -0
  32. data/lib/generators/ng/show/templates/show.html +20 -0
  33. data/lib/generators/ng/show/templates/show_ctrl.coffee +7 -0
  34. data/ngenerators.gemspec +18 -0
  35. metadata +91 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e3f3a9f583beaa3bacdc8c90aad48b955f8d3de7
4
+ data.tar.gz: 4dff109a532f6b5a8e113a5c7e0e6a6bd4ca5012
5
+ SHA512:
6
+ metadata.gz: 07fed6381de5cfacc70bc293b09371d510f02f3521f7bca0ce86079ea4b25c52c499b5420c4a033bc0d9ab8926449e781d20c0c1c5998134b2cbd4e18b767ef2
7
+ data.tar.gz: 4a2f734d2dad6eba336052c40d66585ee6d795a529d30cddc316affc3dcbf405c61546ac688f73ccdf1a549112148c93e069a2b4dcf56fcdcfec1e34eaf962c1
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1 @@
1
+ 2.1.2
@@ -0,0 +1,3 @@
1
+ # NGenerators
2
+
3
+ Rails Generators for AngularJS apps.
data/install ADDED
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+
3
+ gem build ngenerators.gemspec && gem install ngenerators-*.gem && rm ngenerators-*.gem
@@ -0,0 +1 @@
1
+ require 'generators/ng/base'
@@ -0,0 +1,13 @@
1
+ Description:
2
+ Generates Controller and Views for the API.
3
+
4
+ Example:
5
+ rails generate ng:api_controller client
6
+
7
+ This will create:
8
+ app/controllers/api/clients_controller.rb
9
+ app/views/api/clients/show.json.jbuilder
10
+ app/views/api/clients/index.json.jbuilder
11
+
12
+ Besides, it will update:
13
+ config/routes.rb
@@ -0,0 +1,29 @@
1
+ require 'generators/ng'
2
+
3
+ module Ng
4
+ module Generators
5
+ class ApiControllerGenerator < Base
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ def controller
9
+ template 'api_controller.rb', "app/controllers/api/#{plural_name}_controller.rb"
10
+ template 'show.json.jbuilder', "app/views/api/#{plural_name}/show.json.jbuilder"
11
+ template 'index.json.jbuilder', "app/views/api/#{plural_name}/index.json.jbuilder"
12
+ end
13
+
14
+ def route
15
+ inject_into_file 'config/routes.rb', after: /namespace :api.+do\n/ do
16
+ " resources :#{plural_name}, only: [:show, :index]\n"
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def symbolic_columns
23
+ klass.columns.map(&:name).map do |name|
24
+ ":#{name}"
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,17 @@
1
+ module Api
2
+ class <%= plural_name.camelize %>Controller < BaseController
3
+ <%- if options.model -%>
4
+ defaults resource_class: <%= options.model.try(:camelize) %>
5
+
6
+ <%- end -%>
7
+ <%- anothers = [] -%>
8
+ <%- klass.columns.each do |column| -%>
9
+ <%- if column.type == :date || column.type == :datetime -%>
10
+ has_scope :by_<%= column_name(column) %>, type: :hash, using: [:since, :until]
11
+ <%- else anothers << column end -%>
12
+ <%- end -%>
13
+ <%- if anothers.any? -%>
14
+ has_scope <%= anothers.map{ |col| ":by_#{column_name(col)}"}.join(', ') %>
15
+ <%- end -%>
16
+ end
17
+ end
@@ -0,0 +1,4 @@
1
+ json.array!(@<%= plural_name %>) do |<%= singular_name %>|
2
+ json.(<%= singular_name %>, <%= symbolic_columns.join(', ') %>)
3
+ json.count @count
4
+ end
@@ -0,0 +1 @@
1
+ json.(@<%= singular_name %>, <%= symbolic_columns.join(', ') %>)
@@ -0,0 +1,55 @@
1
+ module Ng
2
+ module Generators
3
+ class Base < ::Rails::Generators::NamedBase
4
+ class_option :model, type: :string, default: nil,
5
+ description: "The name of the model when it differs from model_name"
6
+
7
+ protected
8
+
9
+ def ng_singular_name
10
+ singular_name.camelize(:lower)
11
+ end
12
+
13
+ def ng_plural_name
14
+ plural_name.camelize(:lower)
15
+ end
16
+
17
+ def klass
18
+ @klass ||= (options.model.try(:camelize) || class_name).constantize
19
+ end
20
+
21
+ def i18n_human
22
+ klass.model_name.human
23
+ end
24
+
25
+ def column_name(column)
26
+ column.name.gsub(/_id$/, '').gsub(/^id_/, '')
27
+ end
28
+
29
+ def i18n_column(column)
30
+ klass.human_attribute_name(column_name(column))
31
+ end
32
+
33
+ def column_is_association?(column)
34
+ !!association_for(column)
35
+ end
36
+
37
+ def association_for(column)
38
+ all_belongs_to.detect { |bt| bt.foreign_key.to_s == column.name }
39
+ end
40
+
41
+ def all_belongs_to
42
+ klass.reflect_on_all_associations.select { |a| a.macro == :belongs_to }
43
+ end
44
+
45
+ def input_type(column)
46
+ column.klass < Numeric ? 'number' : 'text'
47
+ end
48
+
49
+ def inject_ng_route(&block)
50
+ inject_into_file 'app/assets/javascripts/ng/routes.coffee',
51
+ after: "$stateProvider\n", &block
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,9 @@
1
+ Description:
2
+ Generates AngularJS Directive
3
+
4
+ Example:
5
+ rails generate ng:directive my_directive
6
+
7
+ This will create:
8
+ app/assets/templates/directives/my-directive.html
9
+ app/assets/javascripts/ng/directives/my-directive.coffee
@@ -0,0 +1,21 @@
1
+ require 'generators/ng'
2
+
3
+ module Ng
4
+ module Generators
5
+ class DirectiveGenerator < Base
6
+ source_root File.expand_path('../templates', __FILE__)
7
+ class_option :template, type: :boolean, default: true, description: "Generate HTML template file"
8
+
9
+ def directive
10
+ template 'directive.coffee', "app/assets/javascripts/ng/directives/#{directive_name}.coffee"
11
+ template 'directive.html', "app/assets/templates/directives/#{directive_name}.html" if options.template?
12
+ end
13
+
14
+ protected
15
+
16
+ def directive_name
17
+ singular_name.gsub('_', '-')
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,10 @@
1
+ angular.module('<%= application_name %>')
2
+
3
+ .directive '<%= ng_singular_name %>', ->
4
+ restrict: 'AE'
5
+ <%- if options.template? -%>
6
+ templateUrl: "directives/<%= directive_name %>.html"
7
+ <%- else -%>
8
+ template: "<span></span>"
9
+ <%- end -%>
10
+ link: (scope) ->
@@ -0,0 +1,10 @@
1
+ Description:
2
+ Generates Form HTML view to be used with AngularJS
3
+
4
+ Example:
5
+ rails generate ng:form client
6
+
7
+ This will create:
8
+ app/assets/templates/clients/form.html.erb
9
+ app/assets/javascripts/ng/controllers/client_form_ctrl.coffee
10
+ spec/features/client_show_spec.rb
@@ -0,0 +1,27 @@
1
+ require 'generators/ng'
2
+
3
+ module Ng
4
+ module Generators
5
+ class FormGenerator < Base
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ def form
9
+ template 'form.html.erb', "app/assets/templates/#{plural_name}/form.html.erb"
10
+ template 'form_ctrl.coffee', "app/assets/javascripts/ng/controllers/#{singular_name}_form_ctrl.coffee"
11
+ end
12
+
13
+ def spec
14
+ template 'spec.rb.erb', "spec/features/#{singular_name}_show_spec.rb"
15
+ end
16
+
17
+ def route
18
+ inject_ng_route do
19
+ " .state '#{ng_singular_name}Form',\n"\
20
+ " controller: '#{class_name}FormCtrl'\n"\
21
+ " url: '/#{plural_name}/new'\n"\
22
+ " templateUrl: '#{plural_name}/form.html'\n\n"
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,35 @@
1
+ <div class="page-header">
2
+ <h1 ng-if="! <%= ng_singular_name %>.id">Novo <%= i18n_human %></h1>
3
+ <h1 ng-if=" <%= ng_singular_name %>.id"><%= i18n_human %> {{ <%= ng_singular_name %>.id }}</h1>
4
+ </div>
5
+
6
+ <form class="form-horizontal" ng-submit="<%= ng_singular_name %>.save()" name="form" novalidate>
7
+ <div class="form-inputs">
8
+ <%- klass.columns.each do |column| -%>
9
+ <%%# <%= i18n_column(column).upcase %> %>
10
+ <my-input label="<%= i18n_column(column) %>" required="false" for="<%= singular_name %>_<%= column_name(column) %>" id="<%= column_name(column) %>">
11
+ <%- if column_is_association? column -%>
12
+ <!-- USE THIS TO TYPEAHEAD -->
13
+ <input autocomplete="off" autofocus="autofocus" name="<%= column_name(column) %>" required
14
+ class="form-control" id="<%= singular_name %>_<%= column_name(column) %>" ng-model="<%= ng_singular_name %>.<%= column_name(column) %>"
15
+ type="text" typeahead-min-length="3" typeahead-wait-ms="250"
16
+ typeahead="<%= column_name(column) %> as <%= column_name(column) %>.name for <%= column_name(column) %> in <%= column_name(column).pluralize %>($viewValue)">
17
+ <!-- END OF TYPEAHEAD -->
18
+
19
+ <!-- USE THIS TO SELECT -->
20
+ <select class="form-control" id="<%= singular_name %>_<%= column.name %>" ng-model="<%= ng_singular_name %>.<%= column.name %>"
21
+ ng-options="<%= column_name(column) %>.name for <%= column_name(column) %> in <%= column_name(column).pluralize %> track by <%= column_name(column) %>.id">
22
+ </select>
23
+ <!-- END OF SELECT -->
24
+ <%- else -%>
25
+ <input class="form-control" id="<%= singular_name %>_<%= column.name %>"
26
+ type="<%= input_type(column) %>" ng-model="<%= ng_singular_name %>.<%= column.name %>">
27
+ <%- end -%>
28
+ </my-input>
29
+
30
+ <%- end -%>
31
+ </div>
32
+
33
+ <input class="btn btn-success" type="submit" value="Salvar" ng-disabled="form.$invalid">
34
+ <a class="btn btn-default" href="/">Cancelar</a>
35
+ </form>
@@ -0,0 +1,6 @@
1
+ angular.module('<%= application_name %>')
2
+
3
+ .controller '<%= class_name %>FormCtrl', ['$scope', '<%= class_name %>',
4
+ ($scope, <%= class_name %>) ->
5
+ $scope.<%= ng_singular_name %> = new <%= class_name %>()
6
+ ]
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe "<%= class_name %>#form", js: true, type: :feature do
4
+ let(:user) { create(:user) }
5
+ let(:path) { "/<%= plural_name %>/new" }
6
+
7
+ before do
8
+ sign_in user
9
+ end
10
+
11
+ it "saves new records" do
12
+ visit path
13
+
14
+ <%- klass.columns.each do |column| -%>
15
+ fill_in '<%= i18n_column(column) %>', with: '1'
16
+ <%- end -%>
17
+
18
+ expect do
19
+ click_button 'Salvar'
20
+ end.to change(<%= class_name %>, :count).by(1)
21
+ <%= singular_name %> = <%= class_name %>.last
22
+ <%- klass.columns.each do |column| -%>
23
+ expect(<%= singular_name %>.<%= column.name %>).to eq '1'
24
+ <%- end -%>
25
+ end
26
+ end
@@ -0,0 +1,10 @@
1
+ Description:
2
+ Generates Index HTML view to be used with AngularJS
3
+
4
+ Example:
5
+ rails generate ng:index client
6
+
7
+ This will create:
8
+ app/assets/templates/clients/index.html.erb
9
+ app/assets/javascripts/ng/controllers/clients_ctrl.coffee
10
+ spec/features/client_index_html_spec.rb
@@ -0,0 +1,33 @@
1
+ require 'generators/ng'
2
+
3
+ module Ng
4
+ module Generators
5
+ class IndexGenerator < Base
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ def index
9
+ template 'index.html.erb', "app/assets/templates/#{plural_name}/index.html.erb"
10
+ template 'index_ctrl.coffee', "app/assets/javascripts/ng/controllers/#{plural_name}_ctrl.coffee"
11
+ end
12
+
13
+ def spec
14
+ template 'spec.rb.erb', "spec/features/#{singular_name}_index_html_spec.rb"
15
+ end
16
+
17
+ def route
18
+ inject_ng_route do
19
+ " .state '#{ng_plural_name}',\n"\
20
+ " controller: '#{plural_name.camelize}Ctrl'\n"\
21
+ " url: '/#{plural_name}'\n"\
22
+ " templateUrl: '#{plural_name}/index.html'\n\n"
23
+ end
24
+ end
25
+
26
+ protected
27
+
28
+ def belongs_to_class_names
29
+ all_belongs_to.map(&:class_name)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,145 @@
1
+ <div class="page-header"><h1><%= i18n_human.pluralize(I18n.locale) %></h1></div>
2
+
3
+ <form ng-submit="searcher.search()" class="form-horizontal">
4
+ <%- klass.columns.each do |column| -%>
5
+ <%- next if column.name == klass.primary_key.to_s -%>
6
+ <%%# <%= i18n_column(column).upcase %> %>
7
+ <div class="form-group">
8
+ <%- ################################################ -%>
9
+ <%- # DATE / TIME FILTER -%>
10
+ <%- if column.klass == Date || column.klass == Time -%>
11
+ <div class="col-md-6">
12
+ <div class="row">
13
+ <label class="col-md-4 col-sm-2 col-xs-12 control-label" for="created_at_since"><%= i18n_column(column) %></label>
14
+ <div class="col-md-4 col-sm-5 col-xs-6">
15
+ <p class="input-group">
16
+ <input type="text" class="form-control" is-open="<%= column.name %>_since.active"
17
+ ng-model="filters['by_<%= column.name %>[since]']" close-text="Fechar"
18
+ datepicker-popup="dd/MM/yyyy" ng-init="<%= column.name %>_since = {active: false}"
19
+ current-text="Hoje" clear-text="Limpar" id="<%= column.name %>_since"
20
+ title="<%= I18n.t(:since) %>" />
21
+ <span class="input-group-btn">
22
+ <button type="button" class="btn btn-default"
23
+ ng-click="$event.preventDefault(); $event.stopPropagation(); <%= column.name %>_since.active = !<%= column.name %>_since.active)">
24
+ <i class="glyphicon glyphicon-calendar"></i>
25
+ </button>
26
+ </span>
27
+ </p>
28
+ </div>
29
+ <div class="col-md-4 col-sm-5 col-xs-6">
30
+ <p class="input-group">
31
+ <input type="text" class="form-control" is-open="<%= column.name %>_until.active"
32
+ ng-model="filters['by_<%= column.name %>[until]']" close-text="Fechar"
33
+ datepicker-popup="dd/MM/yyyy" ng-init="<%= column.name %>_until = {active: false}"
34
+ current-text="Hoje" clear-text="Limpar" id="<%= column.name %>_until"
35
+ title="<%= I18n.t(:until) %>" />
36
+ <span class="input-group-btn">
37
+ <button type="button" class="btn btn-default"
38
+ ng-click="$event.preventDefault(); $event.stopPropagation(); <%= column.name %>_until.active = !<%= column.name %>_until.active)">
39
+ <i class="glyphicon glyphicon-calendar"></i>
40
+ </button>
41
+ </span>
42
+ </p>
43
+ </div>
44
+ </div>
45
+ </div>
46
+ <%- else -%>
47
+ <label for="by_<%= column_name(column) %>" class="col-sm-2 control-label"><%= i18n_column(column) %></label>
48
+ <div class="col-sm-10" id="by_<%= column_name(column) %>_wrapper">
49
+ <%- ################################################ -%>
50
+ <%- # ASSOCIATION FILTER -%>
51
+ <%- if assoc = association_for(column) -%>
52
+ <!-- USE THIS TO TYPEAHEAD -->
53
+ <input autocomplete="off" autofocus="autofocus" name="<%= column_name(column) %>"
54
+ class="form-control" id="by_<%= column_name(column) %>" ng-model="filters.by_<%= column_name(column) %>"
55
+ type="text" typeahead-min-length="3" typeahead-wait-ms="250"
56
+ typeahead="<%= assoc.class_name.camelize(:lower) %> as <%= assoc.class_name.camelize(:lower) %>.description for <%= assoc.class_name.camelize(:lower) %> in <%= assoc.plural_name.camelize(:lower) %>($viewValue)">
57
+ <!-- END OF TYPEAHEAD -->
58
+ <!-- USE THIS TO SELECT -->
59
+ <select class="form-control" id="by_<%= column_name(column) %>" name="by_<%= column_name(column) %>" ng-model="filters.by_<%= column_name(column) %>"
60
+ ng-options="<%= assoc.class_name.camelize(:lower) %>.name for <%= assoc.class_name.camelize(:lower) %> in <%= assoc.plural_name.camelize(:lower) %> track by <%= assoc.class_name.camelize(:lower) %>.id">
61
+ <option value=""></option>
62
+ </select>
63
+ <!-- END OF SELECT -->
64
+ <%- ################################################ -%>
65
+ <%- # BOOLEAN FILTER -%>
66
+ <%- elsif column.type == :boolean -%>
67
+ <select class="form-control" id="by_<%= column_name(column) %>" name="by_<%= column_name(column) %>" ng-model="filters.by_<%= column_name(column) %>"
68
+ <option value=""></option>
69
+ <option value="true"><%= I18n.t(:yes) %></option>
70
+ <option value="false"><%= I18n.t(:no) %></option>
71
+ </select>
72
+ <%- ################################################ -%>
73
+ <%- else -%>
74
+ <input type="text" name="by_<%= column_name(column) %>" id="by_<%= column_name(column) %>" class="form-control"
75
+ ng-model="filters.by_<%= column_name(column) %>">
76
+ <%- end -%>
77
+ <%- ################################################ -%>
78
+ </div>
79
+ <%- end -%>
80
+ </div>
81
+
82
+ <%- end -%>
83
+ <div class="form-group">
84
+ <div class="col-sm-10 col-sm-offset-2">
85
+ <input class="btn btn-primary" name="commit" type="submit" value="Buscar">
86
+ <a class="btn-warning btn" ng-click="searcher.clear()" id="clear_filters" title="Limpar Filtros">
87
+ <span class="glyphicon glyphicon-remove"></span>
88
+ </a>
89
+ </div>
90
+ </div>
91
+ </form>
92
+
93
+ <small>
94
+ <table class="table table-striped table-hover table-bordered" id="<%= plural_name %>">
95
+ <tbody>
96
+ <tr>
97
+ <%- klass.columns.each do |column| -%>
98
+ <th<%= ' class="text-right"' if column.klass <= Numeric %>><%= i18n_column(column) %></th>
99
+ <%- end -%>
100
+ <th></th>
101
+ </tr>
102
+ <tr id="row_<%= singular_name %>_{{ <%= ng_singular_name %>.id }}" ng-repeat="<%= ng_singular_name %> in <%= ng_plural_name %>">
103
+ <td class="text-right">
104
+ <a ui-sref="<%= ng_singular_name %>({id: <%= ng_singular_name %>.id})" id="<%= singular_name %>_{{ <%= ng_singular_name %>.id }}_show">{{ <%= ng_singular_name %>.id }}</a></td>
105
+ <%- klass.columns.each do |column| -%>
106
+ <%- next if column.name == klass.primary_key.to_s -%>
107
+ <%- if column_is_association?(column) -%>
108
+ <td>{{ <%= ng_singular_name %>.<%= column_name(column).camelize(:lower) %>.name }}</td>
109
+ <%- elsif column.klass == Date || column.klass == Time -%>
110
+ <td>{{ <%= ng_singular_name %>.<%= column.name.camelize(:lower) %> | date }}</td>
111
+ <%- elsif column.klass <= Numeric -%>
112
+ <td class="text-right">{{ <%= ng_singular_name %>.<%= column.name.camelize(:lower) %> }}</td>
113
+ <%- else -%>
114
+ <td>{{ <%= ng_singular_name %>.<%= column.name.camelize(:lower) %> }}</td>
115
+ <%- end -%>
116
+ <%- end -%>
117
+ <td class="text-right">
118
+ <%%# VISUALIZAR %>
119
+ <a class="btn-info btn btn-xs" ui-sref="<%= ng_singular_name %>({ id: <%= ng_singular_name %>.id })"
120
+ id="show_<%= singular_name %>_{{ <%= ng_singular_name %>.id }}" title="Visualizar">
121
+ <span class="glyphicon glyphicon-search"></span></a>
122
+
123
+ <%%# ALTERAR %>
124
+ <a class="btn-warning btn btn-xs" ui-sref="edit<%= class_name %>({ id: <%= ng_singular_name %>.id })"
125
+ id="edit_<%= singular_name %>_{{ <%= ng_singular_name %>.id }}" title="Alterar" ng-show="<%= ng_singular_name %>.canUpdate">
126
+ <span class="glyphicon glyphicon-pencil"></span></a>
127
+ </td>
128
+ </tr>
129
+ </tbody>
130
+ </table>
131
+ </small>
132
+
133
+ <div class="row">
134
+ <div class="col-sm-6">
135
+ <pagination total-items="count" ng-model="filters.page"
136
+ direction-links="false" boundary-links="true" rotate="false"
137
+ items-per-page="<%= klass.default_per_page %>" ng-change="searcher.search()"
138
+ max-size="5" first-text="<%= I18n.t('views.pagination.first') %>" last-text="<%= I18n.t('views.pagination.last') %>"></pagination>
139
+ </div>
140
+ <div class="col-sm-6">
141
+ <p class="text-right">
142
+ Exibindo <b>{{ <%= ng_plural_name %>.length }}</b> de <b>{{ count }}</b>
143
+ </p>
144
+ </div>
145
+ </div>
@@ -0,0 +1,19 @@
1
+ angular.module('<%= application_name %>')
2
+
3
+ .controller '<%= plural_name.camelize %>Ctrl', ['$scope', 'searcher', <%= ([class_name] + belongs_to_class_names).map{ |k| "'#{k}'"}.join(', ') %>
4
+ ($scope, searcher, <%= ([class_name] + belongs_to_class_names).join(', ') %>) ->
5
+ $scope.searcher = searcher($scope, <%= class_name %>, '<%= ng_plural_name %>')
6
+ <%- klass.columns.each do |column| -%>
7
+
8
+ <%- if (assoc = association_for(column)) -%>
9
+ # FOR TYPEAHEAD
10
+ $scope.<%= assoc.plural_name %> = (filter) ->
11
+ <%= assoc.class_name %>.$get(<%= assoc.class_name %>.$url('ahead'), by_name: filter)
12
+ # END OF TYPEAHEAD
13
+ # FOR SELECT
14
+ <%= assoc.class_name %>.query().then (<%= assoc.plural_name.camelize(:lower) %>) ->
15
+ $scope.<%= assoc.plural_name.camelize(:lower) %> = <%= assoc.plural_name.camelize(:lower) %>
16
+ # END OF SELECT
17
+ <%- end -%>
18
+ <%- end -%>
19
+ ]
@@ -0,0 +1,117 @@
1
+ require 'spec_helper'
2
+
3
+ describe "<%= class_name %>#index", js: true do
4
+ let(:user) { create(:<%= singular_name %>_reader_user) }
5
+ let(:index) { '/<%= plural_name %>' }
6
+
7
+ before do
8
+ sign_in user
9
+ end
10
+
11
+ it "presents <%= plural_name.gsub('_', ' ') %>" do
12
+ <%= singular_name %>1 = create :<%= singular_name %>
13
+ <%= singular_name %>2 = create :<%= singular_name %>
14
+
15
+ visit index
16
+
17
+ expect(page).to have_content(<%= singular_name %>1.name)
18
+ expect(page).to have_content(<%= singular_name %>2.name)
19
+ end
20
+
21
+ it "links to details" do
22
+ <%= singular_name %>1 = create :<%= singular_name %>
23
+
24
+ visit index
25
+ click_link "<%= singular_name %>_#{<%= singular_name %>1.id}_show"
26
+
27
+ expect(page ).to have_content('Detalhes')
28
+ expect(current_path).to eq "#{index}/#{<%= singular_name %>1.id}"
29
+ end
30
+
31
+ <%- klass.columns.each do |column| -%>
32
+ it "filters by <%= assoc.name.gsub('_', ' ') %>" do
33
+ <%- ################################################ -%>
34
+ <%- # TESTING ASSOCIATION FILTER -%>
35
+ <%- if assoc = association_for(column) -%>
36
+ <%= assoc.name %>1 = create :<%= assoc.class_name.underscore %>
37
+ <%= assoc.name %>2 = create :<%= assoc.class_name.underscore %>
38
+ <%= singular_name %>1 = create :<%= singular_name %>, <%= assoc.name %>: <%= assoc.name %>1
39
+ <%= singular_name %>2 = create :<%= singular_name %>, <%= assoc.name %>: <%= assoc.name %>2
40
+
41
+ visit index
42
+ # FOR TYPEAHEAD
43
+ fill_in_typeahead '<%= i18n_column(column) %>', <%= assoc.name %>1.name,
44
+ find('#by_<%= column_name(column) %>_wrapper')
45
+ # FOR SELECT
46
+ #select <%= assoc.name %>1.name, from: '<%= i18n_column(column) %>'
47
+ click_button 'Buscar'
48
+
49
+ expect(page).to_not have_content(<%= singular_name %>2.name)
50
+ expect(page).to have_content(<%= singular_name %>1.name)
51
+ <%- ################################################ -%>
52
+ <%- # TESTING INTEGER FILTER -%>
53
+ <%- elsif column.type == :integer -%>
54
+ <%= singular_name %>1 = create :<%= singular_name %>, <%= column.name %>: 1
55
+ <%= singular_name %>2 = create :<%= singular_name %>, <%= column.name %>: 2
56
+
57
+ visit index
58
+ fill_in '<%= i18n_column(column) %>', with: 1
59
+ click_button 'Buscar'
60
+
61
+ expect(page).to_not have_content(<%= singular_name %>2.name)
62
+ expect(page).to have_content(<%= singular_name %>1.name)
63
+ <%- ################################################ -%>
64
+ <%- # TESTING STRING FILTER -%>
65
+ <%- elsif column.type == :string -%>
66
+ <%= singular_name %>1 = create :<%= singular_name %>, <%= column.name %>: 'ABCD'
67
+ <%= singular_name %>2 = create :<%= singular_name %>, <%= column.name %>: 'EFGH'
68
+
69
+ visit index
70
+ fill_in '<%= i18n_column(column) %>', with: 'bc'
71
+ click_button 'Buscar'
72
+
73
+ expect(page).to_not have_content(<%= singular_name %>2.name)
74
+ expect(page).to have_content(<%= singular_name %>1.name)
75
+ <%- ################################################ -%>
76
+ <%- # TESTING BOOLEAN FILTER -%>
77
+ <%- elsif column.type == :boolean -%>
78
+ <%= singular_name %>1 = create :<%= singular_name %>, <%= column.name %>: false
79
+ <%= singular_name %>2 = create :<%= singular_name %>, <%= column.name %>: true
80
+
81
+ visit index
82
+ select '<%= I18n.t(:no) %>', from: '<%= i18n_column(column) %>'
83
+ click_button 'Buscar'
84
+
85
+ expect(page).to_not have_content(<%= singular_name %>2.name)
86
+ expect(page).to have_content(<%= singular_name %>1.name)
87
+
88
+ select '<%= I18n.t(:yes) %>', from: '<%= i18n_column(column) %>'
89
+ click_button 'Buscar'
90
+
91
+ expect(page).to_not have_content(<%= singular_name %>1.name)
92
+ expect(page).to have_content(<%= singular_name %>2.name)
93
+ <%- ################################################ -%>
94
+ <%- # TESTING DATE FILTER -%>
95
+ <%- elsif column.type == :date || column.type == :datetime -%>
96
+ <%= singular_name %>1 = create :<%= singular_name %>, <%= column.name %>: 1.day.ago
97
+ <%= singular_name %>2 = create :<%= singular_name %>, <%= column.name %>: Date.today
98
+
99
+ visit index
100
+ fill_in '<%= column.name %>_until', with: I18n.l(<%= singular_name %>1.<%= column.name %>)
101
+ click_button 'Buscar'
102
+
103
+ expect(page).to_not have_content(<%= singular_name %>2.name)
104
+ expect(page).to have_content(<%= singular_name %>1.name)
105
+
106
+ fill_in '<%= column.name %>_until', with: ''
107
+ fill_in '<%= column.name %>_since', with: I18n.l(<%= singular_name %>2.<%= column.name %>)
108
+ click_button 'Buscar'
109
+
110
+ expect(page).to_not have_content(<%= singular_name %>1.name)
111
+ expect(page).to have_content(<%= singular_name %>2.name)
112
+ <%- end -%>
113
+ <%- ################################################ -%>
114
+ end
115
+
116
+ <%- end -%>
117
+ end
@@ -0,0 +1,8 @@
1
+ Description:
2
+ Generates JS Rails Resource to be used with AngularJS
3
+
4
+ Example:
5
+ rails generate ng:resource client
6
+
7
+ This will create:
8
+ app/assets/javascripts/ng/resources/client.coffee
@@ -0,0 +1,13 @@
1
+ require 'generators/ng'
2
+
3
+ module Ng
4
+ module Generators
5
+ class ResourceGenerator < Base
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ def show
9
+ template 'resource.coffee', "app/assets/javascripts/ng/resources/#{singular_name}.coffee"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,8 @@
1
+ angular.module('<%= application_name %>')
2
+
3
+ .factory '<%= class_name %>', ['RailsResource', (RailsResource) ->
4
+ class <%= class_name %> extends RailsResource
5
+ @configure
6
+ url: '/api/<%= plural_name %>'
7
+ name: '<%= singular_name %>'
8
+ ]
@@ -0,0 +1,9 @@
1
+ Description:
2
+ Generates HTML views to be used with AngularJS
3
+
4
+ Example:
5
+ rails generate ng:show client
6
+
7
+ This will create:
8
+ app/assets/templates/clients/show.html
9
+ app/assets/javascripts/ng/controllers/client_ctrl.coffee
@@ -0,0 +1,23 @@
1
+ require 'generators/ng'
2
+
3
+ module Ng
4
+ module Generators
5
+ class ShowGenerator < Base
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ def show
9
+ template 'show.html', "app/assets/templates/#{plural_name}/show.html"
10
+ template 'show_ctrl.coffee', "app/assets/javascripts/ng/controllers/#{singular_name}_ctrl.coffee"
11
+ end
12
+
13
+ def route
14
+ inject_into_file 'app/assets/javascripts/ng/routes.coffee', after: "$stateProvider\n" do
15
+ " .state '#{ng_singular_name}',\n"\
16
+ " controller: '#{class_name}Ctrl'\n"\
17
+ " url: '/#{plural_name}/:id'\n"\
18
+ " templateUrl: '#{plural_name}/show.html'\n\n"
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,20 @@
1
+ <div class="page-header">
2
+ <h1><%= i18n_human %> {{ <%= ng_singular_name %>.id }}</h1>
3
+ </div>
4
+
5
+ <dl class="dl-horizontal" id="<%= singular_name %>_{{ <%= ng_singular_name %>.id }}">
6
+ <%- klass.columns.each do |column| -%>
7
+ <span class="wrapper <%= singular_name %>_<%= column.name %>">
8
+ <dt><%= i18n_column(column) %></dt>
9
+ <dd class="content"><%- if (assoc = association_for(column)) -%>
10
+ {{ <%= ng_singular_name %>.<%= assoc.name.camelize(:lower) %>.name }}
11
+ <%- else -%>
12
+ {{ <%= ng_singular_name %>.<%= column.name.camelize(:lower) %> <%= ' | date' if column.type == :date || column.type == :datetime %> }}
13
+ <%- end -%></dd>
14
+ </span>
15
+
16
+ <%- end -%>
17
+ </dl>
18
+
19
+ <a class="btn btn-default" ui-sref="<%= ng_plural_name %>">
20
+ <span class="glyphicon glyphicon-arrow-left"></span> <%= I18n.t('helpers.links.back') %></a>
@@ -0,0 +1,7 @@
1
+ angular.module('<%= application_name %>')
2
+
3
+ .controller '<%= class_name %>Ctrl', ['$scope', '$stateParams', '<%= class_name %>',
4
+ ($scope, $stateParams, <%= class_name %>) ->
5
+ <%= class_name %>.get({ id: $stateParams.id }).then (<%= ng_singular_name %>) ->
6
+ $scope.<%= ng_singular_name %> = <%= ng_singular_name %>
7
+ ]
@@ -0,0 +1,18 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'ngenerators'
3
+ s.version = '0.0.1'
4
+ s.date = '2014-10-02'
5
+ s.summary = "Rails Generators for AngularJS."
6
+ s.description = "This gem provides generators which generate AngularJS views,"\
7
+ " controllers and resources for AngularJS."
8
+ s.authors = ["Diego Aguir Selzlein"]
9
+ s.email = 'diegoselzlein@gmail.com'
10
+
11
+ s.files = `git ls-files`.split("\n")
12
+ s.require_paths = ["lib"]
13
+
14
+ s.homepage = 'https://github.com/nerde/ngenerators'
15
+ s.license = 'MIT'
16
+
17
+ s.add_dependency('i18n', '~> 0')
18
+ end
metadata ADDED
@@ -0,0 +1,91 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ngenerators
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Diego Aguir Selzlein
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-10-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: i18n
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: This gem provides generators which generate AngularJS views, controllers
28
+ and resources for AngularJS.
29
+ email: diegoselzlein@gmail.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - ".rspec"
35
+ - ".ruby-version"
36
+ - README.md
37
+ - install
38
+ - lib/generators/ng.rb
39
+ - lib/generators/ng/api_controller/USAGE
40
+ - lib/generators/ng/api_controller/api_controller_generator.rb
41
+ - lib/generators/ng/api_controller/templates/api_controller.rb
42
+ - lib/generators/ng/api_controller/templates/index.json.jbuilder
43
+ - lib/generators/ng/api_controller/templates/show.json.jbuilder
44
+ - lib/generators/ng/base.rb
45
+ - lib/generators/ng/directive/USAGE
46
+ - lib/generators/ng/directive/directive_generator.rb
47
+ - lib/generators/ng/directive/templates/directive.coffee
48
+ - lib/generators/ng/directive/templates/directive.html
49
+ - lib/generators/ng/form/USAGE
50
+ - lib/generators/ng/form/form_generator.rb
51
+ - lib/generators/ng/form/templates/form.html.erb
52
+ - lib/generators/ng/form/templates/form_ctrl.coffee
53
+ - lib/generators/ng/form/templates/spec.rb.erb
54
+ - lib/generators/ng/index/USAGE
55
+ - lib/generators/ng/index/index_generator.rb
56
+ - lib/generators/ng/index/templates/index.html.erb
57
+ - lib/generators/ng/index/templates/index_ctrl.coffee
58
+ - lib/generators/ng/index/templates/spec.rb.erb
59
+ - lib/generators/ng/resource/USAGE
60
+ - lib/generators/ng/resource/resource_generator.rb
61
+ - lib/generators/ng/resource/templates/resource.coffee
62
+ - lib/generators/ng/show/USAGE
63
+ - lib/generators/ng/show/show_generator.rb
64
+ - lib/generators/ng/show/templates/show.html
65
+ - lib/generators/ng/show/templates/show_ctrl.coffee
66
+ - ngenerators.gemspec
67
+ homepage: https://github.com/nerde/ngenerators
68
+ licenses:
69
+ - MIT
70
+ metadata: {}
71
+ post_install_message:
72
+ rdoc_options: []
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ requirements: []
86
+ rubyforge_project:
87
+ rubygems_version: 2.2.2
88
+ signing_key:
89
+ specification_version: 4
90
+ summary: Rails Generators for AngularJS.
91
+ test_files: []