kaui 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/kaui/kaui.js +118 -11
  3. data/app/assets/stylesheets/kaui/common.less +91 -6
  4. data/app/assets/stylesheets/kaui/payment.less +1 -0
  5. data/app/controllers/kaui/account_children_controller.rb +1 -4
  6. data/app/controllers/kaui/accounts_controller.rb +4 -7
  7. data/app/controllers/kaui/admin_allowed_users_controller.rb +24 -7
  8. data/app/controllers/kaui/admin_tenants_controller.rb +59 -20
  9. data/app/controllers/kaui/audit_logs_controller.rb +3 -2
  10. data/app/controllers/kaui/charges_controller.rb +1 -1
  11. data/app/controllers/kaui/credits_controller.rb +1 -1
  12. data/app/controllers/kaui/home_controller.rb +273 -10
  13. data/app/controllers/kaui/invoice_items_controller.rb +1 -1
  14. data/app/controllers/kaui/invoices_controller.rb +3 -3
  15. data/app/controllers/kaui/payments_controller.rb +5 -3
  16. data/app/controllers/kaui/refunds_controller.rb +2 -2
  17. data/app/controllers/kaui/subscriptions_controller.rb +2 -1
  18. data/app/helpers/kaui/object_helper.rb +4 -0
  19. data/app/helpers/kaui/plugin_helper.rb +36 -20
  20. data/app/helpers/kaui/uuid_helper.rb +9 -0
  21. data/app/models/kaui/admin.rb +3 -1
  22. data/app/models/kaui/admin_tenant.rb +58 -10
  23. data/app/models/kaui/allowed_user.rb +1 -0
  24. data/app/models/kaui/catalog.rb +2 -2
  25. data/app/models/kaui/credit.rb +0 -2
  26. data/app/models/kaui/overdue.rb +5 -5
  27. data/app/views/kaui/account_children/index.html.erb +3 -3
  28. data/app/views/kaui/accounts/_account_info.html.erb +45 -91
  29. data/app/views/kaui/accounts/_billing_info.html.erb +12 -8
  30. data/app/views/kaui/accounts/_parent.html.erb +1 -1
  31. data/app/views/kaui/accounts/_payment_methods.html.erb +1 -1
  32. data/app/views/kaui/accounts/_personal_info.html.erb +74 -0
  33. data/app/views/kaui/accounts/index.html.erb +4 -4
  34. data/app/views/kaui/accounts/show.html.erb +9 -3
  35. data/app/views/kaui/admin_allowed_users/_form.html.erb +38 -10
  36. data/app/views/kaui/admin_tenants/_form_plugin_config.erb +82 -17
  37. data/app/views/kaui/admin_tenants/_show_catalog_simple.erb +11 -3
  38. data/app/views/kaui/admin_tenants/_show_overdue.erb +4 -4
  39. data/app/views/kaui/admin_tenants/_tenant_details.html.erb +7 -1
  40. data/app/views/kaui/admin_tenants/new_overdue_config.html.erb +1 -1
  41. data/app/views/kaui/audit_logs/_show_history_modal.html.erb +1 -1
  42. data/app/views/kaui/audit_logs/index.html.erb +4 -0
  43. data/app/views/kaui/home/_advanced_search_modal.html.erb +80 -0
  44. data/app/views/kaui/home/index.html.erb +18 -5
  45. data/app/views/kaui/invoices/show.html.erb +7 -1
  46. data/app/views/kaui/layouts/kaui_flash.html.erb +14 -3
  47. data/app/views/kaui/layouts/kaui_navbar.html.erb +11 -9
  48. data/app/views/kaui/payments/_form.html.erb +8 -10
  49. data/app/views/kaui/payments/_payment_table.html.erb +40 -37
  50. data/app/views/kaui/payments/index.html.erb +1 -0
  51. data/app/views/kaui/payments/show.html.erb +5 -7
  52. data/app/views/kaui/queues/index.html.erb +22 -4
  53. data/app/views/kaui/subscriptions/_subscriptions_table.html.erb +1 -1
  54. data/app/views/kaui/tag_definitions/index.html.erb +1 -1
  55. data/config/routes.rb +2 -0
  56. data/lib/kaui/version.rb +1 -1
  57. data/test/functional/kaui/accounts_controller_test.rb +35 -0
  58. data/test/functional/kaui/admin_allowed_users_controller_test.rb +55 -2
  59. data/test/functional/kaui/admin_tenants_controller_test.rb +67 -6
  60. data/test/functional/kaui/home_controller_test.rb +389 -15
  61. data/test/functional/kaui/subscriptions_controller_test.rb +1 -1
  62. data/test/killbill_test_helper.rb +2 -2
  63. data/test/unit/helpers/kaui/uuid_helper_test.rb +16 -0
  64. data/test/unit/kaui/admin_tenant_test.rb +49 -0
  65. metadata +6 -4
  66. data/test/unit/kaui/uuid_helper_test.rb +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e87e62224a7eee3e9ee134db6f88824cbe6efdbf
