kaui 4.0.3 → 4.0.5

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: e7cbe8cab6b7967577eb779077021684be2ca3dce7e68bc12fa8c8cbfc14fcf4
4
- data.tar.gz: e30c6f225929c287c251874fc22fd66cf25e71177efcc251a5c2842671b87024
3
+ metadata.gz: 68c8619a8002b5eccb52c3e514b3eaa09c6360c76fb7655305ef38d8a8bd9389
4
+ data.tar.gz: 2558a2c5362f1547e269bcae07aff1b533854c8dbcead9d81e278f379a62302e
5
5
  SHA512:
6
- metadata.gz: dc2a8a66d733b76cab4e92be0b9351e6d4f36831463ed4f8e4e6e83cbfd0a3d0c888cbc5978ee9811713ea36bd9a57f4a063eda25141cdeec0383fd2734d1659
7
- data.tar.gz: ddad13b0ee0fe86eafd53b705a1b220acff07215826ee3483d6ddc7b164a0e3a7b7c8308edc7df55f8455b7337bbff884ad559f8f52078fdce086b375e77bbd0
6
+ metadata.gz: ab1dec602fc6943ce1994f7c080ab659e3b40568855ce480237760da4c983780a9e17b30ab2843925adcb29e85119606b59b6cd0bbb26ffdf708ba1f4c99abdd
7
+ data.tar.gz: fbbf245fd6e028b9d898b4bfe662202222fbd9bc2f0818fc8b582dfb8401ad343a12c8aa86a46044b846866c8f3b76071d7282b2a52cfc77ebe69f4332df4ebb
@@ -556,7 +556,7 @@ function showCustomTooltip(element, objectId) {
556
556
  // Set 5-second auto-hide timer
557
557
  window.tooltipAutoHideTimeout = setTimeout(function () {
558
558
  hideCustomTooltip();
559
- }, 5000); // 5 seconds
559
+ }, 3000); // 3 seconds
560
560
  }
561
561
 
