kaui 4.0.5 → 4.0.6
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/app/assets/javascripts/kaui/kaui_override.js +5 -2
- data/app/controllers/kaui/admin_allowed_users_controller.rb +4 -0
- data/app/controllers/kaui/payments_controller.rb +1 -0
- data/app/helpers/kaui/admin_allowed_users_helper.rb +14 -0
- data/app/views/kaui/admin_allowed_users/index.html.erb +7 -3
- data/app/views/kaui/admin_allowed_users/show.html.erb +17 -15
- data/app/views/kaui/admin_tenants/new_catalog.html.erb +51 -48
- data/app/views/kaui/invoices/_invoice_table.html.erb +12 -1
- data/lib/kaui/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e7e6e1d8f1969609b1eb958efa90c3f1afed414dbb9a754e88e9624716997eec
|
|
4
|
+
data.tar.gz: f42f2106b4c9f9687b267b2d9475820d390aa6a78cd20605341853ada294981b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 314ac1bb0b060b413aa68ec04183eb39f8df63b94fbe68b1c938b1e726e19733f45986278227f5101884aca3e37ec80d7e86b58348c098350138277e7529de1e
|
|
7
|
+
data.tar.gz: 45d12ccbc5d09cc0c77450e5b5dce0476be99b658078123148c6335854e9c3690e834fa7df800de0b91bd4623c96b0603e68ba8a8826a91347ec1973d74e00cb
|
|
@@ -439,7 +439,7 @@ function setObjectIdPopover(){
|
|
|
439
439
|
// Custom tooltip function for object IDs
|
|
440
440
|
// attributes:
|
|
441
441
|
// data-id = content of the tooltip, object id; required
|
|
442
|
-
// title = title of the tooltip; not required
|
|
442
|
+
// data-title = title of the tooltip; not required
|
|
443
443
|
function setObjectIdTooltip() {
|
|
444
444
|
// Remove any existing tooltips
|
|
445
445
|
$(".custom-tooltip").remove();
|
|
@@ -476,6 +476,9 @@ function showCustomTooltip(element, objectId) {
|
|
|
476
476
|
var position = $element.offset();
|
|
477
477
|
var elementHeight = $element.outerHeight();
|
|
478
478
|
var elementWidth = $element.outerWidth();
|
|
479
|
+
|
|
480
|
+
// Get custom title from data-title attribute or default to "Subscription ID"
|
|
481
|
+
var tooltipTitle = $element.data("title") || "Subscription ID";
|
|
479
482
|
|
|
480
483
|
// Create tooltip content with header and custom SVG icon
|
|
481
484
|
var svgIcon =
|
|
@@ -485,7 +488,7 @@ function showCustomTooltip(element, objectId) {
|
|
|
485
488
|
"</svg>";
|
|
486
489
|
|
|
487
490
|
var tooltipContent =
|
|
488
|
-
'<div class="tooltip-header">
|
|
491
|
+
'<div class="tooltip-header">' + tooltipTitle + '</div>' +
|
|
489
492
|
'<div class="tooltip-content">' +
|
|
490
493
|
'<span class="tooltip-id">' +
|
|
491
494
|
objectId +
|
|
@@ -24,6 +24,7 @@ module Kaui
|
|
|
24
24
|
|
|
25
25
|
if all_fields_checked
|
|
26
26
|
columns = KillBillClient::Model::PaymentAttributes.instance_variable_get('@json_attributes') - %w[transactions audit_logs]
|
|
27
|
+
columns += %w[payment_date status] # additional fields not part of the model
|
|
27
28
|
csv_headers = columns.dup
|
|
28
29
|
Kaui::Payment::REMAPPING_FIELDS.each do |k, v|
|
|
29
30
|
index = csv_headers.index(k)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Kaui
|
|
4
|
+
module AdminAllowedUsersHelper
|
|
5
|
+
# Check if a user can be deleted
|
|
6
|
+
# Returns false if the user is an admin or the current logged-in user
|
|
7
|
+
def can_delete_user?(user, user_roles)
|
|
8
|
+
is_admin = user_roles.include?('admin') || user.kb_username == Kaui.root_username
|
|
9
|
+
is_current_user = user.kb_username == current_user.kb_username
|
|
10
|
+
|
|
11
|
+
!is_admin && !is_current_user
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -60,11 +60,15 @@
|
|
|
60
60
|
<td><%= link_to u.kb_username, admin_allowed_user_path(u.id) %></td>
|
|
61
61
|
<td><%= u.description %></td>
|
|
62
62
|
<td class="text-end">
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
<% user_roles = @roles_by_user[u.kb_username] || [] %>
|
|
64
|
+
<% if can_delete_user?(u, user_roles) %>
|
|
65
|
+
<%= form_tag kaui_engine.admin_allowed_user_path(u.id), method: :delete, class: 'd-inline', onsubmit: "return confirm('Are you sure?');" do %>
|
|
66
|
+
<%= button_tag type: 'submit', class: 'btn btn-outline-secondary d-inline-flex align-items-center gap-1 kaui-button delete-button custom-hover' do %>
|
|
67
|
+
Delete
|
|
68
|
+
<% end %>
|
|
66
69
|
<% end %>
|
|
67
70
|
<% end %>
|
|
71
|
+
|
|
68
72
|
<%= link_to kaui_engine.edit_admin_allowed_user_path(u.id), class: 'text-decoration-none' do %>
|
|
69
73
|
<%= render "kaui/components/button/button", {
|
|
70
74
|
label: "Edit",
|
|
@@ -6,21 +6,23 @@
|
|
|
6
6
|
<h2>User details</h2>
|
|
7
7
|
</div>
|
|
8
8
|
<span>
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
9
|
+
<% if can_delete_user?(@allowed_user, @roles) %>
|
|
10
|
+
<%= render "kaui/components/button/button", {
|
|
11
|
+
label: 'Delete',
|
|
12
|
+
variant: "outline-secondary d-inline-flex align-items-center gap-1",
|
|
13
|
+
type: "button",
|
|
14
|
+
html_class: "kaui-button delete-button custom-hover",
|
|
15
|
+
html_options: {
|
|
16
|
+
data: {
|
|
17
|
+
confirm: "Are you sure?",
|
|
18
|
+
method: "delete",
|
|
19
|
+
turbo: false, # Optional: disable Turbo if using Rails Turbo
|
|
20
|
+
"url": kaui_engine.admin_allowed_user_path(@allowed_user.id)
|
|
21
|
+
},
|
|
22
|
+
onclick: "if (confirm(this.dataset.confirm)) { Rails.ajax({ url: this.dataset.url, type: this.dataset.method }); }"
|
|
23
|
+
}
|
|
24
|
+
} %>
|
|
25
|
+
<% end %>
|
|
24
26
|
|
|
25
27
|
<%= link_to kaui_engine.edit_admin_allowed_user_path(@allowed_user.id),
|
|
26
28
|
:class => '' do %>
|
|
@@ -264,55 +264,58 @@ $(document).ready(function() {
|
|
|
264
264
|
recompute_available_base_products_for_ao();
|
|
265
265
|
});
|
|
266
266
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
e.stopPropagation();
|
|
304
|
-
// Scroll to first error
|
|
305
|
-
$('.error-message:first').get(0)?.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
|
306
|
-
return false;
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
return true;
|
|
310
|
-
});
|
|
267
|
+
// Realtime validation function
|
|
268
|
+
function validateField(field) {
|
|
269
|
+
var pattern = /^[a-zA-Z_][\w\.-]*$/;
|
|
270
|
+
var value = field.val().trim();
|
|
271
|
+
var fieldName = field.attr('id') === 'simple_plan_product_name' ? 'Product Name' : 'Plan Name';
|
|
272
|
+
|
|
273
|
+
if (value === '') {
|
|
274
|
+
showError(field, fieldName + ' is required');
|
|
275
|
+
return false;
|
|
276
|
+
} else if (!pattern.test(value)) {
|
|
277
|
+
showError(field, fieldName + ' must start with a letter or underscore, and can only contain letters, digits, underscores, hyphens, and periods');
|
|
278
|
+
return false;
|
|
279
|
+
} else {
|
|
280
|
+
clearError(field);
|
|
281
|
+
return true;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Realtime validation on input
|
|
286
|
+
$('#simple_plan_product_name, #simple_plan_plan_id').on('input', function() {
|
|
287
|
+
validateField($(this));
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
// Validation on blur (when user leaves the field)
|
|
291
|
+
$('#simple_plan_product_name, #simple_plan_plan_id').on('blur', function() {
|
|
292
|
+
validateField($(this));
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
// Custom validation on form submit
|
|
296
|
+
$('#catalog_simple form').on('submit', function(e) {
|
|
297
|
+
var isValid = true;
|
|
298
|
+
|
|
299
|
+
// Validate Product Name
|
|
300
|
+
if (!validateField($('#simple_plan_product_name'))) {
|
|
301
|
+
isValid = false;
|
|
302
|
+
}
|
|
311
303
|
|
|
312
|
-
//
|
|
313
|
-
$('#
|
|
314
|
-
|
|
315
|
-
}
|
|
304
|
+
// Validate Plan Name
|
|
305
|
+
if (!validateField($('#simple_plan_plan_id'))) {
|
|
306
|
+
isValid = false;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
if (!isValid) {
|
|
310
|
+
e.preventDefault();
|
|
311
|
+
e.stopPropagation();
|
|
312
|
+
// Scroll to first error
|
|
313
|
+
$('.error-message:first').get(0)?.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
|
314
|
+
return false;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
return true;
|
|
318
|
+
});
|
|
316
319
|
});
|
|
317
320
|
|
|
318
321
|
function showError(field, message) {
|
|
@@ -91,7 +91,11 @@
|
|
|
91
91
|
|
|
92
92
|
</td>
|
|
93
93
|
<% end %>
|
|
94
|
-
<td onClick="hightlightLinkedItems('<%= item.invoice_item_id %>', '<%= item.linked_invoice_item_id %>'); return false;"
|
|
94
|
+
<td onClick="hightlightLinkedItems('<%= item.invoice_item_id %>', '<%= item.linked_invoice_item_id %>'); return false;">
|
|
95
|
+
<span id="<%= item.invoice_item_id %>-popover" class="object-id-popover" data-id="<%= item.invoice_item_id %>" data-title="Invoice Item ID">
|
|
96
|
+
<%= item.pretty_plan_name.blank? || !item.item_type.in?(%w{USAGE RECURRING}) ? item.description : item.pretty_plan_name %>
|
|
97
|
+
</span>
|
|
98
|
+
</td>
|
|
95
99
|
<td onClick="hightlightLinkedItems('<%= item.invoice_item_id %>', '<%= item.linked_invoice_item_id %>'); return false;"><%= item.start_date.html_safe if item.start_date %></td>
|
|
96
100
|
<td onClick="hightlightLinkedItems('<%= item.invoice_item_id %>', '<%= item.linked_invoice_item_id %>'); return false;"><%= item.end_date.html_safe if item.end_date %></td>
|
|
97
101
|
<td onClick="hightlightLinkedItems('<%= item.invoice_item_id %>', '<%= item.linked_invoice_item_id %>'); return false;"><%= item.subscription_id %></td>
|
|
@@ -149,4 +153,11 @@
|
|
|
149
153
|
}
|
|
150
154
|
});
|
|
151
155
|
}
|
|
156
|
+
|
|
157
|
+
$(document).ready(function() {
|
|
158
|
+
// Initialize tooltips for invoice item IDs
|
|
159
|
+
if (typeof setObjectIdTooltip === 'function') {
|
|
160
|
+
setObjectIdTooltip();
|
|
161
|
+
}
|
|
162
|
+
});
|
|
152
163
|
</script>
|
data/lib/kaui/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: kaui
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 4.0.
|
|
4
|
+
version: 4.0.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Kill Bill core team
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2025-12-
|
|
11
|
+
date: 2025-12-24 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: actionpack
|
|
@@ -454,6 +454,7 @@ files:
|
|
|
454
454
|
- app/controllers/kaui/tenants_controller.rb
|
|
455
455
|
- app/controllers/kaui/transactions_controller.rb
|
|
456
456
|
- app/helpers/kaui/account_helper.rb
|
|
457
|
+
- app/helpers/kaui/admin_allowed_users_helper.rb
|
|
457
458
|
- app/helpers/kaui/application_helper.rb
|
|
458
459
|
- app/helpers/kaui/date_helper.rb
|
|
459
460
|
- app/helpers/kaui/exception_helper.rb
|