record_collection 0.5.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +88 -3
- data/lib/generators/collection_scaffold/collection_scaffold_generator.rb +94 -0
- data/lib/generators/collection_scaffold/templates/_form.html.haml +8 -0
- data/lib/generators/collection_scaffold/templates/_form.html.slim +8 -0
- data/lib/generators/collection_scaffold/templates/collection.rb +7 -0
- data/lib/generators/collection_scaffold/templates/collection_edit.html.haml +10 -0
- data/lib/generators/collection_scaffold/templates/collection_edit.html.slim +10 -0
- data/lib/generators/collection_scaffold/templates/controller.rb +83 -0
- data/lib/generators/collection_scaffold/templates/create_table_migration.rb +22 -0
- data/lib/generators/collection_scaffold/templates/edit.html.haml +7 -0
- data/lib/generators/collection_scaffold/templates/edit.html.slim +7 -0
- data/lib/generators/collection_scaffold/templates/index.html.haml +26 -0
- data/lib/generators/collection_scaffold/templates/index.html.slim +26 -0
- data/lib/generators/collection_scaffold/templates/model.rb +13 -0
- data/lib/generators/collection_scaffold/templates/new.html.haml +6 -0
- data/lib/generators/collection_scaffold/templates/new.html.slim +6 -0
- data/lib/generators/collection_scaffold/templates/show.html.haml +10 -0
- data/lib/generators/collection_scaffold/templates/show.html.slim +10 -0
- data/lib/record_collection/base.rb +4 -0
- data/lib/record_collection/rails/form_options_helper.rb +9 -0
- data/lib/record_collection/version.rb +1 -1
- data/record_collection.gemspec +1 -0
- data/spec/base/finding_records_spec.rb +7 -0
- data/spec/dummy/app/assets/javascripts/application.js.coffee +5 -1
- data/spec/dummy/app/views/employees/index.html.slim +5 -2
- data/spec/dummy/config/locales/record_collection.en.yml +17 -0
- metadata +33 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 97111669c3034b55d12ce281bb8131ad3e92b4e1
|
4
|
+
data.tar.gz: 47b7bf620af4113c183775031662e166645ec12f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 797dc853281125a3b7c5b35a26168d5f073d6c8b0a0f1d0625f1a4c06a4be17d9a0a6754e800768865ffb19e8c4aa83b3ed6aaf6a025f32ee1cadcf6d53c1fcf
|
7
|
+
data.tar.gz: 6beb6733aad0b2fcc1eedfc69ab1788f9bf6317898152c4a86ec5e82b047d210c0c6e9dec07f44e5403244665ff4deec5aa96a097027661550a7ac41e5738704
|
data/README.md
CHANGED
@@ -107,6 +107,19 @@ class MyAwesomeCollection < RecordCollection::Base
|
|
107
107
|
end
|
108
108
|
```
|
109
109
|
|
110
|
+
### The `after_record_update` hook
|
111
|
+
The collection implements a general `update(attributes)` method that will
|
112
|
+
update all the attributes that are set in the collection on the records it contains.
|
113
|
+
If you want to trigger a conditional for example a state machine trigger, you can do it like:
|
114
|
+
|
115
|
+
```ruby
|
116
|
+
class Project::Prince2::Collection < RecordCollection::Base
|
117
|
+
after_record_update do |record|
|
118
|
+
record.is_planned! if record.plan_date.present?
|
119
|
+
end
|
120
|
+
end
|
121
|
+
```
|
122
|
+
|
110
123
|
## Defining your controllers
|
111
124
|
If you already used the specification `collection_resources :employees` in
|
112
125
|
your [config/routes.rb](spec/dummy/config/routes.rb) file you can add
|
@@ -202,7 +215,8 @@ table.with-selection
|
|
202
215
|
Note that each row needs a json version of the record at least
|
203
216
|
containing its id.<br>
|
204
217
|
Implement the multiselect dependencies in your manifest files, typically
|
205
|
-
being
|
218
|
+
being
|
219
|
+
[app/assets/javascripts/application.js](spec/dummy/app/assets/javascriptss/application.js.coffee):
|
206
220
|
```javascript
|
207
221
|
//= require record_collection/multi_select
|
208
222
|
// Or require record_collection/all for all components
|
@@ -232,7 +246,44 @@ $(function(){
|
|
232
246
|
```
|
233
247
|
|
234
248
|
You can also apply it to dynamically loaded html replacing document for
|
235
|
-
the html added to your page
|
249
|
+
the html added to your page:
|
250
|
+
```javascript
|
251
|
+
$.get('/ajax-page.html', function(response){
|
252
|
+
$('#ajax-container').html(response);
|
253
|
+
$('#ajax-container').multi_select();
|
254
|
+
});
|
255
|
+
```
|
256
|
+
### The selection action button
|
257
|
+
Selecting records from the tabble is the first step. Then going to the
|
258
|
+
edit page to edit the selection is another. At the moment there is not
|
259
|
+
yet a standardized solution in the `record_collection` gem, but with
|
260
|
+
your suggestions there will be one in the future. A current method can
|
261
|
+
be:
|
262
|
+
```slim
|
263
|
+
table.with-selection
|
264
|
+
...
|
265
|
+
tfoot
|
266
|
+
tr
|
267
|
+
td
|
268
|
+
button#selected-records-action Actions
|
269
|
+
```
|
270
|
+
And in your [app/assets/javascripts/application.js.coffee](spec/dummy/app/assets/javascriptss/application.js.coffee)
|
271
|
+
```coffeescript
|
272
|
+
$ ->
|
273
|
+
if selector = $(document).multi_select()
|
274
|
+
$('#selected-records-action').click ->
|
275
|
+
ids = selector.selected_ids()
|
276
|
+
return alert "No records selected" unless ids.length
|
277
|
+
window.location = "/employees/collection_edit?#{$.param(ids: ids)}"
|
278
|
+
```
|
279
|
+
This indicates the controll you can implement on your collectoins.
|
280
|
+
Another way could be to use the less advicable way when the
|
281
|
+
[js-routes](https://github.com/railsware/js-routes) gem is added to just
|
282
|
+
have a button like:
|
283
|
+
```html
|
284
|
+
<button onclick="window.location = Routes.collection_edit_employees_path({ids: MultiSelect.selected_ids()})">Actions</button>
|
285
|
+
```
|
286
|
+
without any extra javascript.
|
236
287
|
|
237
288
|
## Optionals
|
238
289
|
![Screenshot](docs/screenshot-optionals-1.png?raw=true)
|
@@ -283,7 +334,41 @@ en:
|
|
283
334
|
collection:
|
284
335
|
create: "Update %{model}"
|
285
336
|
```
|
286
|
-
|
337
|
+
|
338
|
+
## Generators
|
339
|
+
There is a scaffold generator available for collection resources. The
|
340
|
+
behaviour is very similar to the normal scaffold generator:
|
341
|
+
```bash
|
342
|
+
rails g collection_scaffold Project name:string finished:boolean description:text
|
343
|
+
```
|
344
|
+
|
345
|
+
This will generate the routes, model, migration, collection model and
|
346
|
+
views.
|
347
|
+
|
348
|
+
<b>NOTE:</b> At the moment only haml support for generated views.
|
349
|
+
Also note that the generators make an assumption about having the
|
350
|
+
following translations available:
|
351
|
+
```yml
|
352
|
+
en:
|
353
|
+
action:
|
354
|
+
create:
|
355
|
+
successful: Successfully created %{model}
|
356
|
+
update:
|
357
|
+
successful: Successfully updated %{model}
|
358
|
+
collection_update:
|
359
|
+
successful: Successfully updated %{model} collection
|
360
|
+
destroy:
|
361
|
+
successful: Successfully destroyed %{model}
|
362
|
+
new:
|
363
|
+
link: New
|
364
|
+
index:
|
365
|
+
link: Back
|
366
|
+
edit:
|
367
|
+
link: Edit
|
368
|
+
show:
|
369
|
+
link: Show
|
370
|
+
```
|
371
|
+
|
287
372
|
## Special thanks
|
288
373
|
|
289
374
|
Special thanks for this project goes to:<br>
|
@@ -0,0 +1,94 @@
|
|
1
|
+
class CollectionScaffoldGenerator < Rails::Generators::NamedBase
|
2
|
+
source_root File.expand_path("../templates", __FILE__)
|
3
|
+
include Rails::Generators::Migration
|
4
|
+
include Rails::Generators::ResourceHelpers
|
5
|
+
|
6
|
+
check_class_collision suffix: "Controller"
|
7
|
+
|
8
|
+
class_option :orm, banner: "NAME", type: :string, required: true,
|
9
|
+
desc: "ORM to generate the controller for"
|
10
|
+
argument :attributes, type: :array, default: [], banner: "field:type field:type"
|
11
|
+
|
12
|
+
def create_route
|
13
|
+
route "collection_resources :#{plural_name}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_controller_files
|
17
|
+
template "controller.rb", File.join('app/controllers', controller_class_path, "#{controller_file_name}_controller.rb")
|
18
|
+
end
|
19
|
+
|
20
|
+
def create_model_file
|
21
|
+
template 'model.rb', File.join('app/models', class_path, "#{file_name}.rb")
|
22
|
+
end
|
23
|
+
|
24
|
+
def create_collection_file
|
25
|
+
template 'collection.rb', File.join('app/models', class_path, file_name, "collection.rb")
|
26
|
+
end
|
27
|
+
|
28
|
+
def create_root_folder
|
29
|
+
empty_directory File.join("app/views", controller_file_path)
|
30
|
+
end
|
31
|
+
|
32
|
+
def copy_view_files
|
33
|
+
available_views.each do |view|
|
34
|
+
formats.each do |format|
|
35
|
+
filename = filename_with_extensions(view, format)
|
36
|
+
template filename, File.join("app/views", controller_file_path, filename)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def create_migration_file
|
42
|
+
migration_template "create_table_migration.rb", "db/migrate/create_#{table_name}.rb"
|
43
|
+
end
|
44
|
+
|
45
|
+
class << self
|
46
|
+
# Implement the required interface for Rails::Generators::Migration.
|
47
|
+
# taken for record collection from: activerecord/lib/rails/generators/active_record/migration.rb
|
48
|
+
def next_migration_number(dirname)
|
49
|
+
next_migration_number = current_migration_number(dirname) + 1
|
50
|
+
ActiveRecord::Migration.next_migration_number(next_migration_number)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
protected
|
55
|
+
|
56
|
+
# taken from
|
57
|
+
# activerecord/lib/rails/generators/active_record/model/model_generator.rb
|
58
|
+
def attributes_with_index
|
59
|
+
attributes.select { |a| !a.reference? && a.has_index? }
|
60
|
+
end
|
61
|
+
|
62
|
+
# taken from
|
63
|
+
# activerecord/lib/rails/generators/active_record/model/model_generator.rb
|
64
|
+
def accessible_attributes
|
65
|
+
attributes.reject(&:reference?)
|
66
|
+
end
|
67
|
+
|
68
|
+
def collection_type_addition_for(attribute)
|
69
|
+
case attribute.type
|
70
|
+
when :boolean then ", type: Boolean"
|
71
|
+
else ''
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def parent_class_name
|
76
|
+
options[:parent] || "ActiveRecord::Base"
|
77
|
+
end
|
78
|
+
|
79
|
+
def available_views
|
80
|
+
%w(index edit show new _form collection_edit)
|
81
|
+
end
|
82
|
+
|
83
|
+
def formats
|
84
|
+
[:html]
|
85
|
+
end
|
86
|
+
|
87
|
+
def handler
|
88
|
+
"Slim".safe_constantize ? :slim : :haml
|
89
|
+
end
|
90
|
+
|
91
|
+
def filename_with_extensions(view, format)
|
92
|
+
[view, format, handler].compact.join('.')
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
= form_for @<%= singular_table_name %> do |f|
|
2
|
+
/ Error messages
|
3
|
+
<% for attribute in attributes -%>
|
4
|
+
.form-row
|
5
|
+
.form-label= f.label :<%= attribute.name %>
|
6
|
+
.form-field= f.<%= attribute.field_type %> :<%= attribute.name %>
|
7
|
+
<% end -%>
|
8
|
+
.form-actions= f.submit 'Save'
|
@@ -0,0 +1,8 @@
|
|
1
|
+
= form_for @<%= singular_table_name %> do |f|
|
2
|
+
/ Error messages
|
3
|
+
<% for attribute in attributes -%>
|
4
|
+
.form-row
|
5
|
+
.form-label= f.label :<%= attribute.name %>
|
6
|
+
.form-field= f.<%= attribute.field_type %> :<%= attribute.name %>
|
7
|
+
<% end -%>
|
8
|
+
.form-actions= f.submit 'Save'
|
@@ -0,0 +1,10 @@
|
|
1
|
+
= form_for @collection, url: [:collection_update, @collection] do |f|
|
2
|
+
= f.collection_ids
|
3
|
+
/ Error messages
|
4
|
+
<% for attribute in attributes -%>
|
5
|
+
.form-row= f.optional_<%= attribute.field_type %> :<%= attribute.name %>
|
6
|
+
<% end -%>
|
7
|
+
.form-actions= f.submit 'Save'
|
8
|
+
|
9
|
+
.page-actions
|
10
|
+
= link_to t('action.index.link', model: <%= class_name %>.model_name.human), <%= index_helper %>_path, class: 'to-index-button'
|
@@ -0,0 +1,10 @@
|
|
1
|
+
= form_for @collection, url: [:collection_update, @collection] do |f|
|
2
|
+
= f.collection_ids
|
3
|
+
/ Error messages
|
4
|
+
<% for attribute in attributes -%>
|
5
|
+
.form-row= f.optional_<%= attribute.field_type %> :<%= attribute.name %>
|
6
|
+
<% end -%>
|
7
|
+
.form-actions= f.submit 'Save'
|
8
|
+
|
9
|
+
.page-actions
|
10
|
+
= link_to t('action.index.link', model: <%= class_name %>.model_name.human), <%= index_helper %>_path, class: 'to-index-button'
|
@@ -0,0 +1,83 @@
|
|
1
|
+
<% if namespaced? -%>
|
2
|
+
require_dependency "<%= namespaced_file_path %>/application_controller"
|
3
|
+
|
4
|
+
<% end -%>
|
5
|
+
<% module_namespacing do -%>
|
6
|
+
class <%= controller_class_name %>Controller < ApplicationController
|
7
|
+
before_action :set_<%= singular_table_name %>, only: [:show, :edit, :update, :destroy]
|
8
|
+
|
9
|
+
# GET <%= route_url %>
|
10
|
+
def index
|
11
|
+
@<%= plural_table_name %> = <%= orm_class.all(class_name) %>
|
12
|
+
end
|
13
|
+
|
14
|
+
# GET <%= route_url %>/1
|
15
|
+
def show
|
16
|
+
end
|
17
|
+
|
18
|
+
# GET <%= route_url %>/new
|
19
|
+
def new
|
20
|
+
@<%= singular_table_name %> = <%= orm_class.build(class_name) %>
|
21
|
+
end
|
22
|
+
|
23
|
+
# GET <%= route_url %>/1/edit
|
24
|
+
def edit
|
25
|
+
end
|
26
|
+
|
27
|
+
# POST <%= route_url %>
|
28
|
+
def create
|
29
|
+
@<%= singular_table_name %> = <%= orm_class.build(class_name, "#{singular_table_name}_params") %>
|
30
|
+
|
31
|
+
if @<%= orm_instance.save %>
|
32
|
+
redirect_to @<%= singular_table_name %>, notice: t('action.create.successful', model: <%= class_name %>.model_name.human)
|
33
|
+
else
|
34
|
+
render :new
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# PATCH/PUT <%= route_url %>/1
|
39
|
+
def update
|
40
|
+
if @<%= orm_instance.update("#{singular_table_name}_params") %>
|
41
|
+
redirect_to @<%= singular_table_name %>, notice: t('action.update.successful', model: <%= class_name %>.model_name.human)
|
42
|
+
else
|
43
|
+
render :edit
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# DELETE <%= route_url %>/1
|
48
|
+
def destroy
|
49
|
+
@<%= orm_instance.destroy %>
|
50
|
+
redirect_to <%= index_helper %>_url, notice: t('action.destroy.successful', model: <%= class_name %>.model_name.human)
|
51
|
+
end
|
52
|
+
|
53
|
+
# GET <%= route_url %>/collection_edit
|
54
|
+
def collection_edit
|
55
|
+
@collection = <%= class_name %>::Collection.find(params[:ids])
|
56
|
+
end
|
57
|
+
|
58
|
+
# GET <%= route_url %>/collection_edit
|
59
|
+
def collection_update
|
60
|
+
@collection = <%= class_name %>::Collection.find(params[:ids])
|
61
|
+
if @collection.update params[:collection]
|
62
|
+
redirect_to <%= index_helper %>_url, notice: t('action.collection_update.successful', model: <%= class_name %>.model_name.human)
|
63
|
+
else
|
64
|
+
render :collection_edit
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
# Use callbacks to share common setup or constraints between actions.
|
70
|
+
def set_<%= singular_table_name %>
|
71
|
+
@<%= singular_table_name %> = <%= orm_class.find(class_name, "params[:id]") %>
|
72
|
+
end
|
73
|
+
|
74
|
+
# Only allow a trusted parameter "white list" through.
|
75
|
+
def <%= "#{singular_table_name}_params" %>
|
76
|
+
<%- if attributes_names.empty? -%>
|
77
|
+
params[:<%= singular_table_name %>]
|
78
|
+
<%- else -%>
|
79
|
+
params.require(:<%= singular_table_name %>).permit(<%= attributes_names.map { |name| ":#{name}" }.join(', ') %>)
|
80
|
+
<%- end -%>
|
81
|
+
end
|
82
|
+
end
|
83
|
+
<% end -%>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class <%= migration_class_name %> < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
create_table :<%= table_name %> do |t|
|
4
|
+
<% attributes.each do |attribute| -%>
|
5
|
+
<% if attribute.password_digest? -%>
|
6
|
+
t.string :password_digest<%= attribute.inject_options %>
|
7
|
+
<% else -%>
|
8
|
+
t.<%= attribute.type %> :<%= attribute.name %><%= attribute.inject_options %>
|
9
|
+
<% end -%>
|
10
|
+
<% end -%>
|
11
|
+
<% if options[:timestamps] %>
|
12
|
+
t.timestamps null: false
|
13
|
+
<% end -%>
|
14
|
+
end
|
15
|
+
<% attributes_with_index.each do |attribute| -%>
|
16
|
+
add_index :<%= table_name %>, :<%= attribute.index_name %><%= attribute.inject_index_options %>
|
17
|
+
<% end -%>
|
18
|
+
<% attributes.select(&:reference?).reject(&:polymorphic?).each do |attribute| -%>
|
19
|
+
add_foreign_key :<%= table_name %>, :<%= attribute.name.pluralize %>
|
20
|
+
<% end -%>
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
-#= page_title :edit, <%= class_name %>
|
2
|
+
|
3
|
+
= render 'form'
|
4
|
+
|
5
|
+
.page-links
|
6
|
+
= link_to t('action.index.link', model: <%= class_name %>.model_name.human), <%= index_helper %>_path, class: 'to-index-button'
|
7
|
+
= link_to t('action.show.link', model: <%= class_name %>.model_name.human), @<%= singular_table_name %>, class: 'record-show-button'
|
@@ -0,0 +1,7 @@
|
|
1
|
+
-#= page_title :edit, <%= class_name %>
|
2
|
+
|
3
|
+
= render 'form'
|
4
|
+
|
5
|
+
.page-links
|
6
|
+
= link_to t('action.index.link', model: <%= class_name %>.model_name.human), <%= index_helper %>_path, class: 'to-index-button'
|
7
|
+
= link_to t('action.show.link', model: <%= class_name %>.model_name.human), @<%= singular_table_name %>, class: 'record-show-button'
|
@@ -0,0 +1,26 @@
|
|
1
|
+
-#= page_title :index, <%= class_name %>
|
2
|
+
|
3
|
+
%table.with-selection
|
4
|
+
%thead
|
5
|
+
%tr
|
6
|
+
<% for attribute in attributes -%>
|
7
|
+
%th= <%= class_name %>.human_attribute_name(:<%= attribute.name %>)
|
8
|
+
<% end -%>
|
9
|
+
%th.actions
|
10
|
+
%tbody
|
11
|
+
- @<%= plural_table_name %>.each do |<%= singular_table_name %>|
|
12
|
+
%tr{data: {record: {id: <%= singular_table_name %>.id}.to_json}}
|
13
|
+
<% for attribute in attributes[0...1] -%>
|
14
|
+
%td= link_to <%= singular_table_name %>.<%= attribute.name %>, <%= singular_table_name %>
|
15
|
+
<% end -%>
|
16
|
+
<% for attribute in attributes[1..-1] -%>
|
17
|
+
%td= <%= singular_table_name %>.<%= attribute.name %>
|
18
|
+
<% end -%>
|
19
|
+
%td.actions
|
20
|
+
= link_to content_tag(:span, '', class: 'icon'), <%= singular_table_name %>, class: 'table-new-button'
|
21
|
+
= link_to content_tag(:span, '', class: 'icon'), edit_<%= singular_table_name %>_path(<%= singular_table_name %>), class: 'table-edit-button'
|
22
|
+
= link_to content_tag(:span, '', class: 'icon'), <%= singular_table_name %>, method: :delete, class: 'table-destroy-button', data: { confirm: 'Are you sure?' }
|
23
|
+
|
24
|
+
.page-links
|
25
|
+
%button.actions-button onclick="window.location = $(this).data('url') + '?' + $.param({ids: MultiSelect.selected_ids()})" data-url=collection_edit_<%= plural_table_name %>_path Actions
|
26
|
+
= link_to t('action.new.link', model: <%= class_name %>.model_name.human), new_<%= singular_table_name %>_path, class: 'record-new-button'
|
@@ -0,0 +1,26 @@
|
|
1
|
+
-#= page_title :index, <%= class_name %>
|
2
|
+
|
3
|
+
table.with-selection
|
4
|
+
thead
|
5
|
+
tr
|
6
|
+
<% for attribute in attributes -%>
|
7
|
+
th= <%= class_name %>.human_attribute_name(:<%= attribute.name %>)
|
8
|
+
<% end -%>
|
9
|
+
th.actions
|
10
|
+
tbody
|
11
|
+
- @<%= plural_table_name %>.each do |<%= singular_table_name %>|
|
12
|
+
tr data-record={id: <%= singular_table_name %>.id}.to_json
|
13
|
+
<% for attribute in attributes[0...1] -%>
|
14
|
+
td= link_to <%= singular_table_name %>.<%= attribute.name %>, <%= singular_table_name %>
|
15
|
+
<% end -%>
|
16
|
+
<% for attribute in attributes[1..-1] -%>
|
17
|
+
td= <%= singular_table_name %>.<%= attribute.name %>
|
18
|
+
<% end -%>
|
19
|
+
td.actions
|
20
|
+
= link_to content_tag(:span, '', class: 'icon'), <%= singular_table_name %>, class: 'table-new-button'
|
21
|
+
= link_to content_tag(:span, '', class: 'icon'), edit_<%= singular_table_name %>_path(<%= singular_table_name %>), class: 'table-edit-button'
|
22
|
+
= link_to content_tag(:span, '', class: 'icon'), <%= singular_table_name %>, method: :delete, class: 'table-destroy-button', data: { confirm: 'Are you sure?' }
|
23
|
+
|
24
|
+
.page-links
|
25
|
+
button.actions-button onclick="window.location = $(this).data('url') + '?' + $.param({ids: MultiSelect.selected_ids()})" data-url=collection_edit_<%= plural_table_name %>_path Actions
|
26
|
+
= link_to t('action.new.link', model: <%= class_name %>.model_name.human), new_<%= singular_table_name %>_path, class: 'record-new-button'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<% module_namespacing do -%>
|
2
|
+
class <%= class_name %> < <%= parent_class_name.classify %>
|
3
|
+
<% attributes.each do |attribute| -%>
|
4
|
+
# property <%= attribute.name %>, type: :<%= attribute.type %>
|
5
|
+
<% end -%>
|
6
|
+
<% attributes.select(&:reference?).each do |attribute| -%>
|
7
|
+
belongs_to :<%= attribute.name %><%= ', polymorphic: true' if attribute.polymorphic? %><%= ', required: true' if attribute.required? %>
|
8
|
+
<% end -%>
|
9
|
+
<% if attributes.any?(&:password_digest?) -%>
|
10
|
+
has_secure_password
|
11
|
+
<% end -%>
|
12
|
+
end
|
13
|
+
<% end -%>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
-#= page_title :show, <%= class_name %>
|
2
|
+
<% for attribute in attributes -%>
|
3
|
+
.display-row
|
4
|
+
.display-label= <%= class_name %>.human_attribute_name(:<%= attribute.name %>)
|
5
|
+
.display-field= @<%= singular_table_name %>.<%= attribute.name %>
|
6
|
+
<% end -%>
|
7
|
+
|
8
|
+
.page-links
|
9
|
+
= link_to t('action.index.link', model: <%= class_name %>.model_name.human), <%= index_helper %>_path, class: 'to-index-button'
|
10
|
+
= link_to t('action.edit.link', model: <%= class_name %>.model_name.human), edit_<%= singular_table_name %>_path(@<%= singular_table_name %>), class: 'record-edit-button'
|
@@ -0,0 +1,10 @@
|
|
1
|
+
-#= page_title :show, <%= class_name %>
|
2
|
+
<% for attribute in attributes -%>
|
3
|
+
.display-row
|
4
|
+
.display-label= <%= class_name %>.human_attribute_name(:<%= attribute.name %>)
|
5
|
+
.display-field= @<%= singular_table_name %>.<%= attribute.name %>
|
6
|
+
<% end -%>
|
7
|
+
|
8
|
+
.page-links
|
9
|
+
= link_to t('action.index.link', model: <%= class_name %>.model_name.human), <%= index_helper %>_path, class: 'to-index-button'
|
10
|
+
= link_to t('action.edit.link', model: <%= class_name %>.model_name.human), edit_<%= singular_table_name %>_path(@<%= singular_table_name %>), class: 'record-edit-button'
|
@@ -22,6 +22,10 @@ class ActionView::Helpers::FormBuilder
|
|
22
22
|
add_collection_ids @template.content_tag(:div, label_tag + check_box_tag , class: classes, data: { attribute: attr })
|
23
23
|
end
|
24
24
|
|
25
|
+
def optional_check_box(attr)
|
26
|
+
optional_boolean(attr)
|
27
|
+
end
|
28
|
+
|
25
29
|
def optional_input(attr, options = {})
|
26
30
|
classes = get_optional_classes(attr, base_class: 'optional-input')
|
27
31
|
add_collection_ids @template.content_tag(:div, input(attr, options), class: classes, data: { attribute: attr })
|
@@ -32,6 +36,11 @@ class ActionView::Helpers::FormBuilder
|
|
32
36
|
add_collection_ids @template.content_tag(:div, label(attr, options[:label]) + text_field(attr, options), class: classes, data: { attribute: attr })
|
33
37
|
end
|
34
38
|
|
39
|
+
def optional_text_area(attr, options={})
|
40
|
+
classes = get_optional_classes(attr, base_class: 'optional-text-area')
|
41
|
+
add_collection_ids @template.content_tag(:div, label(attr, options[:label]) + text_area(attr, options), class: classes, data: { attribute: attr })
|
42
|
+
end
|
43
|
+
|
35
44
|
def get_optional_classes(attr, options = {})
|
36
45
|
active = false
|
37
46
|
if object.respond_to?(:uniform_collection_attribute)
|
data/record_collection.gemspec
CHANGED
@@ -35,6 +35,7 @@ Gem::Specification.new do |spec|
|
|
35
35
|
spec.add_development_dependency "poltergeist"
|
36
36
|
spec.add_development_dependency "launchy"
|
37
37
|
spec.add_development_dependency "database_cleaner"
|
38
|
+
spec.add_development_dependency "spring"
|
38
39
|
|
39
40
|
|
40
41
|
spec.add_runtime_dependency 'active_attr', '~> 0.8'
|
@@ -33,4 +33,11 @@ RSpec.describe Employee::Collection do
|
|
33
33
|
described_class.where(admin: false).ids.should eq [employee2.id]
|
34
34
|
end
|
35
35
|
end
|
36
|
+
|
37
|
+
describe '.all' do
|
38
|
+
it 'finds all record and makes it part of the collection' do
|
39
|
+
employee = Employee.create name: 'E1', section: 'ABC', admin: true, vegan: false
|
40
|
+
described_class.all.collection.should eq [employee]
|
41
|
+
end
|
42
|
+
end
|
36
43
|
end
|
@@ -6,6 +6,10 @@
|
|
6
6
|
#= require_tree .
|
7
7
|
#= require_self
|
8
8
|
$ ->
|
9
|
-
$(document).multi_select()
|
10
9
|
$(document).optionals()
|
11
10
|
$(document).foundation()
|
11
|
+
if selector = $(document).multi_select()
|
12
|
+
$('#selected-records-action').click ->
|
13
|
+
ids = selector.selected_ids()
|
14
|
+
return alert "No records selected" unless ids.length
|
15
|
+
window.location = "/employees/collection_edit?#{$.param(ids: ids)}"
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
h1 Listing Employees
|
3
2
|
table.with-selection
|
4
3
|
thead
|
@@ -7,7 +6,7 @@ table.with-selection
|
|
7
6
|
th Section
|
8
7
|
th Admin?
|
9
8
|
th Vegan?
|
10
|
-
th colspan=
|
9
|
+
th colspan=3
|
11
10
|
tbody
|
12
11
|
- @employees.each do |employee|
|
13
12
|
tr data-record=employee.attributes.to_json
|
@@ -18,6 +17,10 @@ table.with-selection
|
|
18
17
|
td= link_to 'Show', employee
|
19
18
|
td= link_to 'Edit', edit_employee_path(employee)
|
20
19
|
td= link_to 'Destroy', employee, method: :delete, data: {confirm: 'Are you sure?' }
|
20
|
+
tfoot
|
21
|
+
tr
|
22
|
+
td colspan=8
|
23
|
+
button#selected-records-action Actions
|
21
24
|
br
|
22
25
|
.page-actions
|
23
26
|
button.actions-button.button.warning onclick="window.location = Routes.collection_edit_employees_path({ids: MultiSelect.selected_ids()})" Actions
|
@@ -9,3 +9,20 @@ en:
|
|
9
9
|
submit:
|
10
10
|
collection:
|
11
11
|
create: "Update %{model}"
|
12
|
+
action:
|
13
|
+
create:
|
14
|
+
successful: Successfully created %{model}
|
15
|
+
update:
|
16
|
+
successful: Successfully updated %{model}
|
17
|
+
collection_update:
|
18
|
+
successful: Successfully updated %{model} collection
|
19
|
+
destroy:
|
20
|
+
successful: Successfully destroyed %{model}
|
21
|
+
new:
|
22
|
+
link: New
|
23
|
+
index:
|
24
|
+
link: Back
|
25
|
+
edit:
|
26
|
+
link: Edit
|
27
|
+
show:
|
28
|
+
link: Show
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: record_collection
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Benjamin ter Kuile
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-03-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -234,6 +234,20 @@ dependencies:
|
|
234
234
|
- - ">="
|
235
235
|
- !ruby/object:Gem::Version
|
236
236
|
version: '0'
|
237
|
+
- !ruby/object:Gem::Dependency
|
238
|
+
name: spring
|
239
|
+
requirement: !ruby/object:Gem::Requirement
|
240
|
+
requirements:
|
241
|
+
- - ">="
|
242
|
+
- !ruby/object:Gem::Version
|
243
|
+
version: '0'
|
244
|
+
type: :development
|
245
|
+
prerelease: false
|
246
|
+
version_requirements: !ruby/object:Gem::Requirement
|
247
|
+
requirements:
|
248
|
+
- - ">="
|
249
|
+
- !ruby/object:Gem::Version
|
250
|
+
version: '0'
|
237
251
|
- !ruby/object:Gem::Dependency
|
238
252
|
name: active_attr
|
239
253
|
requirement: !ruby/object:Gem::Requirement
|
@@ -300,6 +314,23 @@ files:
|
|
300
314
|
- app/controllers/record_collection/application_controller.rb
|
301
315
|
- app/helpers/record_collection/application_helper.rb
|
302
316
|
- app/views/layouts/record_collection/application.html.erb
|
317
|
+
- lib/generators/collection_scaffold/collection_scaffold_generator.rb
|
318
|
+
- lib/generators/collection_scaffold/templates/_form.html.haml
|
319
|
+
- lib/generators/collection_scaffold/templates/_form.html.slim
|
320
|
+
- lib/generators/collection_scaffold/templates/collection.rb
|
321
|
+
- lib/generators/collection_scaffold/templates/collection_edit.html.haml
|
322
|
+
- lib/generators/collection_scaffold/templates/collection_edit.html.slim
|
323
|
+
- lib/generators/collection_scaffold/templates/controller.rb
|
324
|
+
- lib/generators/collection_scaffold/templates/create_table_migration.rb
|
325
|
+
- lib/generators/collection_scaffold/templates/edit.html.haml
|
326
|
+
- lib/generators/collection_scaffold/templates/edit.html.slim
|
327
|
+
- lib/generators/collection_scaffold/templates/index.html.haml
|
328
|
+
- lib/generators/collection_scaffold/templates/index.html.slim
|
329
|
+
- lib/generators/collection_scaffold/templates/model.rb
|
330
|
+
- lib/generators/collection_scaffold/templates/new.html.haml
|
331
|
+
- lib/generators/collection_scaffold/templates/new.html.slim
|
332
|
+
- lib/generators/collection_scaffold/templates/show.html.haml
|
333
|
+
- lib/generators/collection_scaffold/templates/show.html.slim
|
303
334
|
- lib/record_collection.rb
|
304
335
|
- lib/record_collection/base.rb
|
305
336
|
- lib/record_collection/engine.rb
|