paper_trail_manager 0.6.0 → 0.8.0
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.
- checksums.yaml +5 -5
- data/.github/workflows/test.yml +54 -0
- data/.gitignore +3 -2
- data/.rubocop.yml +33 -0
- data/.ruby-version +1 -0
- data/Appraisals +15 -12
- data/CHANGES.md +24 -0
- data/Gemfile +2 -1
- data/README.md +130 -66
- data/Rakefile +19 -5
- data/app/controllers/paper_trail_manager/changes_controller.rb +119 -101
- data/app/helpers/paper_trail_manager/changes_helper.rb +17 -13
- data/app/views/paper_trail_manager/changes/_version.html.erb +1 -1
- data/app/views/paper_trail_manager/changes/index.atom.builder +23 -19
- data/app/views/paper_trail_manager/changes/index.html.erb +41 -28
- data/app/views/paper_trail_manager/changes/show.html.erb +9 -6
- data/gemfiles/rails_6.1_paper_trail_12.0_kaminari.gemfile +10 -0
- data/gemfiles/rails_6.1_paper_trail_12.0_will_paginate.gemfile +10 -0
- data/gemfiles/rails_7.0_paper_trail_12.0_kaminari.gemfile +10 -0
- data/gemfiles/rails_7.0_paper_trail_12.0_will_paginate.gemfile +10 -0
- data/gemfiles/rails_7.0_paper_trail_15.0_kaminari.gemfile +10 -0
- data/gemfiles/rails_7.0_paper_trail_15.0_will_paginate.gemfile +10 -0
- data/gemfiles/rails_7.1_paper_trail_15.0_kaminari.gemfile +10 -0
- data/gemfiles/rails_7.1_paper_trail_15.0_will_paginate.gemfile +10 -0
- data/lib/paper_trail_manager.rb +11 -9
- data/paper_trail_manager.gemspec +25 -24
- data/spec/app_template.rb +39 -0
- data/spec/integration/authorization_spec.rb +84 -0
- data/spec/integration/date_filter_spec.rb +84 -0
- data/spec/integration/navigation_spec.rb +5 -3
- data/spec/integration/paper_trail_manager_spec.rb +94 -110
- data/spec/integration/response_formats_spec.rb +73 -0
- data/spec/rails_helper.rb +6 -4
- data/spec/spec_helper.rb +7 -5
- data/spec/support/factories.rb +4 -3
- data/spec/support/rspec_html_matchers.rb +7 -0
- data/spec/unit/authorization_spec.rb +42 -0
- data/spec/unit/changes_helper_spec.rb +81 -0
- metadata +103 -238
- data/.travis.yml +0 -23
- data/gemfiles/rails_3.2.0_paper_trail_3.0_kaminari.gemfile +0 -10
- data/gemfiles/rails_3.2.0_paper_trail_3.0_will_paginate.gemfile +0 -10
- data/gemfiles/rails_3.2.0_paper_trail_4.0_kaminari.gemfile +0 -10
- data/gemfiles/rails_3.2.0_paper_trail_4.0_will_paginate.gemfile +0 -10
- data/gemfiles/rails_4.0.0_paper_trail_3.0_kaminari.gemfile +0 -9
- data/gemfiles/rails_4.0.0_paper_trail_3.0_will_paginate.gemfile +0 -9
- data/gemfiles/rails_4.0.0_paper_trail_4.0_kaminari.gemfile +0 -9
- data/gemfiles/rails_4.0.0_paper_trail_4.0_will_paginate.gemfile +0 -9
- data/gemfiles/rails_4.1.0_paper_trail_3.0_kaminari.gemfile +0 -9
- data/gemfiles/rails_4.1.0_paper_trail_3.0_will_paginate.gemfile +0 -9
- data/gemfiles/rails_4.1.0_paper_trail_4.0_kaminari.gemfile +0 -9
- data/gemfiles/rails_4.1.0_paper_trail_4.0_will_paginate.gemfile +0 -9
- data/gemfiles/rails_4.2.2_paper_trail_3.0_kaminari.gemfile +0 -9
- data/gemfiles/rails_4.2.2_paper_trail_3.0_will_paginate.gemfile +0 -9
- data/gemfiles/rails_4.2.2_paper_trail_4.0_kaminari.gemfile +0 -9
- data/gemfiles/rails_4.2.2_paper_trail_4.0_will_paginate.gemfile +0 -9
- data/spec/controllers/entities_controller_spec.rb +0 -125
- data/spec/controllers/platforms_controller_spec.rb +0 -125
- data/spec/dummy/.gitignore +0 -15
- data/spec/dummy/Gemfile +0 -9
- data/spec/dummy/README.rdoc +0 -261
- data/spec/dummy/Rakefile +0 -7
- data/spec/dummy/app/assets/images/rails.png +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +0 -15
- data/spec/dummy/app/assets/stylesheets/application.css +0 -13
- data/spec/dummy/app/controllers/application_controller.rb +0 -6
- data/spec/dummy/app/controllers/entities_controller.rb +0 -83
- data/spec/dummy/app/controllers/platforms_controller.rb +0 -83
- data/spec/dummy/app/helpers/application_helper.rb +0 -2
- data/spec/dummy/app/helpers/entities_helper.rb +0 -2
- data/spec/dummy/app/helpers/platforms_helper.rb +0 -2
- data/spec/dummy/app/mailers/.gitkeep +0 -0
- data/spec/dummy/app/models/.gitkeep +0 -0
- data/spec/dummy/app/models/entity.rb +0 -6
- data/spec/dummy/app/models/platform.rb +0 -6
- data/spec/dummy/app/views/application/index.html.erb +0 -6
- data/spec/dummy/app/views/entities/_form.html.erb +0 -17
- data/spec/dummy/app/views/entities/edit.html.erb +0 -6
- data/spec/dummy/app/views/entities/index.html.erb +0 -21
- data/spec/dummy/app/views/entities/new.html.erb +0 -5
- data/spec/dummy/app/views/entities/show.html.erb +0 -5
- data/spec/dummy/app/views/layouts/application.html.erb +0 -14
- data/spec/dummy/app/views/platforms/_form.html.erb +0 -17
- data/spec/dummy/app/views/platforms/edit.html.erb +0 -6
- data/spec/dummy/app/views/platforms/index.html.erb +0 -21
- data/spec/dummy/app/views/platforms/new.html.erb +0 -5
- data/spec/dummy/app/views/platforms/show.html.erb +0 -5
- data/spec/dummy/config/application.rb +0 -64
- data/spec/dummy/config/boot.rb +0 -6
- data/spec/dummy/config/database.yml +0 -22
- data/spec/dummy/config/environment.rb +0 -5
- data/spec/dummy/config/environments/development.rb +0 -37
- data/spec/dummy/config/environments/production.rb +0 -67
- data/spec/dummy/config/environments/test.rb +0 -36
- data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/dummy/config/initializers/inflections.rb +0 -15
- data/spec/dummy/config/initializers/mime_types.rb +0 -5
- data/spec/dummy/config/initializers/secret_token.rb +0 -7
- data/spec/dummy/config/initializers/session_store.rb +0 -8
- data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
- data/spec/dummy/config/locales/en.yml +0 -5
- data/spec/dummy/config/routes.rb +0 -8
- data/spec/dummy/config.ru +0 -4
- data/spec/dummy/db/migrate/20110228091428_create_entities.rb +0 -14
- data/spec/dummy/db/migrate/20110228093241_create_platforms.rb +0 -14
- data/spec/dummy/db/migrate/20110228094444_create_versions.rb +0 -18
- data/spec/dummy/db/schema.rb +0 -41
- data/spec/dummy/db/seeds.rb +0 -7
- data/spec/dummy/doc/README_FOR_APP +0 -2
- data/spec/dummy/lib/assets/.gitkeep +0 -0
- data/spec/dummy/lib/tasks/.gitkeep +0 -0
- data/spec/dummy/log/.gitkeep +0 -0
- data/spec/dummy/public/404.html +0 -26
- data/spec/dummy/public/422.html +0 -26
- data/spec/dummy/public/500.html +0 -25
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/public/index.html +0 -241
- data/spec/dummy/public/robots.txt +0 -5
- data/spec/dummy/script/rails +0 -6
- data/spec/dummy/test/fixtures/.gitkeep +0 -0
- data/spec/dummy/test/functional/.gitkeep +0 -0
- data/spec/dummy/test/integration/.gitkeep +0 -0
- data/spec/dummy/test/performance/browsing_test.rb +0 -12
- data/spec/dummy/test/test_helper.rb +0 -13
- data/spec/dummy/test/unit/.gitkeep +0 -0
- data/spec/dummy/vendor/assets/javascripts/.gitkeep +0 -0
- data/spec/dummy/vendor/assets/stylesheets/.gitkeep +0 -0
- data/spec/dummy/vendor/plugins/.gitkeep +0 -0
- data/spec/helpers/entities_helper_spec.rb +0 -15
- data/spec/helpers/platforms_helper_spec.rb +0 -15
- data/spec/models/entity_spec.rb +0 -14
- data/spec/models/platform_spec.rb +0 -14
- data/spec/requests/entities_spec.rb +0 -11
- data/spec/requests/platforms_spec.rb +0 -11
- data/spec/routing/entities_routing_spec.rb +0 -35
- data/spec/routing/platforms_routing_spec.rb +0 -35
- data/spec/views/entities/edit.html.erb_spec.rb +0 -15
- data/spec/views/entities/index.html.erb_spec.rb +0 -14
- data/spec/views/entities/new.html.erb_spec.rb +0 -15
- data/spec/views/entities/show.html.erb_spec.rb +0 -11
- data/spec/views/platforms/edit.html.erb_spec.rb +0 -15
- data/spec/views/platforms/index.html.erb_spec.rb +0 -14
- data/spec/views/platforms/new.html.erb_spec.rb +0 -15
- data/spec/views/platforms/show.html.erb_spec.rb +0 -11
|
@@ -1,128 +1,146 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
# Allow the parent class of ChangesController to be configured in the host app
|
|
2
4
|
PaperTrailManager::ChangesController = Class.new(PaperTrailManager.base_controller.constantize)
|
|
3
5
|
|
|
4
|
-
class PaperTrailManager
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
class PaperTrailManager
|
|
7
|
+
class ChangesController
|
|
8
|
+
# Default number of changes to list on a pagenated index page.
|
|
9
|
+
PER_PAGE = 50
|
|
7
10
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
helper PaperTrailManager.route_helpers if PaperTrailManager.route_helpers
|
|
12
|
+
helper PaperTrailManager::ChangesHelper
|
|
13
|
+
layout PaperTrailManager.layout if PaperTrailManager.layout
|
|
11
14
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
# List changes
|
|
16
|
+
def index
|
|
17
|
+
unless change_index_allowed?
|
|
18
|
+
flash[:error] = 'You do not have permission to list changes.'
|
|
19
|
+
return(redirect_to root_url)
|
|
20
|
+
end
|
|
18
21
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
@versions = @versions.where(:
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
@
|
|
22
|
+
@versions = PaperTrail::Version.order('created_at DESC, id DESC')
|
|
23
|
+
@versions = @versions.where(item_type: params[:type]) if params[:type]
|
|
24
|
+
@versions = @versions.where(item_id: params[:id]) if params[:id]
|
|
25
|
+
|
|
26
|
+
# Date range filtering
|
|
27
|
+
@from = parse_date(params[:from])
|
|
28
|
+
@to = parse_date(params[:to])
|
|
29
|
+
@versions = @versions.where('created_at >= ?', @from.beginning_of_day) if @from
|
|
30
|
+
@versions = @versions.where('created_at <= ?', @to.end_of_day) if @to
|
|
31
|
+
|
|
32
|
+
# Ensure pagination parameters have sensible values
|
|
33
|
+
@page = params[:page].to_i
|
|
34
|
+
@page = nil if @page.zero?
|
|
35
|
+
|
|
36
|
+
@per_page = params[:per_page].to_i
|
|
37
|
+
@per_page = PER_PAGE if @per_page.zero?
|
|
38
|
+
|
|
39
|
+
@versions = if defined?(WillPaginate)
|
|
40
|
+
@versions.paginate(page: @page, per_page: @per_page)
|
|
41
|
+
else
|
|
42
|
+
@versions.page(@page).per(@per_page)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
respond_to do |format|
|
|
46
|
+
format.html # index.html.erb
|
|
47
|
+
format.atom # index.atom.builder
|
|
48
|
+
format.json { render json: @versions }
|
|
49
|
+
end
|
|
25
50
|
end
|
|
26
51
|
|
|
27
|
-
#
|
|
28
|
-
|
|
29
|
-
|
|
52
|
+
# Show a change
|
|
53
|
+
def show
|
|
54
|
+
begin
|
|
55
|
+
@version = PaperTrail::Version.find(params[:id])
|
|
56
|
+
rescue ActiveRecord::RecordNotFound
|
|
57
|
+
flash[:error] = 'No such version.'
|
|
58
|
+
return(redirect_to action: :index)
|
|
59
|
+
end
|
|
30
60
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
end
|
|
61
|
+
unless change_show_allowed?(@version)
|
|
62
|
+
flash[:error] = 'You do not have permission to show that change.'
|
|
63
|
+
return(redirect_to action: :index)
|
|
64
|
+
end
|
|
36
65
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
66
|
+
respond_to do |format|
|
|
67
|
+
format.html # show.html.erb
|
|
68
|
+
format.json { render json: @version }
|
|
69
|
+
end
|
|
41
70
|
end
|
|
42
|
-
end
|
|
43
71
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
72
|
+
# Rollback a change
|
|
73
|
+
def update
|
|
74
|
+
begin
|
|
75
|
+
@version = PaperTrail::Version.find(params[:id])
|
|
76
|
+
rescue ActiveRecord::RecordNotFound
|
|
77
|
+
flash[:error] = 'No such version.'
|
|
78
|
+
return(redirect_to(changes_path))
|
|
79
|
+
end
|
|
52
80
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
81
|
+
unless change_revert_allowed?(@version)
|
|
82
|
+
flash[:error] = 'You do not have permission to revert this change.'
|
|
83
|
+
return(redirect_to changes_path)
|
|
84
|
+
end
|
|
57
85
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
86
|
+
if @version.event == 'create'
|
|
87
|
+
@record = @version.item_type.constantize.find(@version.item_id)
|
|
88
|
+
@result = @record.destroy
|
|
89
|
+
else
|
|
90
|
+
@record = @version.reify
|
|
91
|
+
@result = @record.save
|
|
92
|
+
end
|
|
63
93
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
94
|
+
if @result
|
|
95
|
+
if @version.event == 'create'
|
|
96
|
+
flash[:notice] = 'Rolled back newly-created record by destroying it.'
|
|
97
|
+
redirect_to changes_path
|
|
98
|
+
else
|
|
99
|
+
flash[:notice] = 'Rolled back changes to this record.'
|
|
100
|
+
redirect_to change_item_url(@version)
|
|
101
|
+
end
|
|
102
|
+
else
|
|
103
|
+
flash[:error] = "Couldn't rollback. Sorry."
|
|
104
|
+
redirect_to changes_path
|
|
105
|
+
end
|
|
71
106
|
end
|
|
72
107
|
|
|
73
|
-
|
|
74
|
-
flash[:error] = "You do not have permission to revert this change."
|
|
75
|
-
return(redirect_to changes_path)
|
|
76
|
-
end
|
|
108
|
+
protected
|
|
77
109
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
110
|
+
# Return the URL for the item represented by the +version+, e.g. a Company record instance referenced by a version.
|
|
111
|
+
def change_item_url(version)
|
|
112
|
+
version_type = version.item_type.underscore.split('/').last
|
|
113
|
+
send("#{version_type}_url", version.item_id)
|
|
114
|
+
rescue NoMethodError
|
|
115
|
+
nil
|
|
84
116
|
end
|
|
117
|
+
helper_method :change_item_url
|
|
85
118
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
redirect_to changes_path
|
|
90
|
-
else
|
|
91
|
-
flash[:notice] = "Rolled back changes to this record."
|
|
92
|
-
redirect_to change_item_url(@version)
|
|
93
|
-
end
|
|
94
|
-
else
|
|
95
|
-
flash[:error] = "Couldn't rollback. Sorry."
|
|
96
|
-
redirect_to changes_path
|
|
119
|
+
# Allow index?
|
|
120
|
+
def change_index_allowed?
|
|
121
|
+
PaperTrailManager.allow_index?(self)
|
|
97
122
|
end
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
protected
|
|
123
|
+
helper_method :change_index_allowed?
|
|
101
124
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
return nil
|
|
108
|
-
end
|
|
109
|
-
helper_method :change_item_url
|
|
125
|
+
# Allow show?
|
|
126
|
+
def change_show_allowed?(version)
|
|
127
|
+
PaperTrailManager.allow_show?(self, version)
|
|
128
|
+
end
|
|
129
|
+
helper_method :change_show_allowed?
|
|
110
130
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
131
|
+
# Allow revert?
|
|
132
|
+
def change_revert_allowed?(version)
|
|
133
|
+
PaperTrailManager.allow_revert?(self, version)
|
|
134
|
+
end
|
|
135
|
+
helper_method :change_revert_allowed?
|
|
116
136
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
end
|
|
121
|
-
helper_method :change_show_allowed?
|
|
137
|
+
# Parse a date string, returning nil for invalid/missing values
|
|
138
|
+
def parse_date(value)
|
|
139
|
+
return nil if value.blank?
|
|
122
140
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
141
|
+
Date.parse(value)
|
|
142
|
+
rescue Date::Error, ArgumentError
|
|
143
|
+
nil
|
|
144
|
+
end
|
|
126
145
|
end
|
|
127
|
-
helper_method :change_revert_allowed?
|
|
128
146
|
end
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
class PaperTrailManager
|
|
2
4
|
module ChangesHelper
|
|
3
5
|
# Return HTML representing the +object+, which is either its text or a stylized "nil".
|
|
4
6
|
def text_or_nil(object)
|
|
5
7
|
if object.nil?
|
|
6
|
-
|
|
8
|
+
content_tag('em', 'nil')
|
|
7
9
|
else
|
|
8
|
-
|
|
10
|
+
h(object)
|
|
9
11
|
end
|
|
10
12
|
end
|
|
11
13
|
|
|
@@ -26,16 +28,18 @@ class PaperTrailManager
|
|
|
26
28
|
# }
|
|
27
29
|
def changes_for(version)
|
|
28
30
|
case version.event
|
|
29
|
-
when
|
|
31
|
+
when 'create', 'update'
|
|
30
32
|
return {} unless version.changeset
|
|
33
|
+
|
|
31
34
|
version.changeset.inject({}) do |changes, (attr, (prev, curr))|
|
|
32
|
-
changes.store(attr, {previous: prev, current: curr}) && changes
|
|
35
|
+
changes.store(attr, { previous: prev, current: curr }) && changes
|
|
33
36
|
end
|
|
34
|
-
when
|
|
37
|
+
when 'destroy'
|
|
35
38
|
record = version_reify(version)
|
|
36
39
|
return {} unless record
|
|
37
|
-
|
|
38
|
-
|
|
40
|
+
|
|
41
|
+
record.attributes.reject { |_k, v| v.nil? }.inject({}) do |changes, (attr, value)|
|
|
42
|
+
changes.store(attr, { previous: value, current: nil }) && changes
|
|
39
43
|
end
|
|
40
44
|
else
|
|
41
45
|
raise ArgumentError, "Unknown event: #{version.event}"
|
|
@@ -51,21 +55,21 @@ class PaperTrailManager
|
|
|
51
55
|
name = "#{version.item_type} #{version.item_id}"
|
|
52
56
|
end
|
|
53
57
|
|
|
54
|
-
|
|
58
|
+
h(name)
|
|
55
59
|
end
|
|
56
60
|
|
|
57
61
|
def change_item_types
|
|
58
|
-
ActiveRecord::Base.
|
|
62
|
+
ActiveRecord::Base.descendants.select do |klass|
|
|
59
63
|
klass.include?(PaperTrail::Model::InstanceMethods)
|
|
60
|
-
end.map(&:to_s)
|
|
64
|
+
end.map(&:to_s).sort
|
|
61
65
|
end
|
|
62
66
|
|
|
63
67
|
# Returns HTML link for the item stored in the version, e.g. a link to a Company record stored in the version.
|
|
64
68
|
def change_item_link(version)
|
|
65
|
-
if url = change_item_url(version)
|
|
66
|
-
|
|
69
|
+
if (url = change_item_url(version))
|
|
70
|
+
link_to(change_title_for(version), url, class: 'change_item')
|
|
67
71
|
else
|
|
68
|
-
|
|
72
|
+
content_tag(:span, change_title_for(version), class: 'change_item')
|
|
69
73
|
end
|
|
70
74
|
end
|
|
71
75
|
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
<% end %>
|
|
21
21
|
<% end %>
|
|
22
22
|
<% if change_revert_allowed?(version) %>
|
|
23
|
-
<%=
|
|
23
|
+
<%= button_to 'Roll back', change_path(version), method: :put, class: 'rollback', form: { data: { turbo_confirm: 'Are you sure?' } } %>
|
|
24
24
|
<% end %>
|
|
25
25
|
</p>
|
|
26
26
|
<% if version.event == 'update' or version.event == 'create' %>
|
|
@@ -1,44 +1,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
atom_feed do |feed|
|
|
2
|
-
feed.title(
|
|
3
|
-
date = @versions.first.try(:created_at) || Time.at(0)
|
|
4
|
+
feed.title('Changes')
|
|
5
|
+
date = @versions.first.try(:created_at) || Time.zone.at(0)
|
|
4
6
|
feed.updated(date)
|
|
5
7
|
|
|
6
8
|
@versions.each do |version|
|
|
7
9
|
next unless change_show_allowed?(version)
|
|
8
10
|
|
|
9
|
-
feed.entry(version, :
|
|
11
|
+
feed.entry(version, url: change_url(version)) do |entry|
|
|
10
12
|
changes = changes_for(version)
|
|
11
13
|
|
|
12
|
-
if PaperTrailManager.whodunnit_class && version.whodunnit
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
user = if PaperTrailManager.whodunnit_class && version.whodunnit
|
|
15
|
+
begin
|
|
16
|
+
PaperTrailManager.whodunnit_class.find(version.whodunnit)
|
|
17
|
+
rescue StandardError
|
|
18
|
+
nil
|
|
19
|
+
end
|
|
20
|
+
end
|
|
17
21
|
|
|
18
|
-
entry.title "#{version.event.upcase} #{version.item_type} «#{change_title_for(version)}» #{user ? 'by '+user.send(PaperTrailManager.whodunnit_name_method) : ''}"
|
|
22
|
+
entry.title "#{version.event.upcase} #{version.item_type} «#{change_title_for(version)}» #{user ? 'by ' + user.send(PaperTrailManager.whodunnit_name_method) : ''}"
|
|
19
23
|
entry.updated version.created_at.utc.xmlschema
|
|
20
24
|
|
|
21
25
|
xm = ::Builder::XmlMarkup.new
|
|
22
|
-
xm.div
|
|
23
|
-
xm.p
|
|
26
|
+
xm.div do
|
|
27
|
+
xm.p do
|
|
24
28
|
xm.span << 'Go to: '
|
|
25
29
|
xm.span << link_to('Change', change_url(version))
|
|
26
30
|
xm.span << ' | '
|
|
27
31
|
xm.span << link_to('Record', change_item_url(version))
|
|
28
|
-
|
|
29
|
-
xm.table
|
|
32
|
+
end
|
|
33
|
+
xm.table do
|
|
30
34
|
changes.keys.sort.each do |key|
|
|
31
|
-
xm.tr
|
|
35
|
+
xm.tr do
|
|
32
36
|
xm.td { xm.b key }
|
|
33
37
|
xm.td changes[key][:previous].inspect
|
|
34
|
-
xm.td { xm.span <<
|
|
38
|
+
xm.td { xm.span << '→' }
|
|
35
39
|
xm.td changes[key][:current].inspect
|
|
36
|
-
|
|
40
|
+
end
|
|
37
41
|
end
|
|
38
|
-
|
|
39
|
-
|
|
42
|
+
end
|
|
43
|
+
end
|
|
40
44
|
|
|
41
|
-
entry.content(xm.to_s, :
|
|
45
|
+
entry.content(xm.to_s, type: 'html')
|
|
42
46
|
end
|
|
43
47
|
end
|
|
44
48
|
end
|
|
@@ -1,35 +1,48 @@
|
|
|
1
1
|
<h1>Changes</h1>
|
|
2
2
|
|
|
3
|
-
<p class='changes_feed'><%= link_to 'Changes feed', changes_path(:format => 'atom') %></p>
|
|
4
|
-
|
|
5
3
|
<p>
|
|
6
4
|
Show:
|
|
7
|
-
<%= ([link_to('All', changes_path)] + change_item_types.map { |type| link_to(type.pluralize, changes_path(:
|
|
5
|
+
<%= ([link_to('All', changes_path)] + change_item_types.map { |type| link_to(type.pluralize, changes_path(type: type)) }).join(' | ').html_safe %>
|
|
8
6
|
</p>
|
|
9
7
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
8
|
+
<%= form_tag changes_path, method: :get, class: 'changes_date_filter' do %>
|
|
9
|
+
<%= hidden_field_tag :type, params[:type] if params[:type] %>
|
|
10
|
+
<%= hidden_field_tag :id, params[:id] if params[:id] %>
|
|
11
|
+
<label for="from">From:</label>
|
|
12
|
+
<%= date_field_tag :from, params[:from], id: 'from' %>
|
|
13
|
+
<label for="to">To:</label>
|
|
14
|
+
<%= date_field_tag :to, params[:to], id: 'to' %>
|
|
15
|
+
<%= submit_tag 'Filter', name: nil %>
|
|
16
|
+
<% if params[:from].present? || params[:to].present? %>
|
|
17
|
+
<%= link_to 'Clear', changes_path(type: params[:type], id: params[:id]), class: 'clear_filter' %>
|
|
18
|
+
<% end %>
|
|
19
|
+
<% end %>
|
|
20
|
+
<div class="table-responsive">
|
|
21
|
+
<table class='changes_table table table-bordered'>
|
|
22
|
+
<tfoot>
|
|
23
|
+
<tr>
|
|
24
|
+
<td colspan='2'>
|
|
25
|
+
<%= paginate @versions %>
|
|
26
|
+
</td>
|
|
27
|
+
</tr>
|
|
28
|
+
</tfoot>
|
|
29
|
+
<thead>
|
|
30
|
+
<tr class='changes_header'>
|
|
31
|
+
<th class='change_time'>Time</th>
|
|
32
|
+
<th class='change_details'>Attribute with previous and current values</th>
|
|
33
|
+
</tr>
|
|
34
|
+
</thead>
|
|
35
|
+
<tbody>
|
|
36
|
+
<% if @versions.any? %>
|
|
37
|
+
<% @versions.each do |version| %>
|
|
38
|
+
<% next unless change_show_allowed?(version) %>
|
|
39
|
+
<%= render partial: 'version', object: version %>
|
|
40
|
+
<% end %>
|
|
41
|
+
<% else %>
|
|
42
|
+
<tr>
|
|
43
|
+
<td colspan='2'> — No changes found — </td>
|
|
44
|
+
</tr>
|
|
29
45
|
<% end %>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
</tbody>
|
|
34
|
-
</table>
|
|
35
|
-
|
|
46
|
+
</tbody>
|
|
47
|
+
</table>
|
|
48
|
+
</div>
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
<h1>Change <%= @version.id %></h1>
|
|
2
2
|
|
|
3
3
|
<table class='changes_table'>
|
|
4
|
-
<
|
|
5
|
-
<
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
<thead>
|
|
5
|
+
<tr class='changes_header'>
|
|
6
|
+
<th class='change_time'>Time</th>
|
|
7
|
+
<th class='change_details'>Attribute with previous and current values</th>
|
|
8
|
+
</tr>
|
|
9
|
+
</thead>
|
|
10
|
+
<tbody>
|
|
11
|
+
<%= render partial: 'version', object: @version %>
|
|
12
|
+
</tbody>
|
|
9
13
|
</table>
|
|
10
|
-
|
data/lib/paper_trail_manager.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'rails'
|
|
2
4
|
require 'paper_trail'
|
|
3
5
|
|
|
@@ -7,32 +9,32 @@ rescue LoadError
|
|
|
7
9
|
begin
|
|
8
10
|
require 'kaminari'
|
|
9
11
|
rescue LoadError
|
|
10
|
-
raise LoadError
|
|
12
|
+
raise LoadError, 'will_paginate or kaminari must be in Gemfile or load_path'
|
|
11
13
|
end
|
|
12
14
|
end
|
|
13
15
|
|
|
14
16
|
class PaperTrailManager < Rails::Engine
|
|
15
|
-
initializer
|
|
17
|
+
initializer 'paper_trail_manager.pagination' do
|
|
16
18
|
if defined?(WillPaginate)
|
|
17
|
-
::ActionView::Base.
|
|
19
|
+
::ActionView::Base.define_method(:paginate) { |*args, **kwargs, &block| will_paginate(*args, **kwargs, &block) }
|
|
18
20
|
end
|
|
19
21
|
end
|
|
20
22
|
|
|
21
23
|
@@whodunnit_name_method = :name
|
|
22
24
|
cattr_accessor :whodunnit_class, :whodunnit_name_method, :route_helpers,
|
|
23
|
-
|
|
25
|
+
:layout, :base_controller, :user_path_method, :item_name_method
|
|
24
26
|
|
|
25
|
-
self.base_controller =
|
|
27
|
+
self.base_controller = 'ApplicationController'
|
|
26
28
|
self.user_path_method = :user_path
|
|
27
29
|
|
|
28
30
|
(Pathname(__FILE__).dirname + '..').tap do |base|
|
|
29
|
-
paths[
|
|
30
|
-
paths[
|
|
31
|
+
paths['app/controller'] = base + 'app/controllers'
|
|
32
|
+
paths['app/view'] = base + 'app/views'
|
|
31
33
|
end
|
|
32
34
|
|
|
33
35
|
cattr_accessor :allow_index_block, :allow_show_block, :allow_revert_block
|
|
34
36
|
|
|
35
|
-
block =
|
|
37
|
+
block = proc { true }
|
|
36
38
|
self.allow_index_block = block
|
|
37
39
|
self.allow_show_block = block
|
|
38
40
|
self.allow_revert_block = block
|
|
@@ -50,7 +52,7 @@ class PaperTrailManager < Rails::Engine
|
|
|
50
52
|
end
|
|
51
53
|
|
|
52
54
|
def self.allow_show?(controller, version)
|
|
53
|
-
|
|
55
|
+
allow_show_block.call controller, version
|
|
54
56
|
end
|
|
55
57
|
|
|
56
58
|
# Describe when to allow reverts. Call this with a block that accepts
|