562
562
  function showObjectIdTooltip(element, objectId) {
@@ -72,7 +72,7 @@ module Kaui
72
72
  @selected_bundle = params.key?(:external_key) ? @bundle_names[params[:external_key]] : nil
73
73
 
74
74
  csv_string = CSV.generate(headers: true) do |csv|
75
- csv << ['Effective Date', 'Bundles', 'Even Type', 'Details', 'Reason Code/ Comments']
75
+ csv << ['Effective Date', 'Bundles', 'Event Type', 'Details', 'Reason Code/ Comments']
76
76
  if %w[INVOICE ALL].include?(event_type)
77
77
  @invoices.each do |invoice_stub|
78
78
  invoice = invoice_stub.invoice_id.present? && @invoices_by_id.key?(invoice_stub.invoice_id) ? @invoices_by_id[invoice_stub.invoice_id] : invoice_stub
@@ -97,7 +97,7 @@ module Kaui
97
97
  end
98
98
 
99
99
  payment.transactions.each do |transaction|
100
- effective_date = transaction.effective_date.present? ? transaction.effective_date : '[unknown]'
100
+ effective_date = transaction.effective_date.present? ? Date.parse(transaction.effective_date).to_s : '[unknown]'
101
101
  bundle_keys = @bundle_keys_by_invoice_id[payment.target_invoice_id].present? ? @bundle_keys_by_invoice_id[payment.target_invoice_id].map { |bundle_key| @bundle_names[bundle_key] }.join(', ') : ''
102
102
  transaction_type = transaction.transaction_type
103
103
  details = []
@@ -120,7 +120,7 @@ module Kaui
120
120
  # Skip SERVICE_STATE_CHANGE events
121
121
  next if event.event_type == 'SERVICE_STATE_CHANGE'
122
122
 
123
- effective_date = event.effective_date.present? ? event.effective_date : '[unknown]'
123
+ effective_date = event.effective_date.present? ? Date.parse(event.effective_date).to_s : '[unknown]'
124
124
  bundle_keys = @bundle_names[bundle.external_key]
125
125
  event_type = event.event_type
126
126
  phase = event.phase
@@ -14,7 +14,7 @@ module Kaui
14
14
  @max_records = {}
15
15
  %w[account payment invoice].each do |type|
16
16
  model = "Kaui::#{type.capitalize}".constantize
17
- @max_records[type.to_sym] = model.list_or_search(nil, 0, 0, options_for_klient).pagination_max_nb_records || 0
17
+ @max_records[type.to_sym] = model.list_or_search(nil, 0, 0, options_for_klient).pagination_max_nb_records
18
18
  end
19
19
  end
20
20
 
@@ -36,6 +36,15 @@ module Kaui
36
36
  Kaui::Invoice.list_or_search(query_string, 0, MAXIMUM_NUMBER_OF_RECORDS_DOWNLOAD, options_for_klient.merge(params: kb_params))
37
37
  end
38
38
 
39
+ if start_date && end_date
40
+ invoices = invoices.select do |invoice|
41
+ start_date_parsed = Date.parse(start_date)
42
+ end_date_parsed = Date.parse(end_date)
43
+ invoice_date = Date.parse(invoice.invoice_date)
44
+ invoice_date.between?(start_date_parsed, end_date_parsed)
45
+ end
46
+ end
47
+
39
48
  csv_string = CSV.generate(headers: true) do |csv|
40
49
  csv << columns
41
50
 
@@ -44,7 +44,7 @@ module Kaui
44
44
  account = account_id.present? ? Kaui::Account.find_by_id_or_key(account_id, false, false, options_for_klient) : nil
45
45
 
46
46
  payments = if account_id.present? && query_string.blank?
47
- Kaui::Account.paginated_payments(account_id, nil, nil, 'NONE', options_for_klient).map! { |payment| Kaui::Payment.build_from_raw_invoice(payment) }
47
+ Kaui::Payment.list_or_search(account_id, 0, MAXIMUM_NUMBER_OF_RECORDS_DOWNLOAD, options_for_klient.merge(params: kb_params))
48
48
  else
49
49
  Kaui::Payment.list_or_search(query_string, 0, MAXIMUM_NUMBER_OF_RECORDS_DOWNLOAD, options_for_klient.merge(params: kb_params))
50
50
  end
@@ -24,10 +24,12 @@ module Kaui
24
24
  '/kenui'
25
25
  when /payment-test/
26
26
  '/payment_test'
27
+ when /aviate/
28
+ '/aviate'
27
29
  else
28
30
  "/#{plugin_key}"
29
31
  end
30
- plugin_path = nil unless CONFIGABLE_PLUGINS.include?(plugin_key)
32
+ plugin_path = nil unless CONFIGABLE_PLUGINS.map { |key| plugin_key.include?(key) }.any?
31
33
  plugins << { name: plugin_name, path: plugin_path } if plugin_path
32
34
  end
33
35
  plugins
@@ -43,7 +43,7 @@
43
43
  <path d="M2.5 8.3335H17.5" stroke="#A4A7AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
44
44
  </svg>
45
45
  </label>
46
- <input type="text" class="form-control center-input" id="startDate" placeholder="All Accounts" name="startDate">
46
+ <input type="text" class="form-control center-input" id="startDate" placeholder="All Account Timelines" name="startDate">
47
47
  <div id="dash" class="dash">–</div>
48
48
  <input type="text" class="form-control right-input" id="endDate" placeholder="" name="endDate">
49
49
  <div id="toggle-wrapper" class="position-absolute" style="width: 100%; height: 100%;" onclick="document.getElementById('single-toggle').click()"></div>
@@ -67,7 +67,7 @@
67
67
  <div class="fake-select-dropdown">
68
68
  <label class="fake-select-option">
69
69
  <input type="radio" name="download_option" id="allData" />
70
- <span>All accounts</span>
70
+ <span>All account data</span>
71
71
  </label>
72
72
 
73
73
  <label class="fake-select-option">
@@ -117,12 +117,10 @@
117
117
  <% end %>
118
118
  </div>
119
119
 
120
- <% if can? :trigger, Kaui::Invoice %>
121
- <div class="info-item">
122
- <b>Next invoice date</b>
123
- <p id='next-invoice-date'>N/A</p>
124
- </div>
125
- <% end %>
120
+ <div class="info-item">
121
+ <b>Next invoice date</b>
122
+ <p id='next-invoice-date'>N/A</p>
123
+ </div>
126
124
  </div>
127
125
 
128
126
  <!-- Right Column -->
@@ -60,23 +60,12 @@
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
- <%= render "kaui/components/button/button", {
66
- label: 'Delete',
67
- variant: "outline-secondary d-inline-flex align-items-center gap-1",
68
- type: "button",
69
- html_class: "kaui-button delete-button custom-hover",
70
- html_options: {
71
- data: {
72
- confirm: "Are you sure?",
73
- method: "delete",
74
- turbo: false,
75
- "url": kaui_engine.admin_allowed_user_path(u.id)
76
- }
77
- }
78
- } %>
79
- <%= link_to kaui_engine.edit_admin_allowed_user_path(u.id), :class => '' do %>
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
66
+ <% end %>
67
+ <% end %>
68
+ <%= link_to kaui_engine.edit_admin_allowed_user_path(u.id), class: 'text-decoration-none' do %>
80
69
  <%= render "kaui/components/button/button", {
81
70
  label: "Edit",
82
71
  variant: "outline-secondary d-inline-flex align-items-center gap-1",
@@ -154,6 +143,8 @@
154
143
  $header.find('.sort-' + direction).addClass('active');
155
144
  }
156
145
 
146
+ } catch (e) {
147
+ console.error('Error initializing DataTable:', e);
157
148
  }