4
- data.tar.gz: 1f762a4df672efbaee3182d0eca916405cf057cc
3
+ metadata.gz: '0651238ca5895ad6646d03a02d6aea566789aecf'
4
+ data.tar.gz: 5f69d3a6033391e3fe1ee08e6a195a44475c33db
5
5
  SHA512:
6
- metadata.gz: 38bdfc7f29ad2711fec6a566ac962cbb2d0ecdadf60754522a0c786f4446433c71191dbabb40f9a80f8220da7c07da694e9f10077f2d6248030c1ab70d08b4d6
7
- data.tar.gz: d5fbd8de69aeeef43f4690e3ad84dff02c89dbe7215bb95b87dbd451915f88f5bf73a4a25499b186376b089b0afad5fc1c80e738fc89e24610102ecb47d61199
6
+ metadata.gz: eb800c76bba3c7073b21418059ec15614e3e6ba65c33e61101630d4a8ffaebf289dfe92296fcfbe72dbd87a66cef1fa2442302eaa405402024afbc9b27abd5c9
7
+ data.tar.gz: 89cbb200e3eabc97fe3c4475603a1906d83ab0c19baad61926b696a77cf58e7b3e83061fa39edb372bf9205e78caf312232fa72f376d695b636130634e6c3e48
@@ -198,43 +198,72 @@ jQuery(document).ready(function ($) {
198
198
  if (jqxhr.status == 0) {
199
199
  return;
200
200
  }
201
-
202
- var message = 'Request Status: ' + jqxhr.status + ' Status Text: ' + jqxhr.statusText + ' ' + jqxhr.responseText;
201
+
202
+ var message = 'Request Status: ' + jqxhr.status + ', Status Text: ' + jqxhr.statusText + ': ' + getMessageFromResponse(jqxhr);
203
203
 
204
204
  if (jqxhr.status == 200) {
205
205
  message = thrownError.message == undefined ? thrownError : thrownError.message;
206
206
  }
207
- ajaxAlert(message);
207
+ ajaxErrorAlert(message);
208
208
  });
209
209
 
210
+ function getMessageFromResponse(jqxhr) {
211
+ if (isBlank(jqxhr.responseJSON)) {
212
+ return jqxhr.responseText;
213
+ }
214
+
215
+ if (!isBlank(jqxhr.responseJSON.error)) {
216
+ return jqxhr.responseJSON.error;
217
+ }
218
+
219
+ return jqxhr.responseText;
220
+ }
221
+
210
222
  // this will prevent DataTable to show an alert message box when an error occurs
211
223
  $.fn.dataTable.ext.errMode = 'none';
212
224
  // this will try to register a DataTable error event to all tables, and if an error occurs will display the error on screen
213
225
  $( document ).find(".table").on('error.dt', function ( e, settings, techNote, message ) {
214
- ajaxAlert('An error has been reported by DataTables: ' + message);
215
- })
226
+ ajaxErrorAlert('An error has been reported by DataTables: ' + message);
227
+ });
216
228
 
229
+ setObjectIdPopover();
217
230
  });
218
231
 
