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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 68c8619a8002b5eccb52c3e514b3eaa09c6360c76fb7655305ef38d8a8bd9389
4
- data.tar.gz: 2558a2c5362f1547e269bcae07aff1b533854c8dbcead9d81e278f379a62302e
3
+ metadata.gz: e7e6e1d8f1969609b1eb958efa90c3f1afed414dbb9a754e88e9624716997eec
4
+ data.tar.gz: f42f2106b4c9f9687b267b2d9475820d390aa6a78cd20605341853ada294981b
5
5
  SHA512:
6
- metadata.gz: ab1dec602fc6943ce1994f7c080ab659e3b40568855ce480237760da4c983780a9e17b30ab2843925adcb29e85119606b59b6cd0bbb26ffdf708ba1f4c99abdd
7
- data.tar.gz: fbbf245fd6e028b9d898b4bfe662202222fbd9bc2f0818fc8b582dfb8401ad343a12c8aa86a46044b846866c8f3b76071d7282b2a52cfc77ebe69f4332df4ebb
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">Subscription ID</div>' +
491
+ '<div class="tooltip-header">' + tooltipTitle + '</div>' +
489
492
  '<div class="tooltip-content">' +
490
493
  '<span class="tooltip-id">' +
491
494
  objectId +
@@ -6,6 +6,10 @@ module Kaui
6
6
 
7
7
  def index
8
8
  @allowed_users = retrieve_allowed_users_for_current_user
9
+ @roles_by_user = {}
10
+ @allowed_users.each do |user|
11
+ @roles_by_user[user.kb_username] = roles_for_user(user)
12
+ end
9
13
  end
10
14
 
11
15
  def new
@@ -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
- <%= form_tag kaui_engine.admin_allowed_user_path(u.id), method: :delete, class: 'd-inline', onsubmit: "return confirm('Are you sure?');" do %>
64
- <%= button_tag type: 'submit', class: 'btn btn-outline-secondary d-inline-flex align-items-center gap-1 kaui-button delete-button custom-hover' do %>
65
- Delete
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
- <%= render "kaui/components/button/button", {
10
- label: 'Delete',
11
- variant: "outline-secondary d-inline-flex align-items-center gap-1",
12
- type: "button",
13
- html_class: "kaui-button delete-button custom-hover",
14
- html_options: {
15
- data: {
16
- confirm: "Are you sure?",
17
- method: "delete",
18
- turbo: false, # Optional: disable Turbo if using Rails Turbo
19
- "url": kaui_engine.admin_allowed_user_path(@allowed_user.id)
20
- },
21
- onclick: "if (confirm(this.dataset.confirm)) { Rails.ajax({ url: this.dataset.url, type: this.dataset.method }); }"
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
- // Custom validation since HTML5 validation is not working
268
- // (possibly due to jQuery autocomplete or other JavaScript interference)
269
- $('#catalog_simple form').on('submit', function(e) {
270
- var isValid = true;
271
- var pattern = /^[a-zA-Z_][\w\.-]*$/;
272
-
273
- // Validate Product Name
274
- var productName = $('#simple_plan_product_name').val().trim();
275
- var productNameField = $('#simple_plan_product_name');
276
-
277
- if (productName === '') {
278
- showError(productNameField, 'Product Name is required');
279
- isValid = false;
280
- } else if (!pattern.test(productName)) {
281
- showError(productNameField, 'Product Name must start with a letter or underscore, and can only contain letters, digits, underscores, hyphens, and periods');
282
- isValid = false;
283
- } else {
284
- clearError(productNameField);
285
- }
286
-
287
- // Validate Plan Name
288
- var planName = $('#simple_plan_plan_id').val().trim();
289
- var planNameField = $('#simple_plan_plan_id');
290
-
291
- if (planName === '') {
292
- showError(planNameField, 'Plan Name is required');
293
- isValid = false;
294
- } else if (!pattern.test(planName)) {
295
- showError(planNameField, 'Plan Name must start with a letter or underscore, and can only contain letters, digits, underscores, hyphens, and periods');
296
- isValid = false;
297
- } else {
298
- clearError(planNameField);
299
- }
300
-
301
- if (!isValid) {
302
- e.preventDefault();
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
- // Clear errors on input
313
- $('#simple_plan_product_name, #simple_plan_plan_id').on('input', function() {
314
- clearError($(this));
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;"><%= item.pretty_plan_name.blank? || !item.item_type.in?(%w{USAGE RECURRING}) ? item.description : item.pretty_plan_name %></td>
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kaui
4
- VERSION = '4.0.5'
4
+ VERSION = '4.0.6'
5
5
  end
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.5
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-17 00:00:00.000000000 Z
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