158
149
  }, 100);
159
150
  });
@@ -15,6 +15,7 @@
15
15
  <%= form_tag admin_tenant_set_clock_path(@tenant.id), method: :put, class: 'form-horizontal' do %>
16
16
  <div class="trigger-invoice-box form-group">
17
17
  <b>Set new date</b>
18
+ <p id="clock_warning" class="text-danger mb-2" style="display: none;"><%= t('admin_tenants.clock_warning') %></p>
18
19
  <div class="d-flex align-items-center">
19
20
  <div class="custom-date-input-wrapper kaui-button custom-hover">
20
21
  <svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
@@ -25,9 +26,11 @@
25
26
  </svg>
26
27
 
27
28
  <input class="form-control" name="new_date" type="text"
29
+ id="clock_datepicker"
28
30
  data-provide="datepicker"
29
31
  data-date-format="yyyy-mm-dd"
30
- data-date-today-highlight="true"
32
+ data-date-today-highlight="true"
33
+ data-date-autoclose="true"
31
34
  value="<%= @clock&.[]('localDate') || '' %>">
32
35
  </div>
33
36
 
@@ -56,17 +59,21 @@
56
59
 
57
60
  <%= javascript_tag do %>
58
61
  $(document).ready(function() {
59
- scheduleRefresh();
60
- });
61
-
62
- function scheduleRefresh() {
63
- setTimeout(refreshClock, 1000);
64
- }
62
+ var clockElement = $('#kb_clock');
63
+ var initialTime = clockElement.text();
64
+
65
+ // Parse the initial time
66
+ var currentTime = new Date(initialTime);
67
+
68
+ // Update clock every second
69
+ setInterval(function() {
70
+ currentTime.setSeconds(currentTime.getSeconds() + 1);
71
+ clockElement.text(currentTime.toISOString());
72
+ }, 1000);
65
73
 