219
- // global function used to show a error message that occurs on a Ajax call
220
- function ajaxAlert(message) {
232
+
233
+ // global function used to show an error message that occurs on a Ajax call, if timeout is passed the box will disappear when the time is up.
234
+ function ajaxErrorAlert(message, timeout) {
235
+ ajaxAlert("ajaxErrorAlert", message, timeout);
236
+ }
237
+
238
+ // global function used to show an information message.
239
+ function ajaxInfoAlert(message, timeout) {
240
+ ajaxAlert("ajaxInfoAlert", message, timeout);
241
+ }
242
+
243
+ // if timeout is passed the box will disappear when the time is up.
244
+ function ajaxAlert(alert_element_id, message, timeout) {
221
245
  // do not show ajax alert if there is already an server alert
222
246
  var serverAlertStatus = $(".server-alert").css("display");
223
247
  if (serverAlertStatus != undefined && serverAlertStatus != "none") {
224
248
  return;
225
249
  }
226
250
 
227
- var messageBox = $("#ajaxAlert");
228
- messageBox.find("#ajaxErrorMessage").text(message);
251
+ var messageBox = $("#" + alert_element_id);
252
+ messageBox.find("#" + alert_element_id + "Message").text(message);
229
253
  messageBox.show();
230
254
  messageBox.find("button").click(function(){
231
255
  ajaxCloseAlert(messageBox);
232
256
  });
257
+
258
+ //if timeout is passed the box will disappear when the time is up
259
+ if (!isBlank(timeout)) {
260
+ setTimeout(function(){ ajaxCloseAlert()}, timeout);
261
+ }
233
262
  }
234
263
 
235
264
  function ajaxCloseAlert(messageBox) {
236
- var messageBox = messageBox || $("#ajaxAlert");
237
- messageBox.find("#ajaxErrorMessage").text('');
265
+ var messageBox = messageBox || $(".ajaxAlert");
266
+ messageBox.find(".ajaxAlertMessage").text('');
238
267
  messageBox.hide();
239
268
  }
240
269
 
@@ -261,3 +290,81 @@ function isBlank(value) {
261
290
  return false;
262
291
  }
263
292
  }
293
+
294
+ // this function set popover for all tags that have class object-id-popover
295
+ // attributes:
296
+ // data-id = content of the popover,object id; required
297
+ // title = title of the popover; not required
298
+ // id = (must be {{id}}-popover) used to close popover when the copy image is clicked; if present; if not present a timeout of 5s will apply; not required
299
+ function setObjectIdPopover(){
300
+ $(".object-id-popover").each(function(idx, e){
301
+ $(this).popover('destroy');
302
+ $(this).off("shown.bs.popover");
303
+ $(this).data("index", idx);
304
+
305
+ $(this).popover({
306
+ html: true,
307
+ content: function() {
308
+ var template = '<div class="{{id}}-content" >' +
309
+ '{{id}}&emsp;<i id="{{id}}-copy" class="fa fa-clipboard copy-icon" aria-hidden="true"></i> ' +
310
+ '<input id="{{id}}-placeholder" class="form-control hidden"> ' +
311
+ '</div>';
312
+
313
+ var popover_html = Mustache.render( template , { id: $(this).data("id") });
314
+ return popover_html;
315
+ },
316
+ container: 'body',
317
+ trigger: 'hover',
318
+ delay: { "show": 100, "hide": 4000 }
319
+ });
320
+
321
+ $(this).on("show.bs.popover", function(e) {
322
+ var currentPopoverIndex = $(this).data('index');
323
+ $(".object-id-popover").each(function(idx, e){
324
+ var index = $(this).data('index');
325
+
326
+ if (currentPopoverIndex != index) {
327
+ $(this).popover('hide');
328
+ }
329
+ });
330
+ });
331
+
332
+ $(this).on("shown.bs.popover", function(e) {
333
+ var objectId = $(this).data('id');
334
+ var copyIdImg = $("#" + objectId + "-copy");
335
+
336
+ copyIdImg.data("popover",$(this).attr("id"));
337
+ copyIdImg.click(function(e){
338
+ var id = ($(this).attr("id")).replace('-copy','');
339
+ var placeholder = $("#" + objectId + "-placeholder");
340
+ var popover = $("#" + copyIdImg.data("popover"));
341
+ placeholder.val(id);
342
+ placeholder.removeClass("hidden");
343
+ placeholder.select();
344
+
345
+ document.execCommand("Copy");
346
+ placeholder.addClass("hidden");
347
+ ajaxInfoAlert("Id [" + id + "] was copied into the clipboard!", 4000);
348
+
349
+ if (!isBlank(popover)) {
350
+ popover.popover('hide');
351
+ }
352
+
353
+ });
354
+
355
+ });
356
+
357
+ });
358
+
359
+ // close all object id popover on modal show
360
+ $(".modal").on('show.bs.modal',function(e){
361
+ $(".object-id-popover").each(function(idx, e) {
362
+ $(this).popover('destroy');
363
+ });
364
+ });
365
+
366
+ // check if object id must be restored
367
+ $(".modal").on('hide.bs.modal',function(e){
368
+ setObjectIdPopover();
369
+ });
370
+ }
@@ -382,7 +382,7 @@ table.subtitle {
382
382
  }
