record_collection 0.6.1 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/record_collection/optionals.js.coffee +1 -0
- data/app/assets/stylesheets/record_collection/optionals.css.sass +6 -0
- data/lib/record_collection/base.rb +4 -0
- data/lib/record_collection/rails/form_options_helper.rb +12 -9
- data/lib/record_collection/version.rb +1 -1
- data/spec/base/{delegation_spec.rb → behaviour_spec.rb} +5 -0
- data/spec/dummy/app/controllers/employees_controller.rb +1 -1
- data/spec/dummy/app/controllers/projects_controller.rb +73 -0
- data/spec/dummy/app/models/project/collection.rb +3 -0
- data/spec/dummy/app/views/projects/_form.html.erb +21 -0
- data/spec/dummy/app/views/projects/collection_edit.html.slim +9 -0
- data/spec/dummy/app/views/projects/edit.html.erb +6 -0
- data/spec/dummy/app/views/projects/index.html.slim +20 -0
- data/spec/dummy/app/views/projects/new.html.erb +5 -0
- data/spec/dummy/app/views/projects/show.html.erb +14 -0
- data/spec/dummy/config/routes.rb +1 -0
- data/spec/features/disabled_boolean_spec.rb +19 -0
- data/spec/features/optional_boolean_with_normal_resource_spec.rb +20 -0
- metadata +25 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3a59adda39d602d7f6bfb8f52d621249aa2abcc4
|
4
|
+
data.tar.gz: d1944bc51f5c50f874af1e2c75ec449986a77e45
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d65cd419233c8bf56f0b1d447dcc02e774e967eaecd8f9cda0d350453faee3ea45b37c2012c0666e04ff67a2da9aaff0cce402d105ba2d88270b60da1ad56cf2
|
7
|
+
data.tar.gz: d1656f30b70811c497236c87300fccfd2a367c646aee2c42566deace1934c9f7fc3821675e0c06525e2bc32e33d8cb40a9ee8e95b55fa11496971b586fb4bf03
|
@@ -44,6 +44,7 @@ class Optionals
|
|
44
44
|
|
45
45
|
value_toggle = $('<span></span>').addClass('optional-boolean-toggle').click ->
|
46
46
|
return if container.hasClass('inactive')
|
47
|
+
return if container.data('disabled')
|
47
48
|
if $(@).hasClass('active')
|
48
49
|
value_field.val(0)
|
49
50
|
$(@).removeClass('active').addClass('inactive')
|
@@ -37,6 +37,12 @@ $unchecked-color: #999
|
|
37
37
|
&.inactive
|
38
38
|
color: $unchecked-color
|
39
39
|
@extend .fa, .fa-2x, .fa-square-o
|
40
|
+
&.disabled
|
41
|
+
.optional-boolean-toggle
|
42
|
+
&.active
|
43
|
+
color: $unchecked-color
|
44
|
+
&.inactive
|
45
|
+
color: $unchecked-color
|
40
46
|
&.inactive
|
41
47
|
display: block
|
42
48
|
.optional-boolean-activator-toggle
|
@@ -105,6 +105,10 @@ module RecordCollection
|
|
105
105
|
false
|
106
106
|
end
|
107
107
|
|
108
|
+
def to_ary(*)
|
109
|
+
self
|
110
|
+
end
|
111
|
+
|
108
112
|
# This method returns nil when the values of `attr` in the collection
|
109
113
|
# are mixed. Otherwise the value itself. For boolean attributes the
|
110
114
|
# check is wether the values are truthy or falsy. If the
|
@@ -15,36 +15,38 @@ class ActionView::Helpers::FormBuilder
|
|
15
15
|
object.map{|record| @template.hidden_field_tag('ids[]', record.id, id: nil) }.join.html_safe
|
16
16
|
end
|
17
17
|
|
18
|
-
def optional_boolean(attr)
|
19
|
-
classes = get_optional_classes(attr, base_class: 'optional-boolean')
|
18
|
+
def optional_boolean(attr, options = {})
|
19
|
+
classes = get_optional_classes(attr, options.merge(base_class: 'optional-boolean'))
|
20
20
|
label_tag = label(attr, options[:label])
|
21
21
|
check_box_tag = check_box(attr, options)
|
22
|
-
add_collection_ids @template.content_tag(:div, label_tag + check_box_tag , class: classes, data: get_data_attributes(attr))
|
22
|
+
add_collection_ids @template.content_tag(:div, label_tag + check_box_tag , class: classes, data: get_data_attributes(attr, options))
|
23
23
|
end
|
24
24
|
|
25
|
-
def optional_check_box(attr)
|
26
|
-
optional_boolean(attr)
|
25
|
+
def optional_check_box(attr, options = {})
|
26
|
+
optional_boolean(attr, options)
|
27
27
|
end
|
28
28
|
|
29
29
|
def optional_input(attr, options = {})
|
30
|
-
classes = get_optional_classes(attr, base_class: 'optional-input')
|
30
|
+
classes = get_optional_classes(attr, options.reverse_merge(base_class: 'optional-input'))
|
31
31
|
add_collection_ids @template.content_tag(:div, input(attr, options), class: classes, data: get_data_attributes(attr))
|
32
32
|
end
|
33
33
|
|
34
34
|
def optional_text_field(attr, options={})
|
35
|
-
classes = get_optional_classes(attr, base_class: 'optional-text-field')
|
35
|
+
classes = get_optional_classes(attr, options.reverse_merge(base_class: 'optional-text-field'))
|
36
36
|
add_collection_ids @template.content_tag(:div, label(attr, options[:label]) + text_field(attr, options), class: classes, data: get_data_attributes(attr))
|
37
37
|
end
|
38
38
|
|
39
39
|
def optional_text_area(attr, options={})
|
40
|
-
classes = get_optional_classes(attr, base_class: 'optional-text-area')
|
40
|
+
classes = get_optional_classes(attr, options.reverse_merge(base_class: 'optional-text-area'))
|
41
41
|
add_collection_ids @template.content_tag(:div, label(attr, options[:label]) + text_area(attr, options), class: classes, data: get_data_attributes(attr))
|
42
42
|
end
|
43
43
|
|
44
44
|
def get_data_attributes(attr, options = {})
|
45
45
|
one = true
|
46
46
|
one = object.one? if object.is_a? RecordCollection::Base
|
47
|
-
{attribute: attr, one: one}
|
47
|
+
attrs = {attribute: attr, one: one}
|
48
|
+
attrs[:disabled] = true if options[:disabled]
|
49
|
+
attrs
|
48
50
|
end
|
49
51
|
|
50
52
|
def get_optional_classes(attr, options = {})
|
@@ -57,6 +59,7 @@ class ActionView::Helpers::FormBuilder
|
|
57
59
|
active = true unless object.public_send(attr).nil? # Activate if collection attribute is not nil
|
58
60
|
classes = [options[:base_class] || 'optional-input', 'optional-attribute-container', attr]
|
59
61
|
classes << (active ? 'active' : 'inactive')
|
62
|
+
classes << 'disabled' if options[:disabled]
|
60
63
|
if object.is_a? RecordCollection::Base
|
61
64
|
classes << 'one' if object.one?
|
62
65
|
else
|
@@ -0,0 +1,73 @@
|
|
1
|
+
class ProjectsController < ApplicationController
|
2
|
+
before_action :set_project, only: [:show, :edit, :update, :destroy]
|
3
|
+
|
4
|
+
# GET /projects
|
5
|
+
def index
|
6
|
+
@projects = Project.all
|
7
|
+
end
|
8
|
+
|
9
|
+
# GET /projects/1
|
10
|
+
def show
|
11
|
+
end
|
12
|
+
|
13
|
+
# GET /projects/new
|
14
|
+
def new
|
15
|
+
@project = Project.new
|
16
|
+
end
|
17
|
+
|
18
|
+
# GET /projects/1/edit
|
19
|
+
def edit
|
20
|
+
end
|
21
|
+
|
22
|
+
# POST /projects
|
23
|
+
def create
|
24
|
+
@project = Project.new(project_params)
|
25
|
+
|
26
|
+
if @project.save
|
27
|
+
redirect_to @project, notice: 'Project was successfully created.'
|
28
|
+
else
|
29
|
+
render :new
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# PATCH/PUT /projects/1
|
34
|
+
def update
|
35
|
+
if @project.update(project_params)
|
36
|
+
redirect_to @project, notice: 'Project was successfully updated.'
|
37
|
+
else
|
38
|
+
render :edit
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# DELETE /projects/1
|
43
|
+
def destroy
|
44
|
+
@project.destroy
|
45
|
+
redirect_to projects_url, notice: 'Project was successfully destroyed.'
|
46
|
+
end
|
47
|
+
|
48
|
+
def collection_edit
|
49
|
+
@collection = Project::Collection.find(params[:ids])
|
50
|
+
redirect_to projects_path, alert: 'No projects selected' if @collection.empty?
|
51
|
+
end
|
52
|
+
|
53
|
+
def collection_update
|
54
|
+
@collection = Project::Collection.find(params[:ids])
|
55
|
+
if @collection.update params[:collection]
|
56
|
+
redirect_to projects_path, notice: 'Collection is updated'
|
57
|
+
else
|
58
|
+
render 'collection_edit'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
# Use callbacks to share common setup or constraints between actions.
|
65
|
+
def set_project
|
66
|
+
@project = Project.find(params[:id])
|
67
|
+
end
|
68
|
+
|
69
|
+
# Only allow a trusted parameter "white list" through.
|
70
|
+
def project_params
|
71
|
+
params.require(:project).permit(:name)
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<%= form_for(@project) do |f| %>
|
2
|
+
<% if @project.errors.any? %>
|
3
|
+
<div id="error_explanation">
|
4
|
+
<h2><%= pluralize(@project.errors.count, "error") %> prohibited this project from being saved:</h2>
|
5
|
+
|
6
|
+
<ul>
|
7
|
+
<% @project.errors.full_messages.each do |message| %>
|
8
|
+
<li><%= message %></li>
|
9
|
+
<% end %>
|
10
|
+
</ul>
|
11
|
+
</div>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<div class="field">
|
15
|
+
<%= f.label :name %><br>
|
16
|
+
<%= f.text_field :name %>
|
17
|
+
</div>
|
18
|
+
<div class="actions">
|
19
|
+
<%= f.submit %>
|
20
|
+
</div>
|
21
|
+
<% end %>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
h1 Edit multiple employees
|
2
|
+
= form_for @collection, url: [:collection_update, @collection] do |f|
|
3
|
+
= render 'form_errors', target: @collection
|
4
|
+
.form-inputs= f.optional_boolean :finished, disabled: true
|
5
|
+
.form-actions= f.submit
|
6
|
+
.page-actions
|
7
|
+
= link_to 'Back', employees_path
|
8
|
+
|
9
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
h1 Listing Projects
|
2
|
+
table.with-selection
|
3
|
+
thead
|
4
|
+
tr
|
5
|
+
th Name
|
6
|
+
th Finished?
|
7
|
+
th colspan=3
|
8
|
+
tbody
|
9
|
+
- @projects.each do |project|
|
10
|
+
tr data-record=project.attributes.to_json
|
11
|
+
td= project.name
|
12
|
+
td.finished= project.finished ? 'yes' : 'no'
|
13
|
+
td= link_to 'Show', project
|
14
|
+
td= link_to 'Edit', edit_project_path(project)
|
15
|
+
td= link_to 'Destroy', project, method: :delete, data: {confirm: 'Are you sure?' }
|
16
|
+
br
|
17
|
+
.page-actions
|
18
|
+
button.actions-button.button.warning onclick="window.location = Routes.collection_edit_projects_path({ids: MultiSelect.selected_ids()})" Actions
|
19
|
+
span.devider
|
20
|
+
= link_to 'New Project', new_project_path, class: 'info button'
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<p id="notice"><%= notice %></p>
|
2
|
+
|
3
|
+
<p>
|
4
|
+
<strong>Name:</strong>
|
5
|
+
<%= @project.name %>
|
6
|
+
</p>
|
7
|
+
|
8
|
+
<p>
|
9
|
+
<strong>Finished:</strong>
|
10
|
+
<%= @project.finished ? 'yes' : 'no' %>
|
11
|
+
</p>
|
12
|
+
|
13
|
+
<%= link_to 'Edit', edit_project_path(@project) %> |
|
14
|
+
<%= link_to 'Back', projects_path %>
|
data/spec/dummy/config/routes.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.feature "Disabled booleans", type: :feature do
|
4
|
+
scenario "Selecting all", js: true do
|
5
|
+
project = Project.create name: 'P1', finished: true
|
6
|
+
visit collection_edit_projects_path(ids: [project.id])
|
7
|
+
|
8
|
+
toggle = find('.optional-attribute-container.finished .optional-boolean-toggle')
|
9
|
+
toggle['class'].should include 'active'
|
10
|
+
toggle.click
|
11
|
+
find('[name="commit"]').click
|
12
|
+
|
13
|
+
project.reload
|
14
|
+
|
15
|
+
# Should not be changed by the click
|
16
|
+
project.finished.should be true
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.feature "Optional text_field with normal record", type: :feature do
|
4
|
+
scenario "Selecting all", js: true do
|
5
|
+
employee = Employee.create name: 'E1', admin: true, vegan: false
|
6
|
+
visit collection_edit_employees_path(ids: [employee.id])
|
7
|
+
|
8
|
+
find('#collection_section').set 'SEC' # this is an optional
|
9
|
+
toggle = find('.optional-attribute-container.vegan .optional-boolean-toggle')
|
10
|
+
toggle.click
|
11
|
+
find('[name="commit"]').click
|
12
|
+
|
13
|
+
employee.reload
|
14
|
+
|
15
|
+
employee.section.should == 'SEC'
|
16
|
+
employee.admin.should be true
|
17
|
+
employee.vegan.should be true
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
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.
|
4
|
+
version: 0.7.0
|
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-04-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -384,7 +384,7 @@ files:
|
|
384
384
|
- record_collection.gemspec
|
385
385
|
- spec/base/accessors_spec.rb
|
386
386
|
- spec/base/after_record_update_spec.rb
|
387
|
-
- spec/base/
|
387
|
+
- spec/base/behaviour_spec.rb
|
388
388
|
- spec/base/finding_records_spec.rb
|
389
389
|
- spec/base/validations_spec.rb
|
390
390
|
- spec/dummy/README.rdoc
|
@@ -401,6 +401,7 @@ files:
|
|
401
401
|
- spec/dummy/app/controllers/application_controller.rb
|
402
402
|
- spec/dummy/app/controllers/concerns/.keep
|
403
403
|
- spec/dummy/app/controllers/employees_controller.rb
|
404
|
+
- spec/dummy/app/controllers/projects_controller.rb
|
404
405
|
- spec/dummy/app/helpers/application_helper.rb
|
405
406
|
- spec/dummy/app/mailers/.keep
|
406
407
|
- spec/dummy/app/models/.keep
|
@@ -408,6 +409,7 @@ files:
|
|
408
409
|
- spec/dummy/app/models/employee.rb
|
409
410
|
- spec/dummy/app/models/employee/collection.rb
|
410
411
|
- spec/dummy/app/models/project.rb
|
412
|
+
- spec/dummy/app/models/project/collection.rb
|
411
413
|
- spec/dummy/app/views/application/_form_errors.html.slim
|
412
414
|
- spec/dummy/app/views/employees/_form.html.erb
|
413
415
|
- spec/dummy/app/views/employees/collection_edit.html.slim
|
@@ -416,6 +418,12 @@ files:
|
|
416
418
|
- spec/dummy/app/views/employees/new.html.erb
|
417
419
|
- spec/dummy/app/views/employees/show.html.erb
|
418
420
|
- spec/dummy/app/views/layouts/application.html.slim
|
421
|
+
- spec/dummy/app/views/projects/_form.html.erb
|
422
|
+
- spec/dummy/app/views/projects/collection_edit.html.slim
|
423
|
+
- spec/dummy/app/views/projects/edit.html.erb
|
424
|
+
- spec/dummy/app/views/projects/index.html.slim
|
425
|
+
- spec/dummy/app/views/projects/new.html.erb
|
426
|
+
- spec/dummy/app/views/projects/show.html.erb
|
419
427
|
- spec/dummy/bin/bundle
|
420
428
|
- spec/dummy/bin/rails
|
421
429
|
- spec/dummy/bin/rake
|
@@ -450,7 +458,9 @@ files:
|
|
450
458
|
- spec/dummy/public/422.html
|
451
459
|
- spec/dummy/public/500.html
|
452
460
|
- spec/dummy/public/favicon.ico
|
461
|
+
- spec/features/disabled_boolean_spec.rb
|
453
462
|
- spec/features/multi_select_spec.rb
|
463
|
+
- spec/features/optional_boolean_with_normal_resource_spec.rb
|
454
464
|
- spec/features/optional_text_field_with_normal_resource_spec.rb
|
455
465
|
- spec/features/optionals_with_one_record_spec.rb
|
456
466
|
- spec/features/translations_spec.rb
|
@@ -485,7 +495,7 @@ summary: Manage collections of records in Ruby on Rails
|
|
485
495
|
test_files:
|
486
496
|
- spec/base/accessors_spec.rb
|
487
497
|
- spec/base/after_record_update_spec.rb
|
488
|
-
- spec/base/
|
498
|
+
- spec/base/behaviour_spec.rb
|
489
499
|
- spec/base/finding_records_spec.rb
|
490
500
|
- spec/base/validations_spec.rb
|
491
501
|
- spec/dummy/README.rdoc
|
@@ -502,6 +512,7 @@ test_files:
|
|
502
512
|
- spec/dummy/app/controllers/application_controller.rb
|
503
513
|
- spec/dummy/app/controllers/concerns/.keep
|
504
514
|
- spec/dummy/app/controllers/employees_controller.rb
|
515
|
+
- spec/dummy/app/controllers/projects_controller.rb
|
505
516
|
- spec/dummy/app/helpers/application_helper.rb
|
506
517
|
- spec/dummy/app/mailers/.keep
|
507
518
|
- spec/dummy/app/models/.keep
|
@@ -509,6 +520,7 @@ test_files:
|
|
509
520
|
- spec/dummy/app/models/employee.rb
|
510
521
|
- spec/dummy/app/models/employee/collection.rb
|
511
522
|
- spec/dummy/app/models/project.rb
|
523
|
+
- spec/dummy/app/models/project/collection.rb
|
512
524
|
- spec/dummy/app/views/application/_form_errors.html.slim
|
513
525
|
- spec/dummy/app/views/employees/_form.html.erb
|
514
526
|
- spec/dummy/app/views/employees/collection_edit.html.slim
|
@@ -517,6 +529,12 @@ test_files:
|
|
517
529
|
- spec/dummy/app/views/employees/new.html.erb
|
518
530
|
- spec/dummy/app/views/employees/show.html.erb
|
519
531
|
- spec/dummy/app/views/layouts/application.html.slim
|
532
|
+
- spec/dummy/app/views/projects/_form.html.erb
|
533
|
+
- spec/dummy/app/views/projects/collection_edit.html.slim
|
534
|
+
- spec/dummy/app/views/projects/edit.html.erb
|
535
|
+
- spec/dummy/app/views/projects/index.html.slim
|
536
|
+
- spec/dummy/app/views/projects/new.html.erb
|
537
|
+
- spec/dummy/app/views/projects/show.html.erb
|
520
538
|
- spec/dummy/bin/bundle
|
521
539
|
- spec/dummy/bin/rails
|
522
540
|
- spec/dummy/bin/rake
|
@@ -551,7 +569,9 @@ test_files:
|
|
551
569
|
- spec/dummy/public/422.html
|
552
570
|
- spec/dummy/public/500.html
|
553
571
|
- spec/dummy/public/favicon.ico
|
572
|
+
- spec/features/disabled_boolean_spec.rb
|
554
573
|
- spec/features/multi_select_spec.rb
|
574
|
+
- spec/features/optional_boolean_with_normal_resource_spec.rb
|
555
575
|
- spec/features/optional_text_field_with_normal_resource_spec.rb
|
556
576
|
- spec/features/optionals_with_one_record_spec.rb
|
557
577
|
- spec/features/translations_spec.rb
|
@@ -559,3 +579,4 @@ test_files:
|
|
559
579
|
- spec/rails/form_builder_spec.rb
|
560
580
|
- spec/record_selection/base_spec.rb
|
561
581
|
- spec/spec_helper.rb
|
582
|
+
has_rdoc:
|