66
- function refreshClock() {
67
- $.ajax({url: "<%= admin_tenant_path(@tenant.id, :format => :js) %>"});
68
- }
74
+ // Show warning when date is selected
75
+ $('#clock_datepicker').on('changeDate', function() {
76
+ $('#clock_warning').show();
77
+ });
78
+ });
69
79
  <% end %>
70
-
71
-
72
-
@@ -246,6 +246,8 @@ function switch_basic_config() {
246
246
  $(document).ready(function() {
247
247
  switch_basic_config();
248
248
 
249
+ // jQuery UI autocomplete interferes with HTML5 validation
250
+ // So we keep the custom JS validation
249
251
  $('#simple_plan_product_name').autocomplete({
250
252
  source: function(query, process) {
251
253
  process(known_products());
@@ -261,8 +263,72 @@ $(document).ready(function() {
261
263
  $('#simple_plan_product_name').on('mouseleave', function() {
262
264
  recompute_available_base_products_for_ao();
263
265
  });
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
+ });
311
+
312
+ // Clear errors on input
313
+ $('#simple_plan_product_name, #simple_plan_plan_id').on('input', function() {
314
+ clearError($(this));
315
+ });
264
316
  });
265
317
 
318
+ function showError(field, message) {
319
+ clearError(field);
320
+ field.addClass('error-field');
321
+ field.css('border-color', '#dc3545');
322
+ var errorDiv = $('<div class="error-message" style="color: #dc3545; font-size: 0.875rem; margin-top: 0.25rem;"></div>').text(message);
323
+ field.parent().append(errorDiv);
324
+ }
325
+
326
+ function clearError(field) {
327
+ field.removeClass('error-field');
328
+ field.css('border-color', '');
329
+ field.parent().find('.error-message').remove();
330
+ }
331
+
266
332
  document.querySelectorAll('.toggle-option').forEach(el => {
267
333
  el.addEventListener('click', () => {
268
334
  document.querySelectorAll('.toggle-option').forEach(opt => opt.classList.remove('active-btn'));
@@ -11,15 +11,11 @@
11
11
 
12
12
  <div class="w-100">
13
13
  <div class="row gap-4 m-0 gap-container pb-2">
14
- <%
15
- =begin%>
16
- <div class="p-4 card w-100 col">
14
+ <div class="p-4 card col">
17
15
  <%= render :partial => 'clock' %>
18
- </div>
19
- <%
20
- =end%>
16
+ </div>
21
17
 
22
- <div class="p-4 card w-100 col">
18
+ <div class="p-4 card col">
23
19
  <%= render :partial => 'useful_links' %>
24
20
  </div>
25
21
  </div>
@@ -43,7 +43,7 @@
43
43
  <path d="M2.5 8.3335H17.5" stroke="#A4A7AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
44
44
  </svg>
45
45
  </label>
46
- <input type="text" class="form-control center-input" id="startDate" placeholder="All Accounts" name="startDate">
46
+ <input type="text" class="form-control center-input" id="startDate" placeholder="All Logs" name="startDate">
47
47
  <div id="dash" class="dash">–</div>
48
48
  <input type="text" class="form-control right-input" id="endDate" placeholder="" name="endDate">
49
49
  <div id="toggle-wrapper" class="position-absolute" style="width: 100%; height: 100%;" onclick="document.getElementById('single-toggle').click()"></div>
@@ -67,7 +67,7 @@
67
67
  <div class="fake-select-dropdown">
68
68
  <label class="fake-select-option">
69
69
  <input type="radio" name="download_option" id="allData" />
70
- <span>All accounts</span>
70
+ <span>All logs</span>
71
71
  </label>
72
72
 
73
73
  <label class="fake-select-option">
@@ -1,3 +1,4 @@
1
+ <% count_text = count.nil? ? "20k+" : count.to_i %>
1
2
  <div class="col-md-4">
2
3
  <div class="dashboard-card border rounded-4 d-flex flex-column justify-content-between h-100">
3
4
  <div class="d-flex px-4 py-3 align-items-center gap-3">
@@ -6,7 +7,7 @@
6
7
  </div>
7
8
  <div>
8
9
  <h6 class="mb-0 fw-600 text-black-900"><%= title %></h6>
9
- <p class="text-muted fw-normal text-tertiary small mb-0"><%= count %></p>
10
+ <p class="text-muted fw-normal text-tertiary small mb-0"><%= count_text %></p>
10
11
  </div>
11
12
  </div>
12
13
  <div class="w-full dashboard-card-divider"></div>
@@ -91,7 +91,7 @@
91
91
  <path d="M2.5 8.3335H17.5" stroke="#A4A7AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
92
92
  </svg>
93
93
  </label>
94
- <input type="text" class="form-control center-input" id="startDate" placeholder="All Accounts" name="startDate">
94
+ <input type="text" class="form-control center-input" id="startDate" placeholder="All Invoices" name="startDate">
95
95
  <div id="dash" class="dash">–</div>
96
96
  <input type="text" class="form-control right-input" id="endDate" placeholder="" name="endDate">
97
97
  <div id="toggle-wrapper" class="position-absolute" style="width: 100%; height: 100%;" onclick="document.getElementById('single-toggle').click()"></div>
@@ -115,7 +115,7 @@
115
115
  <div class="fake-select-dropdown">
116
116
  <label class="fake-select-option">
117
117
  <input type="radio" name="download_option" id="allData" />
118
- <span>All accounts</span>
118
+ <span>All invoices</span>
119
119
  </label>
120
120
 
121
121
  <label class="fake-select-option">
@@ -90,7 +90,7 @@
90
90
  <path d="M2.5 8.3335H17.5" stroke="#A4A7AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
91
91
  </svg>
92
92
  </label>
93
- <input type="text" class="form-control center-input" id="startDate" placeholder="All Accounts" name="startDate">
93
+ <input type="text" class="form-control center-input" id="startDate" placeholder="All Payments" name="startDate">
94
94
  <div id="dash" class="dash">–</div>
95
95
  <input type="text" class="form-control right-input" id="endDate" placeholder="" name="endDate">
96
96
  <div id="toggle-wrapper" class="position-absolute" style="width: 100%; height: 100%;" onclick="document.getElementById('single-toggle').click()"></div>
@@ -114,7 +114,7 @@
114
114
  <div class="fake-select-dropdown">
115
115
  <label class="fake-select-option">
116
116
  <input type="radio" name="download_option" id="allData" />
117
- <span>All accounts</span>
117
+ <span>All payments</span>
118
118
  </label>
119
119
 
120
120
  <label class="fake-select-option">
@@ -81,3 +81,6 @@ en:
81
81
  billing_period: "Billing Period"
82
82
  trial: "Trial"
83
83
  final_phase_duration: "Final Phase Duration"
84
+
85
+ admin_tenants:
86
+ clock_warning: "This action will affect all tenants across the system. Proceed with caution."
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.3'
4
+ VERSION = '4.0.5'
5
5
  end
data/lib/kaui.rb CHANGED
@@ -82,7 +82,7 @@ module Kaui
82
82
  when 'account_id'
83
83
  view_context.link_to(account.account_id, view_context.url_for(action: :show, account_id: account.account_id))
84
84
  when 'parent_account_id'
85
- account.parent_account_id.nil? ? nil : view_context.link_to(account.account_id, view_context.url_for(action: :show, account_id: account.parent_account_id))
85
+ account.parent_account_id.nil? ? nil : view_context.link_to(account.parent_account_id, view_context.url_for(action: :show, account_id: account.parent_account_id))
86
86
  when 'account_balance'
87
87
  view_context.humanized_money_with_symbol(account.balance_to_money)
88
88
  else
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.3
4
+ version: 4.0.5
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-02 00:00:00.000000000 Z
11
+ date: 2025-12-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack
@@ -540,8 +540,6 @@ files:
540
540
  - app/views/kaui/accounts/index.html.erb
541
541
  - app/views/kaui/accounts/new.html.erb
542
542
  - app/views/kaui/accounts/show.html.erb
543
- - app/views/kaui/admin/index.html.erb
544
- - app/views/kaui/admin/index.js.erb
545
543
  - app/views/kaui/admin_allowed_users/_form.html.erb
546
544
  - app/views/kaui/admin_allowed_users/edit.html.erb
547
545
  - app/views/kaui/admin_allowed_users/index.html.erb
@@ -1,64 +0,0 @@
1
- <div class="kaui-container ">
2
- <div class="clock-container">
3
- <div class="d-flex flex-column">
4
- <div class="clock-header mb-3">
5
- <div class="d-flex align-items-start flex-column">
6
- <h2>Clock</h2>
7
- <p>Current date/time: <span id="kb_clock"><%= @clock['currentUtcTime'] %></span></p>
8
- </div>
9
- <span>
10
- </span>
11
- </div>
12
- <div>
13
- <%= form_tag kaui_engine.admin_set_clock_path(params.to_h), :method => :put, :class => 'form-horizontal' do %>
14
-
15
- <div class="trigger-invoice-box form-group">
16
- <b>Set new date</b>
17
- <div class="d-flex align-items-center">
18
- <div class="custom-date-input-wrapper kaui-button custom-hover">
19
- <svg width="21" height="20" viewBox="0 0 21 20" fill="none" xmlns="http://www.w3.org/2000/svg">
20
- <path d="M14.9167 12.5V18.3333M17.8333 15.4167H12" stroke="#A4A7AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
21
- <path d="M14.0833 1.66675V5.00008M6.58325 1.66675V5.00008" stroke="#A4A7AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
22
- <path d="M17.8333 10.8333V4.99992C17.8333 4.07944 17.0871 3.33325 16.1666 3.33325H4.49992C3.57944 3.33325 2.83325 4.07944 2.83325 4.99992V16.6666C2.83325 17.5871 3.57944 18.3333 4.49992 18.3333H10.3333" stroke="#A4A7AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
23
- <path d="M2.83325 8.33325H17.8333" stroke="#A4A7AE" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
24
- </svg>
25
- <input class="form-control" name="new_date" type="text" data-provide="datepicker" data-date-format="yyyy-mm-dd" data-date-today-highlight="true" value="<%= @clock['localDate'] %>">
26
- </div>
27
-
28
- <%= render "kaui/components/button/button", {
29
- label: "Submit",
30
- variant: "outline-secondary d-inline-flex align-items-center gap-1",
31
- type: "submit",
32
- html_class: "btn btn-xs kaui-dropdown custom-hover py-2 px-3",
33
- html_options: { name: "commit", value: "Submit" }
34
- } %>
35
- </div>
36
-
37
- <%= button_tag type: 'submit', name: 'commit', value: 'Reset', class: 'kaui-button dots-menu custom-hover' do %>
38
- <%= image_tag('kaui/setting/reset.svg', alt: 'Reset Icon', class: 'me-2', size: '16x16') %>
39
- Reset
40
- <% end %>
41
-
42
- </div>
43
- <% end %>
44
- </div>
45
- </div>
46
- </div>
47
- </div>
48
-
49
- <%= javascript_tag do %>
50
- $(document).ready(function() {
51
- scheduleRefresh();
52
- });
53
-
54
- function scheduleRefresh() {
55
- setTimeout(refreshClock, 1000);
56
- }
57
-
58
- function refreshClock() {
59
- $.ajax({url: "<%= admin_path(:format => :js) %>"});
60
- }
61
- <% end %>
62
-
63
-
64
-
@@ -1,3 +0,0 @@
1
- $('#kb_clock').html("<%= @clock['currentUtcTime'] %>");
2
-
3
- scheduleRefresh();