383
383
 
384
384
  .fix-position {
385
- padding-left: 45px;
385
+ padding-left: 20px;
386
386
 
387
387
  @media (@phone) {
388
388
  padding-left: 15px;
@@ -553,6 +553,61 @@ form[id^="new_tag_definition"] {
553
553
  }
554
554
 
555
555
  /* The switch - the box around the slider */
556
+ .switch-half-container {
557
+ padding-top: 9px !important;
558
+ }
559
+
560
+ .switch-half {
561
+ position: relative;
562
+ display: inline-block;
563
+ margin-bottom: 0;
564
+ width: 20px;
565
+ height: 12px;
566
+
567
+
568
+ /* Hide default HTML checkbox */
569
+ input {display:none;}
570
+
571
+ /* The slider */
572
+ .slider {
573
+ position: absolute;
574
+ cursor: pointer;
575
+ top: 0;
576
+ left: 0;
577
+ right: 0;
578
+ bottom: 0;
579
+ background-color: #ccc;
580
+ -webkit-transition: .4s;
581
+ transition: .4s;
582
+ }
583
+
584
+ .slider:before {
585
+ position: absolute;
586
+ content: "";
587
+ height: 10px;
588
+ width: 10px;
589
+ left: 1px;
590
+ bottom: 1px;
591
+ background-color: white;
592
+ -webkit-transition: .4s;
593
+ transition: .4s;
594
+ }
595
+
596
+ input:checked + .slider {
597
+ background-color: #00919d;
598
+ }
599
+
600
+ input:focus + .slider {
601
+ box-shadow: 0 0 1px #2196F3;
602
+ }
603
+
604
+ input:checked + .slider:before {
605
+ -webkit-transform: translateX(8px);
606
+ -ms-transform: translateX(8px);
607
+ transform: translateX(8px);
608
+ }
609
+ }
610
+
556
611
  .switch {
557
612
  position: relative;
558
613
  display: inline-block;
@@ -595,12 +650,12 @@ form[id^="new_tag_definition"] {
595
650
  input:focus + .slider {
596
651
  box-shadow: 0 0 1px #2196F3;
597
652
  }
598
- }
599
653
 
600
- input:checked + .slider:before {
601
- -webkit-transform: translateX(16px);
602
- -ms-transform: translateX(16px);
603
- transform: translateX(16px);
654
+ input:checked + .slider:before {
655
+ -webkit-transform: translateX(16px);
656
+ -ms-transform: translateX(16px);
657
+ transform: translateX(16px);
658
+ }
604
659
  }
605
660
 
606
661
  /* Rounded sliders */
@@ -632,4 +687,34 @@ input:checked + .slider:before {
632
687
 
633
688
  .toggle-label {
634
689
  text-align: left !important;
690
+ }
691
+
692
+ .spinner {
693
+ padding-top: 3.5px;
694
+ width: 40px;
695
+ color: #00919d;
696
+ display: none;
697
+ }
698
+
699
+ .footer-notice {
700
+ .modal-footer {
701
+ text-align: left;
702
+ padding-bottom: 0;
703
+
704
+ .alert {
705
+ margin-bottom: 0;
706
+
707
+ .label-default {
708
+ color: white;
709
+ }
710
+ }
711
+ }
712
+ }
713
+
714
+ .copy-icon {
715
+ cursor: pointer;
716
+ }
717
+
718
+ .switch-tenant-active {
719
+ color: #00919d;
635
720
  }
@@ -10,6 +10,7 @@
10
10
 
11
11
  .payment-details {
12
12
  padding-bottom: 0;
13
+ padding-left: 45px;
13
14
 
14
15
  table.transparent {
15
16
  margin-bottom: 0;
@@ -34,12 +34,9 @@ class Kaui::AccountChildrenController < Kaui::EngineController
34
34
 
35
35
  formatter = lambda do |account_child|
36
36
  [
37
- view_context.link_to(account_child.name || '(not set)', account_path(account_child.account_id)),
38
- view_context.truncate_uuid(account_child.account_id),
37
+ view_context.link_to(account_child.account_id, account_path(account_child.account_id)),
39
38
  account_child.external_key,
40
39
  view_context.humanized_money_with_symbol(account_child.balance_to_money),
41
- account_child.city,
42
- account_child.country
43
40
  ]
44
41
  end
45
42
 
@@ -45,12 +45,9 @@ class Kaui::AccountsController < Kaui::EngineController
45
45
 
46
46
  [
47
47
  child_label,
48
- view_context.link_to(account.name || '(not set)', view_context.url_for(:action => :show, :account_id => account.account_id)),
49
- view_context.truncate_uuid(account.account_id),
48
+ view_context.link_to(account.account_id, view_context.url_for(:action => :show, :account_id => account.account_id)),
50
49
  account.external_key,
51
- view_context.humanized_money_with_symbol(account.balance_to_money),
52
- account.city,
53
- account.country
50
+ view_context.humanized_money_with_symbol(account.balance_to_money)
54
51
  ]
55
52
  end
56
53
 
@@ -171,7 +168,7 @@ class Kaui::AccountsController < Kaui::EngineController
171
168
  def trigger_invoice
172
169
  account_id = params.require(:account_id)
173
170
  target_date = params[:target_date].presence
174
- dry_run = params[:dry_run] == '1'
171
+ dry_run = params[:dry_run].nil? ? false : params[:dry_run] == '1'
175
172
 
176
173
  invoice = nil
177
174
  begin
@@ -233,7 +230,7 @@ class Kaui::AccountsController < Kaui::EngineController
233
230
  def pay_all_invoices
234
231
  payment = Kaui::InvoicePayment.new(:account_id => params.require(:account_id))
235
232
 
236
- payment.bulk_create(params[:is_external_payment] == 'true', current_user.kb_username, params[:reason], params[:comment], options_for_klient)
233
+ payment.bulk_create(params[:is_external_payment] == 'true', nil, nil, current_user.kb_username, params[:reason], params[:comment], options_for_klient)
237
234
 
238
235
  redirect_to account_path(payment.account_id), :notice => 'Successfully triggered a payment for all unpaid invoices'
239
236
  end
@@ -8,14 +8,17 @@ class Kaui::AdminAllowedUsersController < Kaui::EngineController
8
8
 
9
9
  def new
10
10
  @allowed_user = Kaui::AllowedUser.new
11
+ @is_killbill_managed = true
12
+
11
13
  @roles = []
12
14
  end
13
15
 
14
16
  def create
17
+ @is_killbill_managed = nil
15
18
  @allowed_user = Kaui::AllowedUser.new(allowed_user_params)
16
19
 
17
20
  existing_user = Kaui::AllowedUser.find_by_kb_username(@allowed_user.kb_username)
18
- if existing_user
21
+ unless existing_user.blank?
19
22
  flash[:error] = "User with name #{@allowed_user.kb_username} already exists!"
20
23
  @roles = roles_for_user(existing_user)
21
24
  render :new and return
@@ -24,10 +27,12 @@ class Kaui::AdminAllowedUsersController < Kaui::EngineController
24
27
  # Create locally only
25
28
  @allowed_user.save!
26
29
  else
27
- roles = params[:roles].split(',')
28
-
29
- # Create locally and in KB
30
- @allowed_user.create_in_kb!(params.require(:password), roles, current_user.kb_username, params[:reason], params[:comment], options_for_klient)
30
+ @allowed_user.create_in_kb!(params.require(:password) ,
31
+ params[:roles].blank? ? [] : params[:roles].split(','),
32
+ current_user.kb_username,
33
+ params[:reason],
34
+ params[:comment],
35
+ options_for_klient)
31
36
  end
32
37
 
33
38
  redirect_to kaui_engine.admin_allowed_user_path(@allowed_user.id), :notice => 'User was successfully configured'
@@ -46,6 +51,7 @@ class Kaui::AdminAllowedUsersController < Kaui::EngineController
46
51
 
47
52
  def edit
48
53
  @allowed_user = Kaui::AllowedUser.find(params.require(:id))
54
+ @is_killbill_managed = killbill_managed?(@allowed_user, options_for_klient)
49
55
 
50
56
  @roles = roles_for_user(@allowed_user)
51
57
  end
@@ -56,7 +62,7 @@ class Kaui::AdminAllowedUsersController < Kaui::EngineController
56
62
  @allowed_user.description = params[:allowed_user][:description].presence
57
63
 
58
64
  @allowed_user.update_in_kb!(params[:password].presence,
59
- params[:roles].presence.split(','),
65
+ params[:roles].blank? ? nil : params[:roles].split(','),
60
66
  current_user.kb_username,
61
67
  params[:reason],
62
68
  params[:comment],
@@ -103,6 +109,17 @@ class Kaui::AdminAllowedUsersController < Kaui::EngineController
103
109
 
104
110
  private
105
111
 
112
+ # this will check if the user is managed by killbill (not managed externally or internally by a shiro config file).
113
+ def killbill_managed?(allowed_user, options = {})
114
+ begin
115
+ Kaui::UserRole.find_roles_by_username(allowed_user.kb_username, options)
116
+ rescue KillBillClient::API::ClientError => _
117
+ return false
118
+ end
119
+
120
+ return true
121
+ end
122
+
106
123
  def allowed_user_params
107
124
  allowed_user = params.require(:allowed_user)
108
125
  allowed_user.require(:kb_username)
@@ -110,6 +127,6 @@ class Kaui::AdminAllowedUsersController < Kaui::EngineController
110
127
  end
111
128
 
112
129
  def roles_for_user(allowed_user)
113
- Kaui::UserRole.find_roles_by_username(allowed_user.kb_username, options_for_klient).map(&:presence).compact || []
130
+ Kaui::UserRole.find_roles_by_username(allowed_user.kb_username, options_for_klient).map(&:presence).compact rescue []
114
131
  end
115
132
  end
@@ -233,7 +233,7 @@ class Kaui::AdminTenantsController < Kaui::EngineController
233
233
  view_form_model['states'] = view_form_model['states'].values unless view_form_model['states'].blank?
234
234
 
235
235
  overdue = Kaui::Overdue::from_overdue_form_model(view_form_model)
236
- overdue.upload_tenant_overdue_config_json(options[:username], nil, comment, options)
236
+ Kaui::Overdue::upload_tenant_overdue_config_json(overdue.to_json,options[:username], nil, comment, options)
237
237
  redirect_to admin_tenant_path(current_tenant.id), :notice => 'Overdue config was successfully added '
238
238
  end
239
239
 
@@ -314,11 +314,16 @@ class Kaui::AdminTenantsController < Kaui::EngineController
314
314
  plugin_type = params[:plugin_type]
315
315
  plugin_key = params[:plugin_key]
316
316
 
317
- plugin_config = Kaui::AdminTenant.format_plugin_config(plugin_key, plugin_type, plugin_properties)
317
+ if plugin_properties.blank?
318
+ flash[:error] = 'Plugin properties cannot be blank'
319
+ else
320
+ plugin_config = Kaui::AdminTenant.format_plugin_config(plugin_key, plugin_type, plugin_properties)
318
321
 
319
- Kaui::AdminTenant.upload_tenant_plugin_config(plugin_name, plugin_config, options[:username], nil, comment, options)
322
+ Kaui::AdminTenant.upload_tenant_plugin_config(plugin_name, plugin_config, options[:username], nil, comment, options)
323
+ flash[:notice] = 'Config for plugin was successfully uploaded'
324
+ end
320
325
 
321
- redirect_to admin_tenant_path(current_tenant.id), :notice => 'Config for plugin was successfully uploaded'
326
+ redirect_to admin_tenant_path(current_tenant.id)
322
327
  end
323
328
 
324
329
  def remove_allowed_user
@@ -367,23 +372,15 @@ class Kaui::AdminTenantsController < Kaui::EngineController
367
372
  end
368
373
 
369
374
  def display_catalog_xml
370
- current_tenant = safely_find_tenant_by_id(params[:id])
371
- effective_date = params.require(:effective_date)
372
-
373
- options = tenant_options_for_client
374
- options[:api_key] = current_tenant.api_key
375
- options[:api_secret] = current_tenant.api_secret
376
-
377
- response = Kaui::Catalog.get_catalog_xml(effective_date, options) rescue response = {}
378
-
379
- catalog_xml = {}
380
- unless response.nil? && response.size > 0
381
- catalog_xml = response[0][:xml]
382
- end
383
-
375
+ catalog_xml = fetch_catalog_xml(params[:id], params.require(:effective_date))
384
376
  render xml: catalog_xml
385
377
  end
386
378
 
379
+ def download_catalog_xml
380
+ effective_date = params.require(:effective_date)
381
+ catalog_xml = fetch_catalog_xml(params[:id], effective_date)
382
+ send_data catalog_xml, filename: "catalog_#{effective_date}.xml", type: :xml
383
+ end
387
384
 
388
385
  def display_overdue_xml
389
386
  render xml: params.require(:xml)
@@ -440,6 +437,17 @@ class Kaui::AdminTenantsController < Kaui::EngineController
440
437
  end
441
438
  end
442
439
 
440
+ def switch_tenant
441
+ tenant = Kaui::Tenant.find_by_kb_tenant_id(params.require(:kb_tenant_id))
442
+
443
+ # Select the tenant, see TenantsController
444
+ session[:kb_tenant_id] = tenant.kb_tenant_id
445
+ session[:kb_tenant_name] = tenant.name
446
+ session[:tenant_id] = tenant.id
447
+
448
+ redirect_to admin_tenant_path(tenant.id), :notice => "Tenant was switched to #{tenant.name}"
449
+ end
450
+
443
451
  private
444
452
 
445
453
 
@@ -483,10 +491,10 @@ class Kaui::AdminTenantsController < Kaui::EngineController
483
491
 
484
492
  plugin_repository.each do |plugin|
485
493
  return plugin, [] if plugin[:plugin_name] == entered_plugin_name || plugin[:plugin_key] == entered_plugin_name
486
-
487
- splitted_plugin_name = split_camel_dash_underscore_space(plugin[:plugin_name])
488
494
  weight = { :plugin_name => plugin[:plugin_name], :plugin_key => plugin[:plugin_key],
489
495
  :plugin_type => plugin[:plugin_type], :installed => plugin[:installed], :worth_weight => 0.0 }
496
+
497
+ splitted_plugin_name = split_camel_dash_underscore_space(plugin[:plugin_name])
490
498
  splitted_entered_plugin_name.each do |entered|
491
499
  if splitted_plugin_name.include?(entered)
492
500
  weight[:worth_weight] = weight[:worth_weight] + 1.0
@@ -498,7 +506,23 @@ class Kaui::AdminTenantsController < Kaui::EngineController
498
506
  break
499
507
  end
500
508
  end
509
+
510
+ # perform a plugin key search, if weight is zero
511
+ next unless weight[:worth_weight] == 0
512
+ splitted_plugin_key = split_camel_dash_underscore_space(plugin[:plugin_key])
513
+
514
+ if splitted_plugin_key.include?(entered)
515
+ weight[:worth_weight] = weight[:worth_weight] + 1.0
516
+ end
517
+
518
+ splitted_plugin_key.each do |splitted|
519
+ if entered.chars.all? { |ch| splitted.include?(ch) }
520
+ weight[:worth_weight] = weight[:worth_weight] + worth_of_non_words
521
+ break
522
+ end
523
+ end
501
524
  end
525
+
502
526
  weights << weight if weight[:worth_weight] > 0
503
527
 
504
528
  end
@@ -506,4 +530,19 @@ class Kaui::AdminTenantsController < Kaui::EngineController
506
530
  weights.sort! { |a,b| b[:worth_weight] <=> a[:worth_weight] } if weights.size > 1
507
531
  return nil, weights
508
532
  end
533
+
534
+ def fetch_catalog_xml(tenant_id, effective_date)
535
+ current_tenant = safely_find_tenant_by_id(tenant_id)
536
+
537
+ options = tenant_options_for_client
538
+ options[:api_key] = current_tenant.api_key
539
+ options[:api_secret] = current_tenant.api_secret
540
+
541
+ response = Kaui::Catalog.get_catalog_xml(effective_date, options) rescue response = {}
542
+
543
+ catalog_xml = {}
544
+ catalog_xml = response[0][:xml] unless response.blank?
545
+
546
+ catalog_xml
547
+ end
509
548
  end