loggable_activity 0.5.0 → 0.5.4
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/CHANGELOG.md +9 -0
- data/README.md +45 -31
- data/app/assets/config/loggable_activity_manifest.js +1 -3
- data/app/assets/javascripts/loggable_activity/application.js +0 -1
- data/app/assets/stylesheets/loggable_activity/activities.scss +25 -0
- data/app/assets/stylesheets/loggable_activity/application.scss +2 -6
- data/app/views/kaminari/{kaminari-turbo-bootstrap → pico}/_first_page.html.erb +0 -1
- data/app/views/kaminari/pico/_last_page.html.erb +12 -0
- data/app/views/layouts/loggable_activity/application.html.slim +20 -0
- data/app/views/loggable_activity/activities/_activities.html.slim +28 -0
- data/app/views/loggable_activity/activities/index.html.erb +5 -6
- data/app/views/loggable_activity/bootstrap/kaminari/_first_page.html.erb +13 -0
- data/app/views/loggable_activity/bootstrap/kaminari/_gap.html.erb +8 -0
- data/app/views/loggable_activity/bootstrap/kaminari/_next_page.html.erb +13 -0
- data/app/views/loggable_activity/bootstrap/kaminari/_page.html.erb +14 -0
- data/app/views/loggable_activity/bootstrap/kaminari/_paginator.html.erb +27 -0
- data/app/views/loggable_activity/bootstrap/kaminari/_prev_page.html.erb +13 -0
- data/config/initializers/kaminari_config.rb +1 -1
- data/lib/loggable_activity/activity.rb +1 -0
- data/lib/loggable_activity/config_schema.json +3 -10
- data/lib/loggable_activity/configuration.rb +3 -8
- data/lib/loggable_activity/engine.rb +0 -5
- data/lib/loggable_activity/hooks.rb +3 -13
- data/lib/loggable_activity/services/payloads_builder.rb +3 -3
- data/lib/loggable_activity/services/update_payloads_builder.rb +4 -4
- data/lib/loggable_activity/version.rb +1 -1
- data/loggable_activity-0.5.0.gem +0 -0
- metadata +41 -33
- data/app/views/layouts/loggable_activity/application.html.erb +0 -19
- data/app/views/loggable_activity/activities/_activities.html.erb +0 -56
- data/app/views/loggable_activity/activities/show.html.erb +0 -2
- /data/app/views/kaminari/{kaminari-turbo-bootstrap → pico}/_gap.html.erb +0 -0
- /data/app/views/kaminari/{kaminari-turbo-bootstrap → pico}/_next_page.html.erb +0 -0
- /data/app/views/kaminari/{kaminari-turbo-bootstrap → pico}/_page.html.erb +0 -0
- /data/app/views/kaminari/{kaminari-turbo-bootstrap → pico}/_paginator.html.erb +0 -0
- /data/app/views/kaminari/{kaminari-turbo-bootstrap → pico}/_prev_page.html.erb +0 -0
- /data/app/views/{kaminari/kaminari-turbo-bootstrap → loggable_activity/bootstrap/kaminari}/_last_page.html.erb +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 24bd885b926bbd2d1b0795d5265b0121b03a99ea3057da14c60669de72d5ef98
|
4
|
+
data.tar.gz: b5d04e92f45bb6d7a1af4d1f6e22489cb4f88798771403ee6ad1cf97ae0433fd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a88d29b6655e37f8713ece59f8cbd48f36da48e2d1f1945e7de7f08572db4591109bd88b4804e6523d9a8c428c12799f04e7d220d221be4b48fc38c6761eee3
|
7
|
+
data.tar.gz: a6e037dc4d8732af308fc162134144a164815d5f1915701cad9cb5b543353fceac2b7bd0a56ae19bd028163eb42b78316f0a16d533da6f24bc0447e7f967bf3c
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## [0.5.3] - 2024-03-21
|
2
|
+
### Breaking change
|
3
|
+
- Styling changed to bootstrap
|
4
|
+
- Configuration.yml changed
|
5
|
+
|
6
|
+
## [0.5.2] - 2024-03-21
|
7
|
+
### Breaking change
|
8
|
+
- Styling with pico css
|
9
|
+
- Public attrs added
|
1
10
|
|
2
11
|
## [0.2.0] - 2024-07-03
|
3
12
|
- Keys kan be kept until LoggableActivity::Sanitizer.run is called
|
data/README.md
CHANGED
@@ -1,31 +1,45 @@
|
|
1
|
-
#
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
1
|
+
# Loggable Activity 🌟
|
2
|
+
Secure protect data and log how it is handled
|
3
|
+
- Keep an activity log of how data in the db are handled.
|
4
|
+
- Protect and secure the privacy of data stored in Activity Logs
|
5
|
+
- Prepare for General Data Protection Regulation (GDPR) compliance.
|
6
|
+
- Handles activities that involves more than one table in the DB.
|
7
|
+
- Encrypt data stored in the activity log
|
8
|
+
- Support binary_ids
|
9
|
+
|
10
|
+
### Important!
|
11
|
+
This project is under development and not ready for production. There might be breaking changes, so please consult the CHANGELOG.md
|
12
|
+
### What it is not
|
13
|
+
- An error logging system
|
14
|
+
- A paper trails system with rollback.
|
15
|
+
- A backup system
|
16
|
+
|
17
|
+
### Applications
|
18
|
+
Most organizations needs to keep a log of how users interact with data stored in the DB
|
19
|
+
- Finance
|
20
|
+
- Healthcare
|
21
|
+
- Sales and Support
|
22
|
+
|
23
|
+
*Super simplified example from the healthcare.*
|
24
|
+
- Each patient has a journal, that is updated on a regular basis.
|
25
|
+
- Supervisor needs to follow the journal, how was it updated, who read it, did it get deleted.
|
26
|
+
- Security personnel needs to know how the journal is handled, who did what when.
|
27
|
+
- Patients has the right to know how their journal is handled and that their data will be removed when required.
|
28
|
+
|
29
|
+
Beside the journal in the db, an activity log is kept so it is possible to track how the journal is used.<br/>
|
30
|
+
At some point in time the patients data from the DB and the activity log has to be removed according to GDPR.<br/>
|
31
|
+
|
32
|
+
### Getting started
|
33
|
+
please read the [GETTING-STARTED.md](https://github.com/LoggableActivity/LoggableActivity/blob/main/GETTING-STARTED.md) guide
|
34
|
+
|
35
|
+
### Contribute
|
36
|
+
👉 Join the Slack channel here: [LoggableActivity Slack Workspace](https://join.slack.com/t/loggableactivity/shared_invite/zt-2a3tvgv37-mGwjHJTrBXBH2srXFRRSXQ)
|
37
|
+
<br/>
|
38
|
+
👉 Want to play around with an online version: [Show Demo](https://loggableactivity-efe7b931c886.herokuapp.com/)
|
39
|
+
<br/>
|
40
|
+
We value each contribution and believe in the power of community. Looking forward to seeing you there!
|
41
|
+
|
42
|
+
|
43
|
+
### Test
|
44
|
+
We embrace the philosophy of black-box testing, where we focus on the input and output of the public interface without worrying about internal implementation details.<br/>
|
45
|
+
This approach aligns with the principle of testing behavior rather than implementation.
|
@@ -0,0 +1,25 @@
|
|
1
|
+
.activity {
|
2
|
+
--bs-alert-bg: transparent;
|
3
|
+
--bs-alert-padding-x: 1rem;
|
4
|
+
--bs-alert-padding-y: 0.5rem;
|
5
|
+
// --bs-alert-margin-bottom: 1rem;
|
6
|
+
--bs-alert-color: inherit;
|
7
|
+
--bs-alert-border-color: transparent;
|
8
|
+
--bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color);
|
9
|
+
--bs-alert-border-radius: var(--bs-border-radius);
|
10
|
+
--bs-alert-link-color: inherit;
|
11
|
+
position: relative;
|
12
|
+
padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x);
|
13
|
+
margin-bottom: var(--bs-alert-margin-bottom);
|
14
|
+
color: var(--bs-alert-color);
|
15
|
+
background-color: var(--bs-alert-bg);
|
16
|
+
border: var(--bs-alert-border);
|
17
|
+
// border-radius: 0;
|
18
|
+
}
|
19
|
+
|
20
|
+
.activity-info {
|
21
|
+
--bs-alert-color: var(--bs-info-text-emphasis);
|
22
|
+
--bs-alert-bg: var(--bs-info-bg-subtle);
|
23
|
+
--bs-alert-border-color: var(--bs-info-border-subtle);
|
24
|
+
--bs-alert-link-color: var(--bs-info-text-emphasis);
|
25
|
+
}
|
@@ -8,7 +8,6 @@
|
|
8
8
|
-%>
|
9
9
|
<% unless current_page.first? %>
|
10
10
|
<li class="page-item">
|
11
|
-
<%# <%= link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, :class => 'page-link', :remote => remote %>
|
12
11
|
<%= link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, class: 'page-link', data: { turbo: true } %>
|
13
12
|
</li>
|
14
13
|
<% end %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<%# Link to the "Last" page
|
2
|
+
- available local variables
|
3
|
+
url: url to the last page
|
4
|
+
current_page: a page object for the currently displayed page
|
5
|
+
num_pages: total number of pages
|
6
|
+
per_page: number of items to fetch per page
|
7
|
+
remote: data-remote
|
8
|
+
-%>
|
9
|
+
<% unless current_page.last? %>
|
10
|
+
<%= link_to_unless current_page.last?, raw(t('views.pagination.last')), url, class: 'page-link', data: { turbo: true } %>
|
11
|
+
</li>
|
12
|
+
<% end %>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
doctype html
|
2
|
+
html
|
3
|
+
head
|
4
|
+
title Loggable activity
|
5
|
+
= csrf_meta_tags
|
6
|
+
= csp_meta_tag
|
7
|
+
= stylesheet_link_tag "loggable_activity/application", media: "all"
|
8
|
+
|
9
|
+
link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.24.1/themes/prism.min.css" rel="stylesheet"
|
10
|
+
script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.24.1/prism.min.js"
|
11
|
+
|
12
|
+
= stylesheet_link_tag 'https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css',
|
13
|
+
integrity: 'sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH',
|
14
|
+
crossorigin: 'anonymous'
|
15
|
+
|
16
|
+
body data-bs-theme="dark"
|
17
|
+
= yield
|
18
|
+
= javascript_include_tag 'https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js',
|
19
|
+
integrity: 'sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz',
|
20
|
+
crossorigin: 'anonymous'
|
@@ -0,0 +1,28 @@
|
|
1
|
+
|
2
|
+
.row
|
3
|
+
.col-3
|
4
|
+
b.text-secondary Action
|
5
|
+
.col-3
|
6
|
+
b.text-secondary Record
|
7
|
+
.col-3
|
8
|
+
b.text-secondary Actor
|
9
|
+
.col-3
|
10
|
+
b.text-secondary Created At
|
11
|
+
|
12
|
+
- @activities.each do |activity|
|
13
|
+
.activity.activity-info[type="button" data-bs-toggle="collapse" data-bs-target="#activity_#{activity.id}" aria-expanded="false" aria-controls="collapseExample"]
|
14
|
+
.row
|
15
|
+
.col-3
|
16
|
+
= activity_action(activity)
|
17
|
+
.col-3
|
18
|
+
= t(activity.record_display_name)
|
19
|
+
.col-3
|
20
|
+
= t(activity.actor_display_name)
|
21
|
+
.col-3
|
22
|
+
= l(activity.created_at, format: :long)
|
23
|
+
.collapse id="activity_#{activity.id}"
|
24
|
+
pre
|
25
|
+
code.language-json
|
26
|
+
= format_json_for_display(activity.attrs)
|
27
|
+
javascript:
|
28
|
+
Prism.highlightAll();
|
@@ -1,7 +1,6 @@
|
|
1
|
-
<
|
2
|
-
|
1
|
+
<div class="container">
|
2
|
+
<h1>Activities</h1>
|
3
|
+
<%= paginate @activities, views_prefix: "loggable_activity/bootstrap" %>
|
4
|
+
<%= render partial: "activities", activities: @activities %>
|
5
|
+
</div>
|
3
6
|
|
4
|
-
<%= paginate @activities, theme: 'kaminari-turbo-bootstrap' %>
|
5
|
-
|
6
|
-
|
7
|
-
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<%# Link to the "First" page
|
2
|
+
- available local variables
|
3
|
+
url: url to the first page
|
4
|
+
current_page: a page object for the currently displayed page
|
5
|
+
num_pages: total number of pages
|
6
|
+
per_page: number of items to fetch per page
|
7
|
+
remote: data-remote
|
8
|
+
-%>
|
9
|
+
<% unless current_page.first? %>
|
10
|
+
<li class="page-item">
|
11
|
+
<%= link_to_unless current_page.first?, raw(t 'views.pagination.first'), url, class: 'page-link', data: { turbo: true } %>
|
12
|
+
</li>
|
13
|
+
<% end %>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<%# Non-link tag that stands for skipped pages...
|
2
|
+
- available local variables
|
3
|
+
current_page: a page object for the currently displayed page
|
4
|
+
num_pages: total number of pages
|
5
|
+
per_page: number of items to fetch per page
|
6
|
+
remote: data-remote
|
7
|
+
-%>
|
8
|
+
<li class="page-item disabled"><a href="#" onclick="return false;" class="page-link"><%= raw(t 'views.pagination.truncate') %></a></li>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<%# Link to the "Next" page
|
2
|
+
- available local variables
|
3
|
+
url: url to the next page
|
4
|
+
current_page: a page object for the currently displayed page
|
5
|
+
num_pages: total number of pages
|
6
|
+
per_page: number of items to fetch per page
|
7
|
+
remote: data-remote
|
8
|
+
-%>
|
9
|
+
<% unless current_page.last? %>
|
10
|
+
<li class="page-item">
|
11
|
+
<%= link_to_unless current_page.last?, raw(t('views.pagination.next')), url, class: 'page-link', rel: 'next', data: { turbo: true }, remote: remote %>
|
12
|
+
</li>
|
13
|
+
<% end %>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<%# Link showing page number
|
2
|
+
- available local variables
|
3
|
+
page: a page object for "this" page
|
4
|
+
url: url to this page
|
5
|
+
current_page: a page object for the currently displayed page
|
6
|
+
num_pages: total number of pages
|
7
|
+
per_page: number of items to fetch per page
|
8
|
+
remote: data-remote
|
9
|
+
-%>
|
10
|
+
<li class="page-item<%= ' active' if page.current? %>">
|
11
|
+
<%#= link_to page, url, opts = {:remote => remote, :class => 'page-link', :rel => page.next? ? 'next' : page.prev? ? 'prev' : nil} %>
|
12
|
+
<%= link_to page, url, class: 'page-link', rel: page.next? ? 'next' : page.prev? ? 'prev' : nil, data: { turbo: true }, remote: remote %>
|
13
|
+
|
14
|
+
</li>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<%# The container tag
|
2
|
+
- available local variables
|
3
|
+
current_page: a page object for the currently displayed page
|
4
|
+
num_pages: total number of pages
|
5
|
+
per_page: number of items to fetch per page
|
6
|
+
remote: data-remote
|
7
|
+
paginator: the paginator that renders the pagination tags inside
|
8
|
+
-%>
|
9
|
+
<%- pagination_class ||= '' %>
|
10
|
+
<%- nav_class ||= '' %>
|
11
|
+
<%= paginator.render do -%>
|
12
|
+
<nav class="<%= nav_class %>">
|
13
|
+
<ul class="pagination <%= pagination_class %>">
|
14
|
+
<%= first_page_tag unless current_page.first? %>
|
15
|
+
<%= prev_page_tag unless current_page.first? %>
|
16
|
+
<% each_page do |page| -%>
|
17
|
+
<% if page.left_outer? || page.right_outer? || page.inside_window? -%>
|
18
|
+
<%= page_tag page %>
|
19
|
+
<% elsif !page.was_truncated? -%>
|
20
|
+
<%= gap_tag %>
|
21
|
+
<% end -%>
|
22
|
+
<% end -%>
|
23
|
+
<%= next_page_tag unless current_page.last? %>
|
24
|
+
<%= last_page_tag unless current_page.last? %>
|
25
|
+
</ul>
|
26
|
+
</nav>
|
27
|
+
<% end -%>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
<%# Link to the "Previous" page
|
2
|
+
- available local variables
|
3
|
+
url: url to the previous page
|
4
|
+
current_page: a page object for the currently displayed page
|
5
|
+
num_pages: total number of pages
|
6
|
+
per_page: number of items to fetch per page
|
7
|
+
remote: data-remote
|
8
|
+
-%>
|
9
|
+
<% unless current_page.first? %>
|
10
|
+
<li class="page-item">
|
11
|
+
<%= link_to_unless current_page.first?, raw(t('views.pagination.previous')), url, rel: 'prev', class: 'page-link', data: { turbo: true }, remote: remote %>
|
12
|
+
</li>
|
13
|
+
<% end %>
|
@@ -2,10 +2,7 @@
|
|
2
2
|
"$schema": "http://json-schema.org/draft-06/schema#",
|
3
3
|
"type": "object",
|
4
4
|
"properties": {
|
5
|
-
"
|
6
|
-
"type": "string"
|
7
|
-
},
|
8
|
-
"current_user_name": {
|
5
|
+
"fetch_actor_name_from": {
|
9
6
|
"type": "string"
|
10
7
|
},
|
11
8
|
"task_for_sanitization": {
|
@@ -13,7 +10,7 @@
|
|
13
10
|
}
|
14
11
|
},
|
15
12
|
"patternProperties": {
|
16
|
-
"^(?!
|
13
|
+
"^(?!fetch_actor_name_from$|task_for_sanitization)[A-Za-z0-9_:]+$": {
|
17
14
|
"type": "object",
|
18
15
|
"properties": {
|
19
16
|
"data_owner": {
|
@@ -72,9 +69,6 @@
|
|
72
69
|
"route": {
|
73
70
|
"type": "string",
|
74
71
|
"minLength": 1
|
75
|
-
},
|
76
|
-
"fetch_record_name_from": {
|
77
|
-
"type": "string"
|
78
72
|
}
|
79
73
|
},
|
80
74
|
"required": [
|
@@ -90,7 +84,6 @@
|
|
90
84
|
},
|
91
85
|
"additionalProperties": false,
|
92
86
|
"required": [
|
93
|
-
"
|
94
|
-
"current_user_name"
|
87
|
+
"fetch_actor_name_from"
|
95
88
|
]
|
96
89
|
}
|
@@ -53,15 +53,10 @@ module LoggableActivity
|
|
53
53
|
end
|
54
54
|
|
55
55
|
# Returns the name of the field or method to use for the actor's display name.
|
56
|
-
def
|
57
|
-
config_data['
|
56
|
+
def fetch_actor_name_from
|
57
|
+
config_data['fetch_actor_name_from']
|
58
58
|
end
|
59
|
-
|
60
|
-
# Returns the name of the model to use for the current user.
|
61
|
-
def current_user_model_name
|
62
|
-
config_data['current_user_model_name']
|
63
|
-
end
|
64
|
-
|
59
|
+
|
65
60
|
# Returns whatever models should be sanitized on delete.
|
66
61
|
def task_for_sanitization
|
67
62
|
config_data['task_for_sanitization']
|
@@ -18,10 +18,5 @@ module LoggableActivity
|
|
18
18
|
#
|
19
19
|
class Engine < ::Rails::Engine
|
20
20
|
isolate_namespace LoggableActivity
|
21
|
-
|
22
|
-
# initializer 'loggable_activity.assets.precompile' do |app|
|
23
|
-
# app.config.assets.precompile += %w( loggable_activity/application.css )
|
24
|
-
# app.config.assets.precompile += %w( loggable_activity/bootstrap.css )
|
25
|
-
# end
|
26
21
|
end
|
27
22
|
end
|
@@ -165,13 +165,13 @@ module LoggableActivity
|
|
165
165
|
|
166
166
|
# Returns the encrypted name of the actor.
|
167
167
|
def encrypted_actor_name
|
168
|
-
name = @actor.send(
|
168
|
+
name = @actor.send(fetch_actor_name_from)
|
169
169
|
::LoggableActivity::Encryption.encrypt(name, actor_secret_key)
|
170
170
|
end
|
171
171
|
|
172
172
|
# Reads the field to feetch the record name from.
|
173
|
-
def
|
174
|
-
::LoggableActivity::Configuration.
|
173
|
+
def fetch_actor_name_from
|
174
|
+
::LoggableActivity::Configuration.fetch_actor_name_from
|
175
175
|
end
|
176
176
|
|
177
177
|
# Returns the action key for the current action.
|
@@ -194,16 +194,6 @@ module LoggableActivity
|
|
194
194
|
encryption_key_for_record(@actor)&.secret_key
|
195
195
|
end
|
196
196
|
|
197
|
-
# Returns the display name of the actor.
|
198
|
-
def actor__name_field
|
199
|
-
Rails.application.config.loggable_activity.actor_display_name || "id: #{@actor.id}, class: #{@actor.class.name}"
|
200
|
-
end
|
201
|
-
|
202
|
-
# Returns the model name of the current user.
|
203
|
-
def current_user_model?
|
204
|
-
Rails.application.config.loggable_activity.current_user_model_name == self.class.name
|
205
|
-
end
|
206
|
-
|
207
197
|
class_methods do
|
208
198
|
# The loggable_attrs attribute is used read the configuration for the model that included LoggableActivity::Hooks.
|
209
199
|
attr_accessor :loggable_attrs, :relations, :auto_log, :fetch_record_name_from, :route, :public_attrs
|
@@ -57,7 +57,7 @@ module LoggableActivity
|
|
57
57
|
def build_has_many_payloads(relation_config)
|
58
58
|
relation = (relation_config['has_many']).to_s
|
59
59
|
records = @record.send(relation)
|
60
|
-
data_owner = relation_config['data_owner']
|
60
|
+
data_owner = relation_config['data_owner'] || false
|
61
61
|
options = { related_to_activity_as: 'has_many_payload', current_payload: true, data_owner: }
|
62
62
|
records.each do |record|
|
63
63
|
record.disable_hooks!
|
@@ -73,7 +73,7 @@ module LoggableActivity
|
|
73
73
|
|
74
74
|
record.disable_hooks!
|
75
75
|
|
76
|
-
data_owner = relation_config['data_owner']
|
76
|
+
data_owner = relation_config['data_owner'] || false
|
77
77
|
options =
|
78
78
|
{
|
79
79
|
related_to_activity_as: 'has_one_payload',
|
@@ -90,7 +90,7 @@ module LoggableActivity
|
|
90
90
|
record = @record.send(relation)
|
91
91
|
return if record.nil?
|
92
92
|
|
93
|
-
data_owner = relation_config['data_owner']
|
93
|
+
data_owner = relation_config['data_owner'] || false
|
94
94
|
|
95
95
|
if data_owner
|
96
96
|
encryption_key = encryption_key_for_record(@record)
|
@@ -56,7 +56,7 @@ module LoggableActivity
|
|
56
56
|
relation_id = "#{relation_config['belongs_to']}_id"
|
57
57
|
model_class_name = relation_config['model']
|
58
58
|
model_class = model_class_name.constantize
|
59
|
-
data_owner = relation_config['data_owner']
|
59
|
+
data_owner = relation_config['data_owner'] || false
|
60
60
|
|
61
61
|
model_ids = saved_changes(@record).map { |hash| hash[relation_id] }
|
62
62
|
|
@@ -101,7 +101,7 @@ module LoggableActivity
|
|
101
101
|
)
|
102
102
|
|
103
103
|
previous_values = previous_values.slice(*loggable_attrs)
|
104
|
-
data_owner = relation_config['data_owner']
|
104
|
+
data_owner = relation_config['data_owner'] || false
|
105
105
|
options = { related_to_activity_as: 'has_many_update_payload', current_payload: true, data_owner: }
|
106
106
|
|
107
107
|
build_encrypted_update_payload(
|
@@ -115,7 +115,7 @@ module LoggableActivity
|
|
115
115
|
|
116
116
|
def build_has_many_create_payload(relation_config, record)
|
117
117
|
record.disable_hooks = true
|
118
|
-
data_owner = relation_config['data_owner']
|
118
|
+
data_owner = relation_config['data_owner'] || false
|
119
119
|
options =
|
120
120
|
{ related_to_activity_as: 'has_many_create_payload', current_payload: true, data_owner: }
|
121
121
|
build_encrypted_payload(record, options)
|
@@ -138,7 +138,7 @@ module LoggableActivity
|
|
138
138
|
|
139
139
|
previous_values = previous_values.slice(*loggable_attrs)
|
140
140
|
current_values = current_values.slice(*loggable_attrs)
|
141
|
-
data_owner = relation_config['data_owner']
|
141
|
+
data_owner = relation_config['data_owner'] || false
|
142
142
|
options = { related_to_activity_as: 'has_one_update_payload', current_payload: true, data_owner: }
|
143
143
|
|
144
144
|
build_encrypted_update_payload(
|
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: loggable_activity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Max Groenlund
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-07-
|
11
|
+
date: 2024-07-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -24,26 +24,6 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 7.1.3
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: bootstrap
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '5.3'
|
34
|
-
- - ">="
|
35
|
-
- !ruby/object:Gem::Version
|
36
|
-
version: 5.3.3
|
37
|
-
type: :runtime
|
38
|
-
prerelease: false
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
40
|
-
requirements:
|
41
|
-
- - "~>"
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: '5.3'
|
44
|
-
- - ">="
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: 5.3.3
|
47
27
|
- !ruby/object:Gem::Dependency
|
48
28
|
name: json-schema
|
49
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -118,6 +98,26 @@ dependencies:
|
|
118
98
|
- - ">="
|
119
99
|
- !ruby/object:Gem::Version
|
120
100
|
version: 2.1.2
|
101
|
+
- !ruby/object:Gem::Dependency
|
102
|
+
name: slim-rails
|
103
|
+
requirement: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - "~>"
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '3.6'
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 3.6.3
|
111
|
+
type: :runtime
|
112
|
+
prerelease: false
|
113
|
+
version_requirements: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '3.6'
|
118
|
+
- - ">="
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: 3.6.3
|
121
121
|
- !ruby/object:Gem::Dependency
|
122
122
|
name: sqlite3
|
123
123
|
requirement: !ruby/object:Gem::Requirement
|
@@ -251,6 +251,7 @@ files:
|
|
251
251
|
- app/assets/config/loggable_activity_manifest.js
|
252
252
|
- app/assets/images/loggable_activity/.keep
|
253
253
|
- app/assets/javascripts/loggable_activity/application.js
|
254
|
+
- app/assets/stylesheets/loggable_activity/activities.scss
|
254
255
|
- app/assets/stylesheets/loggable_activity/application.scss
|
255
256
|
- app/controllers/concerns/.keep
|
256
257
|
- app/controllers/loggable_activity/activities_controller.rb
|
@@ -260,17 +261,23 @@ files:
|
|
260
261
|
- app/jobs/loggable_activity/application_job.rb
|
261
262
|
- app/mailers/loggable_activity/application_mailer.rb
|
262
263
|
- app/models/loggable_activity/application_record.rb
|
263
|
-
- app/views/kaminari/
|
264
|
-
- app/views/kaminari/
|
265
|
-
- app/views/kaminari/
|
266
|
-
- app/views/kaminari/
|
267
|
-
- app/views/kaminari/
|
268
|
-
- app/views/kaminari/
|
269
|
-
- app/views/kaminari/
|
270
|
-
- app/views/layouts/loggable_activity/application.html.
|
271
|
-
- app/views/loggable_activity/activities/_activities.html.
|
264
|
+
- app/views/kaminari/pico/_first_page.html.erb
|
265
|
+
- app/views/kaminari/pico/_gap.html.erb
|
266
|
+
- app/views/kaminari/pico/_last_page.html.erb
|
267
|
+
- app/views/kaminari/pico/_next_page.html.erb
|
268
|
+
- app/views/kaminari/pico/_page.html.erb
|
269
|
+
- app/views/kaminari/pico/_paginator.html.erb
|
270
|
+
- app/views/kaminari/pico/_prev_page.html.erb
|
271
|
+
- app/views/layouts/loggable_activity/application.html.slim
|
272
|
+
- app/views/loggable_activity/activities/_activities.html.slim
|
272
273
|
- app/views/loggable_activity/activities/index.html.erb
|
273
|
-
- app/views/loggable_activity/
|
274
|
+
- app/views/loggable_activity/bootstrap/kaminari/_first_page.html.erb
|
275
|
+
- app/views/loggable_activity/bootstrap/kaminari/_gap.html.erb
|
276
|
+
- app/views/loggable_activity/bootstrap/kaminari/_last_page.html.erb
|
277
|
+
- app/views/loggable_activity/bootstrap/kaminari/_next_page.html.erb
|
278
|
+
- app/views/loggable_activity/bootstrap/kaminari/_page.html.erb
|
279
|
+
- app/views/loggable_activity/bootstrap/kaminari/_paginator.html.erb
|
280
|
+
- app/views/loggable_activity/bootstrap/kaminari/_prev_page.html.erb
|
274
281
|
- config/initializers/kaminari_config.rb
|
275
282
|
- config/routes.rb
|
276
283
|
- db/migrate/20240702092648_create_loggable_activity_tables.rb
|
@@ -311,6 +318,7 @@ files:
|
|
311
318
|
- lib/loggable_activity/services/update_payloads_builder.rb
|
312
319
|
- lib/loggable_activity/version.rb
|
313
320
|
- lib/tasks/loggable_activity_tasks.rake
|
321
|
+
- loggable_activity-0.5.0.gem
|
314
322
|
homepage: https://loggableactivity-efe7b931c886.herokuapp.com/
|
315
323
|
licenses:
|
316
324
|
- MIT
|
@@ -1,19 +0,0 @@
|
|
1
|
-
<!DOCTYPE html>
|
2
|
-
<html>
|
3
|
-
<head>
|
4
|
-
<title>Loggable activity</title>
|
5
|
-
<%= csrf_meta_tags %>
|
6
|
-
<%= csp_meta_tag %>
|
7
|
-
<%= stylesheet_link_tag "loggable_activity/application", media: "all" %>
|
8
|
-
<%= javascript_include_tag 'loggable_activity/application', defer: true %>
|
9
|
-
<link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.24.1/themes/prism.min.css" rel="stylesheet">
|
10
|
-
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.24.1/prism.min.js"></script>
|
11
|
-
|
12
|
-
</head>
|
13
|
-
<body>
|
14
|
-
<div class="container">
|
15
|
-
<%= yield %>
|
16
|
-
</div>
|
17
|
-
|
18
|
-
</body>
|
19
|
-
</html>
|
@@ -1,56 +0,0 @@
|
|
1
|
-
<table class="table table-borderless">
|
2
|
-
<thead>
|
3
|
-
<tr>
|
4
|
-
<th>
|
5
|
-
<div class="row">
|
6
|
-
<div class="col-3">
|
7
|
-
<b class="text-secondary">Action</b>
|
8
|
-
</div>
|
9
|
-
<div class="col-3">
|
10
|
-
<b class="text-secondary">Record</b>
|
11
|
-
</div>
|
12
|
-
<div class="col-3">
|
13
|
-
<b class="text-secondary">Actor</b>
|
14
|
-
</div>
|
15
|
-
<div class="col-3">
|
16
|
-
<b class="text-secondary">Created At</b>
|
17
|
-
</div>
|
18
|
-
</div>
|
19
|
-
</th>
|
20
|
-
</tr>
|
21
|
-
</thead>
|
22
|
-
<tbody>
|
23
|
-
<% @activities.each do |activity| %>
|
24
|
-
<tr>
|
25
|
-
<td>
|
26
|
-
<div class="alert alert-info" type="button" data-bs-toggle="collapse" data-bs-target="#activity_<%= activity.id %>" aria-expanded="false" aria-controls="collapseExample">
|
27
|
-
<div class="row">
|
28
|
-
<div class="col-3">
|
29
|
-
<%= activity_action(activity) %>
|
30
|
-
</div>
|
31
|
-
<div class="col-3">
|
32
|
-
<%= t(activity.record_display_name) %>
|
33
|
-
</div>
|
34
|
-
<div class="col-3">
|
35
|
-
<%= t(activity.actor_display_name) %>
|
36
|
-
</div>
|
37
|
-
<div class="col-3">
|
38
|
-
<%= l(activity.created_at, format: :long) %>
|
39
|
-
</div>
|
40
|
-
</div>
|
41
|
-
</div>
|
42
|
-
<div class="collapse" id="activity_<%= activity.id %>">
|
43
|
-
<pre>
|
44
|
-
<code class="language-json">
|
45
|
-
<%= format_json_for_display(activity.attrs) %>
|
46
|
-
</code>
|
47
|
-
</pre>
|
48
|
-
</div>
|
49
|
-
</td>
|
50
|
-
</tr>
|
51
|
-
<% end %>
|
52
|
-
</tbody>
|
53
|
-
</table>
|
54
|
-
<script>
|
55
|
-
Prism.highlightAll();
|
56
|
-
</script>
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|