paper_trail_viewer 1.0.0 → 1.1.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 +4 -4
- data/.github/workflows/{test.yml → tests.yml} +0 -0
- data/CHANGELOG.md +13 -0
- data/README.md +28 -10
- data/app/controllers/paper_trail_viewer/versions_controller.rb +5 -111
- data/app/views/paper_trail_viewer/viewer/index.html.erb +1 -1
- data/javascript/compiled.js +1 -1
- data/javascript/src/app.tsx +24 -13
- data/javascript/src/components/context_menu.tsx +61 -0
- data/javascript/src/components/index.ts +1 -0
- data/javascript/src/components/version_context_menu.tsx +110 -0
- data/javascript/src/components/versions_list.tsx +37 -47
- data/javascript/src/types.ts +9 -1
- data/lib/paper_trail_viewer/data_source/active_record.rb +13 -12
- data/lib/paper_trail_viewer/data_source/base.rb +87 -0
- data/lib/paper_trail_viewer/data_source/bigquery.rb +9 -8
- data/lib/paper_trail_viewer/query.rb +23 -0
- data/lib/paper_trail_viewer/rollback.rb +20 -0
- data/lib/paper_trail_viewer/version.rb +1 -1
- data/lib/paper_trail_viewer.rb +4 -0
- data/paper_trail_viewer.gemspec +0 -1
- data/spec/system/paper_trail_viewer_spec.rb +79 -64
- metadata +9 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c575ab1f007c5581b6a24b67e2d3b2843719d2bbf8399bcf7d1823cd3194b7dd
|
4
|
+
data.tar.gz: bb92946d7a3a688a7a1e5d6175d7deba19516330e745aa6850d679d8a480c5d9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1754241bae44d5e79f91d570fb4fe81d2b9cad78fc8289ad02353e88bdf7fa7b29c727530ec81230e7025d231b50af4fe2fbe1977ae56c535a3fd736f300f313
|
7
|
+
data.tar.gz: 1f473d3e9fedd0c69d3209557573d79d85bc7b64526f8d997f6400f3447ee9bfe355bdc933da1b2b4063d05b20ef2bde1abfdaa6550f57d5187586c0fb7365f3
|
File without changes
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,19 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
5
5
|
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
+
## [1.1.0] - 2022-03-27
|
8
|
+
|
9
|
+
### Added
|
10
|
+
|
11
|
+
- Basic support for custom version classes
|
12
|
+
- Rollback functionality
|
13
|
+
- Track item functionality
|
14
|
+
|
15
|
+
### Fixed
|
16
|
+
|
17
|
+
- `LoadError` with data source `ActiveRecord`
|
18
|
+
- `bin/setup` being considered a gem executable
|
19
|
+
|
7
20
|
## [1.0.0] - 2022-03-26
|
8
21
|
|
9
22
|
Initial release.
|
data/README.md
CHANGED
@@ -1,23 +1,33 @@
|
|
1
1
|
[](http://badge.fury.io/rb/paper_trail_viewer)
|
2
|
-
[](https://github.com/jaynetics/paper_trail_viewer/actions)
|
2
|
+
[](https://github.com/jaynetics/paper_trail_viewer/actions)
|
3
3
|
|
4
4
|
# PaperTrailViewer
|
5
5
|
|
6
|
-
Browse changes to records when using Ruby on Rails and the [`paper_trail`
|
6
|
+
Browse changes to records when using Ruby on Rails and the [`paper_trail`](https://github.com/paper-trail-gem/paper_trail) gem.
|
7
|
+
|
8
|
+
[
|
9
|
+

|
12
|
+
](https://user-images.githubusercontent.com/10758879/160241664-fa1a6c08-54f1-4d32-9010-16b501b70f60.png)
|
7
13
|
|
8
14
|
## Installation
|
9
15
|
|
10
16
|
Add `paper_trail_viewer` to your bundle and add the following line to your `config/routes.rb`:
|
11
17
|
|
12
|
-
|
18
|
+
```ruby
|
19
|
+
mount PaperTrailViewer::Engine => '/changes'
|
20
|
+
```
|
13
21
|
|
14
22
|
You can pick any path. Restart the server and go to the chosen path to view your versions.
|
15
23
|
|
16
|
-
To limit access
|
24
|
+
To limit access, do something like this:
|
17
25
|
|
18
|
-
|
19
|
-
|
20
|
-
|
26
|
+
```ruby
|
27
|
+
authenticate :user, ->*{ |u| u.superadmin? } do
|
28
|
+
mount PaperTrailViewer::Engine => '/changes'
|
29
|
+
end
|
30
|
+
```
|
21
31
|
|
22
32
|
### Configuration
|
23
33
|
|
@@ -25,8 +35,15 @@ Put configuration in `config/initializers/paper_trail_viewer.rb`.
|
|
25
35
|
|
26
36
|
E.g. for linking (or not) to the whodunnit user with a custom path helper:
|
27
37
|
|
28
|
-
|
29
|
-
|
38
|
+
```ruby
|
39
|
+
PaperTrailViewer.user_path_method = :admin_path # default is :user_path
|
40
|
+
PaperTrailViewer.user_path_method = nil # don't link to the user
|
41
|
+
```
|
42
|
+
|
43
|
+
Other options are:
|
44
|
+
|
45
|
+
- `PaperTrailViewer.allow_rollback` (default is `true`)
|
46
|
+
- `PaperTrailViewer.data_source` (default is `ActiveRecord`)
|
30
47
|
|
31
48
|
## Development
|
32
49
|
|
@@ -38,7 +55,8 @@ E.g. for linking (or not) to the whodunnit user with a custom path helper:
|
|
38
55
|
|
39
56
|
### Running tests
|
40
57
|
|
41
|
-
|
58
|
+
This repo uses the [`appraisal`](https://github.com/thoughtbot/appraisal) gem.
|
59
|
+
|
42
60
|
* Run `appraisal generate`
|
43
61
|
* Run `appraisal install`
|
44
62
|
* Run `appraisal rake generate_spec_app`
|
@@ -1,119 +1,13 @@
|
|
1
1
|
class PaperTrailViewer::VersionsController < ActionController::Base
|
2
2
|
# Return the queried versions as JSON.
|
3
3
|
def index
|
4
|
-
|
5
|
-
|
6
|
-
versions_as_json = versions.map { |v| version_as_json(v) }
|
7
|
-
|
8
|
-
render json: {
|
9
|
-
hasNextPage: !versions.last_page? && versions_as_json.any?,
|
10
|
-
query: query,
|
11
|
-
versions: versions_as_json,
|
12
|
-
}
|
4
|
+
result = PaperTrailViewer.data_source.call(params, main_app)
|
5
|
+
render json: result
|
13
6
|
end
|
14
7
|
|
15
|
-
#
|
8
|
+
# Roll back a change.
|
16
9
|
def update
|
17
|
-
|
18
|
-
|
19
|
-
return redirect_to(root_url)
|
20
|
-
end
|
21
|
-
|
22
|
-
result =
|
23
|
-
if version.event == 'create'
|
24
|
-
version.item_type.constantize.find(version.item_id).destroy
|
25
|
-
else
|
26
|
-
version.reify.save
|
27
|
-
end
|
28
|
-
|
29
|
-
if result
|
30
|
-
if version.event == 'create'
|
31
|
-
flash[:notice] = 'Rolled back newly-created record by destroying it.'
|
32
|
-
redirect_to root_url
|
33
|
-
else
|
34
|
-
flash[:notice] = 'Rolled back changes to this record.'
|
35
|
-
redirect_to change_item_url(version)
|
36
|
-
end
|
37
|
-
else
|
38
|
-
flash[:error] = "Couldn't rollback. Sorry."
|
39
|
-
redirect_to root_url
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
private
|
44
|
-
|
45
|
-
def sanitized_params
|
46
|
-
{
|
47
|
-
event: params[:event].presence_in(%w[create update destroy]),
|
48
|
-
filter: (params[:filter].presence if params[:filter] != '%%'),
|
49
|
-
item_id: params[:item_id].presence,
|
50
|
-
item_type: params[:item_type].presence,
|
51
|
-
page: (page = params[:page].to_i) > 0 ? page : 1,
|
52
|
-
per_page: (per = params[:per_page].to_i).clamp(1, 1000),
|
53
|
-
}
|
54
|
-
end
|
55
|
-
|
56
|
-
def version_as_json(version)
|
57
|
-
{
|
58
|
-
**version.attributes.slice(*%w[id whodunnit event created_at]),
|
59
|
-
changeset: changeset_for(version),
|
60
|
-
object: load_object(version),
|
61
|
-
item_id: version.item_id.to_s,
|
62
|
-
item_type: version.item_type,
|
63
|
-
item_url: change_item_url(version),
|
64
|
-
user_url: user_url(version),
|
65
|
-
}
|
66
|
-
end
|
67
|
-
|
68
|
-
def changeset_for(version)
|
69
|
-
case version.event
|
70
|
-
when 'create', 'update'
|
71
|
-
version.changeset || {}
|
72
|
-
when 'destroy'
|
73
|
-
record = version.reify rescue nil
|
74
|
-
return {} unless record
|
75
|
-
|
76
|
-
record.attributes.each_with_object({}) do |changes, (k, v)|
|
77
|
-
changes[k] = [v, nil] unless v.nil?
|
78
|
-
end
|
79
|
-
else
|
80
|
-
raise ArgumentError, "Unknown event: #{version.event}"
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
# Return the URL for the item represented by the +version+,
|
85
|
-
# e.g. a Company record instance referenced by a version.
|
86
|
-
def change_item_url(version)
|
87
|
-
version_type = version.item_type.underscore.split('/').last
|
88
|
-
main_app.try("#{version_type}_url", version.item_id)
|
89
|
-
end
|
90
|
-
|
91
|
-
def user_url(version)
|
92
|
-
(path_method = PaperTrailViewer.user_path_method).present? &&
|
93
|
-
(id = version.whodunnit).present? &&
|
94
|
-
!id.start_with?('#') &&
|
95
|
-
main_app.try(path_method, id) ||
|
96
|
-
nil
|
97
|
-
end
|
98
|
-
|
99
|
-
def load_object(version)
|
100
|
-
obj = version.object
|
101
|
-
if obj.is_a?(String)
|
102
|
-
PaperTrail.serializer.load(obj)
|
103
|
-
elsif obj.is_a?(Hash)
|
104
|
-
OpenStruct.new(obj)
|
105
|
-
else
|
106
|
-
obj
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
# backport deserialization fix for recent rubies
|
112
|
-
# https://github.com/paper-trail-gem/paper_trail/pull/1338
|
113
|
-
if PaperTrail::VERSION.to_s < '12.2.0'
|
114
|
-
module PaperTrail::Serializers::YAML
|
115
|
-
def load(string)
|
116
|
-
::YAML.respond_to?(:unsafe_load) ? ::YAML.unsafe_load(string) : ::YAML.load(string)
|
117
|
-
end
|
10
|
+
result = PaperTrailViewer::Rollback.call(version_id: params[:id])
|
11
|
+
render json: result
|
118
12
|
end
|
119
13
|
end
|