sail 3.5.1 → 3.6.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/MIT-LICENSE +1 -1
- data/app/assets/javascripts/sail/settings.js +66 -11
- data/app/assets/stylesheets/sail/settings.css +6 -2
- data/app/controllers/sail/profiles_controller.rb +1 -1
- data/app/controllers/sail/settings_controller.rb +3 -2
- data/app/models/sail/entry.rb +1 -1
- data/app/models/sail/setting.rb +1 -1
- data/app/views/sail/settings/_setting.html.erb +1 -1
- data/app/views/sail/settings/update.js.erb +6 -0
- data/lib/sail/engine.rb +4 -3
- data/lib/sail/instrumenter.rb +6 -1
- data/lib/sail/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7ed99e4dc6a1bed5c7a9589ab92f2c6f949a3edd4736f51d8cc9a7d9db3371b5
|
4
|
+
data.tar.gz: f022be75af316c34c01921332e29ebdaf458e4d3bb479bc6d64e57922b26e0a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 947727892ed9b5b32b627e9a09e6c4de4d0834e49cd6103eddafe562b4746dae304cdce768655bd20584238c8121e1f0f35f27a7539ee9ad7d9d6529e2ab28d5
|
7
|
+
data.tar.gz: 23f380a2e8a21b36b84f468e6828bd189a3d91f12cca6f1e43985e10573d24cd419d72ebb8545689f271953938c62167382723fa458486f3c51ef8f5bd006dc7
|
data/MIT-LICENSE
CHANGED
@@ -4,7 +4,9 @@
|
|
4
4
|
Search related functions
|
5
5
|
*/
|
6
6
|
|
7
|
-
let submitTimer,
|
7
|
+
let submitTimer,
|
8
|
+
submitInterval,
|
9
|
+
intervals = 1;
|
8
10
|
let queryElement = document.getElementById("query");
|
9
11
|
let autoSearchEnabled = document.getElementById("auto_search_enabled").value;
|
10
12
|
let progress = document.getElementById("search-submit-progress");
|
@@ -17,6 +19,8 @@ let guideButton = document.getElementById("btn-guide");
|
|
17
19
|
let guide = document.getElementById("guide-modal");
|
18
20
|
let guideSections = guide.getElementsByTagName("summary");
|
19
21
|
let cardTitles = document.getElementsByClassName("card-title");
|
22
|
+
let inputs = document.getElementsByName("value");
|
23
|
+
const initialSettingValues = {};
|
20
24
|
let i;
|
21
25
|
|
22
26
|
function submitSearch() {
|
@@ -64,12 +68,23 @@ function toggleModal(modal) {
|
|
64
68
|
function handleGenericClick(event) {
|
65
69
|
let target = event.target;
|
66
70
|
|
67
|
-
if (
|
71
|
+
if (
|
72
|
+
orderButton !== null &&
|
73
|
+
(target === sortMenu ||
|
74
|
+
sortMenu.contains(target) ||
|
75
|
+
target === orderButton ||
|
76
|
+
orderButton.contains(target))
|
77
|
+
) {
|
68
78
|
return;
|
69
79
|
}
|
70
80
|
|
71
|
-
if (
|
72
|
-
profilesButton
|
81
|
+
if (
|
82
|
+
profilesButton !== null &&
|
83
|
+
(target === profilesMenu ||
|
84
|
+
profilesMenu.contains(target) ||
|
85
|
+
target === profilesButton ||
|
86
|
+
profilesButton.contains(target))
|
87
|
+
) {
|
73
88
|
return;
|
74
89
|
}
|
75
90
|
|
@@ -99,10 +114,14 @@ if (queryElement !== null) {
|
|
99
114
|
}
|
100
115
|
|
101
116
|
orderButton.addEventListener("click", toggleSortMenu);
|
102
|
-
profilesButton.addEventListener("click", function () {
|
117
|
+
profilesButton.addEventListener("click", function () {
|
118
|
+
toggleModal(profilesMenu);
|
119
|
+
});
|
103
120
|
}
|
104
121
|
|
105
|
-
guideButton.addEventListener("click", function () {
|
122
|
+
guideButton.addEventListener("click", function () {
|
123
|
+
toggleModal(guide);
|
124
|
+
});
|
106
125
|
document.body.addEventListener("click", handleGenericClick);
|
107
126
|
document.addEventListener("keydown", closeAllModals);
|
108
127
|
|
@@ -117,18 +136,21 @@ function refreshClick() {
|
|
117
136
|
|
118
137
|
if (!button.className.includes("active")) {
|
119
138
|
button.classList.add("active");
|
120
|
-
setTimeout(function() {
|
139
|
+
setTimeout(function () {
|
140
|
+
button.classList.remove("active");
|
141
|
+
}, 500);
|
121
142
|
}
|
122
143
|
}
|
123
144
|
|
124
|
-
for(i = 0; i < refreshButtons.length; i++)
|
145
|
+
for (i = 0; i < refreshButtons.length; i++)
|
146
|
+
refreshButtons[i].addEventListener("click", refreshClick);
|
125
147
|
|
126
148
|
/*
|
127
149
|
Guide related functions
|
128
150
|
*/
|
129
151
|
|
130
152
|
function sectionClick() {
|
131
|
-
for(i = 0; i < guideSections.length; i++) {
|
153
|
+
for (i = 0; i < guideSections.length; i++) {
|
132
154
|
if (this.parentElement.open) {
|
133
155
|
guideSections[i].parentElement.style.display = "block";
|
134
156
|
} else if (this !== guideSections[i]) {
|
@@ -137,7 +159,8 @@ function sectionClick() {
|
|
137
159
|
}
|
138
160
|
}
|
139
161
|
|
140
|
-
for(i = 0; i < guideSections.length; i++)
|
162
|
+
for (i = 0; i < guideSections.length; i++)
|
163
|
+
guideSections[i].addEventListener("click", sectionClick);
|
141
164
|
|
142
165
|
/*
|
143
166
|
Cards related functions
|
@@ -147,4 +170,36 @@ function flipCard() {
|
|
147
170
|
this.parentElement.parentElement.classList.toggle("flipped");
|
148
171
|
}
|
149
172
|
|
150
|
-
for(i = 0; i < cardTitles.length; i++)
|
173
|
+
for (i = 0; i < cardTitles.length; i++)
|
174
|
+
cardTitles[i].addEventListener("click", flipCard);
|
175
|
+
|
176
|
+
function enableSubmitButton() {
|
177
|
+
const name = this.id.replace("input_for_", "");
|
178
|
+
const submitId = this.id.replace("input_for_", "btn-submit-");
|
179
|
+
const submit = document.getElementById(submitId);
|
180
|
+
const value = this.type === "checkbox" ? this.checked : this.value;
|
181
|
+
|
182
|
+
if (value === initialSettingValues[name]) {
|
183
|
+
submit.classList.remove("orange");
|
184
|
+
submit.disabled = true;
|
185
|
+
} else {
|
186
|
+
submit.classList.add("orange");
|
187
|
+
submit.disabled = false;
|
188
|
+
}
|
189
|
+
}
|
190
|
+
|
191
|
+
for (i = 0; i < inputs.length; i++) {
|
192
|
+
if (inputs[i].type === "text") {
|
193
|
+
inputs[i].addEventListener("input", enableSubmitButton);
|
194
|
+
} else {
|
195
|
+
inputs[i].addEventListener("change", enableSubmitButton);
|
196
|
+
}
|
197
|
+
|
198
|
+
if (inputs[i].type === "checkbox") {
|
199
|
+
initialSettingValues[inputs[i].id.replace("input_for_", "")] =
|
200
|
+
inputs[i].checked;
|
201
|
+
} else {
|
202
|
+
initialSettingValues[inputs[i].id.replace("input_for_", "")] =
|
203
|
+
inputs[i].value;
|
204
|
+
}
|
205
|
+
}
|
@@ -534,7 +534,7 @@
|
|
534
534
|
-webkit-border-radius: 5px;
|
535
535
|
-moz-border-radius: 5px;
|
536
536
|
border-radius: 5px;
|
537
|
-
background-color: var(--
|
537
|
+
background-color: var(--aluminium);
|
538
538
|
border: none;
|
539
539
|
outline: none;
|
540
540
|
-webkit-transition: background-color 0.5s;
|
@@ -545,11 +545,15 @@
|
|
545
545
|
box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
|
546
546
|
}
|
547
547
|
|
548
|
+
.btn-sail, #settings-dashboard .card .btn-value-submit.orange {
|
549
|
+
background-color: var(--tangerine);
|
550
|
+
}
|
551
|
+
|
548
552
|
.btn-sail:active {
|
549
553
|
color: var(--main-black);
|
550
554
|
opacity: .8;
|
551
555
|
}
|
552
556
|
|
553
|
-
.btn-sail :hover {
|
557
|
+
.btn-sail:hover, #settings-dashboard .card .btn-value-submit.orange:hover {
|
554
558
|
background-color: var(--dark-tangerine);
|
555
559
|
}
|
@@ -20,7 +20,7 @@ module Sail
|
|
20
20
|
def update
|
21
21
|
respond_to do |format|
|
22
22
|
@setting, @successful_update = Setting.set(s_params[:name], s_params[:value])
|
23
|
-
format.js
|
23
|
+
format.js
|
24
24
|
format.json { @successful_update ? head(:ok) : head(:conflict) }
|
25
25
|
end
|
26
26
|
end
|
@@ -65,7 +65,8 @@ module Sail
|
|
65
65
|
def s_params
|
66
66
|
params.permit(:page, :query, :name,
|
67
67
|
:value, :positive, :negative,
|
68
|
-
:throttled_by, :order_field
|
68
|
+
:throttled_by, :order_field,
|
69
|
+
:_method, :locale, :authenticity_token)
|
69
70
|
end
|
70
71
|
|
71
72
|
def log_update
|
data/app/models/sail/entry.rb
CHANGED
@@ -12,7 +12,7 @@ module Sail
|
|
12
12
|
belongs_to :profile
|
13
13
|
validates :value, :setting, :profile, presence: true
|
14
14
|
|
15
|
-
scope :by_profile_name, ->(name) { joins(:profile).where(
|
15
|
+
scope :by_profile_name, ->(name) { joins(:profile).where(sail_profiles: { name: name }) }
|
16
16
|
|
17
17
|
delegate :name, to: :setting
|
18
18
|
|
data/app/models/sail/setting.rb
CHANGED
@@ -62,7 +62,7 @@
|
|
62
62
|
<% end %>
|
63
63
|
|
64
64
|
<div class="submit-container">
|
65
|
-
<button id="btn-submit-<%= setting.name %>" type="submit" class="btn-value-submit"><%= I18n.t("sail.save") %></button>
|
65
|
+
<button id="btn-submit-<%= setting.name %>" type="submit" class="btn-value-submit" disabled><%= I18n.t("sail.save") %></button>
|
66
66
|
|
67
67
|
<span id="success-<%= setting.name %>" class="notice success">
|
68
68
|
<%= image_tag("sail/checkmark.svg") %>
|
@@ -11,10 +11,16 @@ setTimeout(function () {
|
|
11
11
|
|
12
12
|
if ("<%= @successful_update %>" === "true") {
|
13
13
|
var input = document.getElementById("<%= "input_for_#{@setting.name}" %>");
|
14
|
+
var submitButton = document.getElementById("<%= "btn-submit-#{@setting.name}" %>");
|
14
15
|
|
15
16
|
if ("<%= @setting.boolean? %>" === "true") {
|
16
17
|
input.checked = "<%= @setting.value %>" === "true";
|
18
|
+
initialSettingValues["<%= @setting.name %>"] = "<%= @setting.value %>" === "true";
|
17
19
|
} else {
|
18
20
|
input.value = "<%= @setting.date? ? formatted_date(@setting) : @setting.value %>";
|
21
|
+
initialSettingValues["<%= @setting.name %>"] = "<%= @setting.date? ? formatted_date(@setting) : @setting.value %>";
|
19
22
|
}
|
23
|
+
|
24
|
+
submitButton.classList.remove("orange");
|
25
|
+
submitButton.disabled = true;
|
20
26
|
}
|
data/lib/sail/engine.rb
CHANGED
@@ -14,7 +14,6 @@ module Sail
|
|
14
14
|
|
15
15
|
config.middleware.use ActionDispatch::Flash
|
16
16
|
config.middleware.use ActionDispatch::Cookies
|
17
|
-
config.middleware.use ActionDispatch::Session::CookieStore
|
18
17
|
config.middleware.use ActionDispatch::ContentSecurityPolicy::Middleware if defined?(ActionDispatch::ContentSecurityPolicy)
|
19
18
|
config.middleware.use Rack::MethodOverride
|
20
19
|
config.middleware.use Rails::Rack::Logger
|
@@ -40,6 +39,8 @@ module Sail
|
|
40
39
|
errors = [ActiveRecord::NoDatabaseError]
|
41
40
|
errors << PG::ConnectionBad if defined?(PG)
|
42
41
|
|
42
|
+
config.middleware.use Rails.application.config.session_store || ActionDispatch::Session::CookieStore
|
43
|
+
|
43
44
|
begin
|
44
45
|
Sail::Setting.load_defaults unless Rails.env.test?
|
45
46
|
rescue *errors
|
@@ -49,9 +50,9 @@ module Sail
|
|
49
50
|
|
50
51
|
private
|
51
52
|
|
52
|
-
def to_prepare
|
53
|
+
def to_prepare(&block)
|
53
54
|
klass = defined?(ActiveSupport::Reloader) ? ActiveSupport::Reloader : ActionDispatch::Reloader
|
54
|
-
klass.to_prepare(&
|
55
|
+
klass.to_prepare(&block)
|
55
56
|
end
|
56
57
|
end
|
57
58
|
end
|
data/lib/sail/instrumenter.rb
CHANGED
@@ -15,6 +15,7 @@ module Sail
|
|
15
15
|
# statistics
|
16
16
|
def initialize
|
17
17
|
@statistics = { settings: {}, profiles: {} }.with_indifferent_access
|
18
|
+
@number_of_settings = Setting.count
|
18
19
|
end
|
19
20
|
|
20
21
|
# []
|
@@ -59,7 +60,7 @@ module Sail
|
|
59
60
|
def relative_usage_of(setting_name)
|
60
61
|
return 0.0 if @statistics[:settings].empty?
|
61
62
|
|
62
|
-
(100.0 * self[setting_name][:usages]) / @statistics[:settings].
|
63
|
+
(100.0 * self[setting_name][:usages]) / @statistics[:settings].sum { |_, entry| entry[:usages] }
|
63
64
|
end
|
64
65
|
|
65
66
|
# increment_failure_of
|
@@ -76,6 +77,10 @@ module Sail
|
|
76
77
|
Sail.reset(setting_name) if self[setting_name][:failures] > Sail.configuration.failures_until_reset
|
77
78
|
end
|
78
79
|
|
80
|
+
def relevancy_of(setting_name)
|
81
|
+
(relative_usage_of(setting_name) / @number_of_settings).round(1)
|
82
|
+
end
|
83
|
+
|
79
84
|
private
|
80
85
|
|
81
86
|
def expire_cache_fragment(setting_name)
|
data/lib/sail/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vinicius Stock
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fugit
|
@@ -212,14 +212,14 @@ dependencies:
|
|
212
212
|
requirements:
|
213
213
|
- - "~>"
|
214
214
|
- !ruby/object:Gem::Version
|
215
|
-
version: 0.
|
215
|
+
version: 0.21.0
|
216
216
|
type: :development
|
217
217
|
prerelease: false
|
218
218
|
version_requirements: !ruby/object:Gem::Requirement
|
219
219
|
requirements:
|
220
220
|
- - "~>"
|
221
221
|
- !ruby/object:Gem::Version
|
222
|
-
version: 0.
|
222
|
+
version: 0.21.0
|
223
223
|
- !ruby/object:Gem::Dependency
|
224
224
|
name: sqlite3
|
225
225
|
requirement: !ruby/object:Gem::Requirement
|
@@ -347,7 +347,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
347
347
|
- !ruby/object:Gem::Version
|
348
348
|
version: '0'
|
349
349
|
requirements: []
|
350
|
-
rubygems_version: 3.
|
350
|
+
rubygems_version: 3.2.11
|
351
351
|
signing_key:
|
352
352
|
specification_version: 4
|
353
353
|
summary: Sail is a lightweight Rails engine that brings an admin panel for managing
|