kaui 2.0.1 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 435f5a3c43e225e631222f6342c14a00732cda14be90c36ea499a21a89d4f0dc
4
- data.tar.gz: 733ba6cb910b17aaae7764811f1a2861ac0a6e4521fc856e777dcc055fba6e21
3
+ metadata.gz: f2de0a1cf9deebfbdae2781d8bfe36637ecd1bf6e01877c6d88ddbc95a77cb05
4
+ data.tar.gz: c8089c093f566b916137637e53b56a409d7e5bee8e74d0ed16f2bdaabf76d262
5
5
  SHA512:
6
- metadata.gz: 2db883f170a25e9996a7d2378aefe648b1807c2799a88e0bdbc2b5d495f4f926030ffdce7c414c6725ca7c9e0e54d0fb8ad981f3cedd90ec06bc532abd0ce346
7
- data.tar.gz: 957b7d9f5e0b90d147ed20b6c14907402a30ef4f1bd29acb0d1a70016d0773212b375ef9d81aa7c56af2005ab45e777923a7689f3d53da697e1b4e3b7f2e8db8
6
+ metadata.gz: d26ede3ecdbfdc270234d94c374271bbb47bb94bd90e3d4f98e93706f77b623a7a6236c00ce28d354508cd378402bc60a55a2734695f5f88b8a4d7cdf44d1692
7
+ data.tar.gz: 870b1a5e19fed59434aec7c4a7a1f4374c834a2e8208689301c7554f91d95ab2f8dd43efc1c989bf679b1426a5eba2365fa8d2a675376f904d3db3dd9baad3fc
@@ -115,27 +115,15 @@ class Kaui::AdminTenantsController < Kaui::EngineController
115
115
  end
116
116
 
117
117
  def new_catalog
118
- @tenant = safely_find_tenant_by_id(params[:id])
119
-
120
118
  options = tenant_options_for_client
121
- options[:api_key] = @tenant.api_key
122
- options[:api_secret] = @tenant.api_secret
123
-
124
- latest_catalog = Kaui::Catalog::get_catalog_json(true, nil, options)
125
-
126
- @ao_mapping = Kaui::Catalog::build_ao_mapping(latest_catalog)
127
-
128
- @available_base_products = latest_catalog && latest_catalog.products ?
129
- latest_catalog.products.select { |p| p.type == 'BASE' }.map { |p| p.name } : []
130
- @available_ao_products = latest_catalog && latest_catalog.products ?
131
- latest_catalog.products.select { |p| p.type == 'ADD_ON' }.map { |p| p.name } : []
132
- @available_standalone_products = latest_catalog && latest_catalog.products ?
133
- latest_catalog.products.select { |p| p.type == 'STANDALONE' }.map { |p| p.name } : []
134
- @product_categories = [:BASE, :ADD_ON, :STANDALONE]
135
- @billing_period = [:DAILY, :WEEKLY, :BIWEEKLY, :THIRTY_DAYS, :MONTHLY, :QUARTERLY, :BIANNUAL, :ANNUAL, :BIENNIAL]
136
- @time_units = [:UNLIMITED, :DAYS, :WEEKS, :MONTHS, :YEARS]
137
-
138
- @simple_plan = Kaui::SimplePlan.new
119
+ fetch_state_for_new_catalog_screen(options)
120
+ @simple_plan = Kaui::SimplePlan.new({
121
+ :product_category => 'BASE',
122
+ :amount => 0,
123
+ :trial_length => 0,
124
+ :currency => 'USD',
125
+ :billing_period => 'MONTHLY'
126
+ })
139
127
  end
140
128
 
141
129
  def delete_catalog
@@ -183,21 +171,55 @@ class Kaui::AdminTenantsController < Kaui::EngineController
183
171
  end
184
172
 
185
173
  def create_simple_plan
186
- current_tenant = safely_find_tenant_by_id(params[:id])
187
-
188
174
  options = tenant_options_for_client
189
- options[:api_key] = current_tenant.api_key
190
- options[:api_secret] = current_tenant.api_secret
175
+ fetch_state_for_new_catalog_screen(options)
191
176
 
192
177
  simple_plan = params.require(:simple_plan).delete_if { |e, value| value.blank? }
193
178
  # Fix issue in Rails where first entry in the multi-select array is an empty string
194
179
  simple_plan["available_base_products"].reject!(&:blank?) if simple_plan["available_base_products"]
195
180
 
196
- simple_plan = KillBillClient::Model::SimplePlanAttributes.new(simple_plan)
197
-
198
- Kaui::Catalog.add_tenant_catalog_simple_plan(simple_plan, options[:username], nil, comment, options)
181
+ @simple_plan = Kaui::SimplePlan.new(simple_plan)
182
+
183
+ valid = true
184
+ # Validate new simple plan
185
+ # https://github.com/killbill/killbill-admin-ui/issues/247
186
+ if @available_base_products.include?(@simple_plan.plan_id)
187
+ flash.now[:error] = "Error while creating plan: invalid plan name (#{@simple_plan.plan_id} is a BASE product already)"
188
+ valid = false
189
+ elsif @available_ao_products.include?(@simple_plan.plan_id)
190
+ flash.now[:error] = "Error while creating plan: invalid plan name (#{@simple_plan.plan_id} is an ADD_ON product already)"
191
+ valid = false
192
+ elsif @available_standalone_products.include?(@simple_plan.plan_id)
193
+ flash.now[:error] = "Error while creating plan: invalid plan name (#{@simple_plan.plan_id} is a STANDALONE product already)"
194
+ valid = false
195
+ elsif @all_plans.include?(@simple_plan.product_name)
196
+ flash.now[:error] = "Error while creating plan: invalid product name (#{@simple_plan.product_name} is a plan name already)"
197
+ valid = false
198
+ elsif @all_plans.include?(@simple_plan.plan_id)
199
+ flash.now[:error] = "Error while creating plan: plan #{@simple_plan.plan_id} already exists"
200
+ valid = false
201
+ elsif @available_base_products.include?(@simple_plan.product_name) && @simple_plan.product_category != 'BASE'
202
+ flash.now[:error] = "Error while creating plan: product #{@simple_plan.product_name} is a BASE product"
203
+ valid = false
204
+ elsif @available_ao_products.include?(@simple_plan.product_name) && @simple_plan.product_category != 'ADD_ON'
205
+ flash.now[:error] = "Error while creating plan: product #{@simple_plan.product_name} is an ADD_ON product"
206
+ valid = false
207
+ elsif @available_standalone_products.include?(@simple_plan.product_name) && @simple_plan.product_category != 'STANDALONE'
208
+ flash.now[:error] = "Error while creating plan: product #{@simple_plan.product_name} is a STANDALONE product"
209
+ valid = false
210
+ end
199
211
 
200
- redirect_to admin_tenant_path(current_tenant.id), :notice => 'Catalog plan was successfully added'
212
+ if valid
213
+ begin
214
+ Kaui::Catalog.add_tenant_catalog_simple_plan(@simple_plan, options[:username], nil, comment, options)
215
+ redirect_to admin_tenant_path(@tenant.id), :notice => 'Catalog plan was successfully added'
216
+ rescue => e
217
+ flash.now[:error] = "Error while creating plan: #{as_string(e)}"
218
+ render :action => :new_catalog
219
+ end
220
+ else
221
+ render :action => :new_catalog
222
+ end
201
223
  end
202
224
 
203
225
  def new_overdue_config
@@ -415,6 +437,29 @@ class Kaui::AdminTenantsController < Kaui::EngineController
415
437
 
416
438
  private
417
439
 
440
+ # Share code to handle render on error
441
+ def fetch_state_for_new_catalog_screen(options)
442
+ @tenant = safely_find_tenant_by_id(params[:id])
443
+
444
+ options[:api_key] = @tenant.api_key
445
+ options[:api_secret] = @tenant.api_secret
446
+
447
+ latest_catalog = Kaui::Catalog::get_catalog_json(true, nil, options)
448
+ @all_plans = latest_catalog ? (latest_catalog.products || []).map(&:plans).flatten.map(&:name) : []
449
+
450
+ @ao_mapping = Kaui::Catalog::build_ao_mapping(latest_catalog)
451
+
452
+ @available_base_products = latest_catalog && latest_catalog.products ?
453
+ latest_catalog.products.select { |p| p.type == 'BASE' }.map { |p| p.name } : []
454
+ @available_ao_products = latest_catalog && latest_catalog.products ?
455
+ latest_catalog.products.select { |p| p.type == 'ADD_ON' }.map { |p| p.name } : []
456
+ @available_standalone_products = latest_catalog && latest_catalog.products ?
457
+ latest_catalog.products.select { |p| p.type == 'STANDALONE' }.map { |p| p.name } : []
458
+ @product_categories = [:BASE, :ADD_ON, :STANDALONE]
459
+ @billing_period = [:DAILY, :WEEKLY, :BIWEEKLY, :THIRTY_DAYS, :MONTHLY, :QUARTERLY, :BIANNUAL, :ANNUAL, :BIENNIAL]
460
+ @time_units = [:UNLIMITED, :DAYS, :WEEKS, :MONTHS, :YEARS]
461
+ end
462
+
418
463
  def safely_find_tenant_by_id(tenant_id)
419
464
  tenant = Kaui::Tenant.find_by_id(tenant_id)
420
465
  raise ActiveRecord::RecordNotFound.new('Could not find tenant ' + tenant_id) unless retrieve_tenants_for_current_user.include?(tenant.kb_tenant_id)
@@ -45,9 +45,15 @@ class Kaui::PaymentMethodsController < Kaui::EngineController
45
45
  }
46
46
 
47
47
  @plugin_properties = params[:plugin_properties].values.select{ |item| !(item['value'].blank? || item['key'].blank?) } rescue @plugin_properties = nil
48
- @plugin_properties.map! do |property|
49
- KillBillClient::Model::PluginPropertyAttributes.new(property)
50
- end unless @plugin_properties.blank?
48
+ if @plugin_properties.blank?
49
+ # In case of error, we want the view to receive nil, not [], so that at least the first row is populated (required to make the JS work)
50
+ # See https://github.com/killbill/killbill-admin-ui/issues/258
51
+ @plugin_properties = nil
52
+ else
53
+ @plugin_properties.map! do |property|
54
+ KillBillClient::Model::PluginPropertyAttributes.new(property)
55
+ end
56
+ end
51
57
 
52
58
  begin
53
59
  @payment_method = @payment_method.create(@payment_method.is_default, current_user.kb_username, params[:reason], params[:comment],
@@ -10,12 +10,12 @@ module Kaui
10
10
  end
11
11
 
12
12
  def humanized_product_category(product_category)
13
- if product_category == 'BASE'
13
+ if product_category.to_s == 'BASE'
14
14
  'Base'
15
- elsif product_category == 'ADD_ON'
15
+ elsif product_category.to_s == 'ADD_ON'
16
16
  'Add-on'
17
17
  else
18
- product_category.downcase.capitalize
18
+ product_category.to_s.downcase.capitalize
19
19
  end
20
20
  end
21
21
 
@@ -28,7 +28,8 @@ module Kaui
28
28
  end
29
29
 
30
30
  def humanized_product_name(product_name)
31
- product_name.downcase.capitalize
31
+ # Don't change the casing to avoid confusions (could lead to different products with different casing)
32
+ product_name
32
33
  end
33
34
 
34
35
  def humanized_subscription_billing_period(sub)
@@ -106,8 +106,8 @@
106
106
  plan['new_plan_currency_path'] = Routes.kaui_engine_admin_tenant_new_plan_currency_path(<%= @tenant.id %>, {plan_id: plan['plan_id']});
107
107
  plan['humanized_product_name'] = function(){
108
108
  return function (input, render) {
109
- var product_name = render(input);
110
- return product_name.toLowerCase().replace(/\b\w/g, function(l){ return l.toUpperCase() });
109
+ // Keep the product name as-is to avoid confusing with casing
110
+ return render(input);
111
111
  }
112
112
  }
113
113
 
@@ -11,7 +11,7 @@
11
11
  <div class="form-group" id="form_category">
12
12
  <%= f.label :product_category, 'Product Category', :class => 'col-sm-3 control-label' %>
13
13
  <div class="col-sm-4">
14
- <%= f.select :product_category, options_for_select(@product_categories.map {|p| [humanized_product_category(p), p] }, :Base), :class => 'form-control' %>
14
+ <%= f.select :product_category, options_for_select(@product_categories.map {|p| [humanized_product_category(p), p] }, @simple_plan.product_category), :class => 'form-control' %>
15
15
  </div>
16
16
  </div>
17
17
  <div class="form-group">
@@ -47,31 +47,31 @@
47
47
  <div class="form-group">
48
48
  <%= f.label :amount, 'Amount', :class => 'col-sm-3 control-label' %>
49
49
  <div class="col-sm-4">
50
- <%= f.number_field :amount, :class => 'form-control', :value => 0, :step => :any %>
50
+ <%= f.number_field :amount, :class => 'form-control', :step => :any %>
51
51
  </div>
52
52
  </div>
53
53
  <div class="form-group">
54
54
  <%= f.label :currency, 'Currency', :class => 'col-sm-3 control-label' %>
55
55
  <div class="col-sm-4">
56
- <%= f.select :currency, currencies, {:selected => 'USD'}, :class => 'form-control' %>
56
+ <%= f.select :currency, currencies, {:selected => @simple_plan.currency}, :class => 'form-control' %>
57
57
  </div>
58
58
  </div>
59
59
  <div class="form-group">
60
60
  <%= f.label :billing_period, 'Billing Period', :class => 'col-sm-3 control-label' %>
61
61
  <div class="col-sm-4">
62
- <%= f.select :billing_period, options_for_select(@billing_period.map {|bp| [humanized_billing_period(bp), bp] }, :MONTHLY), :class => 'form-control' %>
62
+ <%= f.select :billing_period, options_for_select(@billing_period.map {|bp| [humanized_billing_period(bp), bp] }, @simple_plan.billing_period), :class => 'form-control' %>
63
63
  </div>
64
64
  </div>
65
65
  <div class="form-group">
66
66
  <%= f.label :trial_length, 'Trial Length', :class => 'col-sm-3 control-label' %>
67
67
  <div class="col-sm-4">
68
- <%= f.number_field :trial_length, :class => 'form-control', :value => 0 %>
68
+ <%= f.number_field :trial_length, :class => 'form-control', :type => 'number', :min => 0, :step => 1 %>
69
69
  </div>
70
70
  </div>
71
71
  <div class="form-group">
72
72
  <%= f.label :trial_time_unit, 'Trial Time Unit', :class => 'col-sm-3 control-label' %>
73
73
  <div class="col-sm-4">
74
- <%= f.select :trial_time_unit, options_for_select(@time_units.map {|tu| [humanized_time_unit(tu), tu]}, :UNLIMITED), :class => 'form-control' %>
74
+ <%= f.select :trial_time_unit, options_for_select(@time_units.map {|tu| [humanized_time_unit(tu), tu]}, @simple_plan.trial_time_unit), :class => 'form-control' %>
75
75
  </div>
76
76
  </div>
77
77
  <div class="form-group">
@@ -111,15 +111,19 @@
111
111
 
112
112
  function known_products() {
113
113
  var result = [];
114
- var selected_category = $("#simple_plan_product_category option:selected" ).text();
115
- if (selected_category == 'Base') {
114
+ var selected_category = $("#simple_plan_product_category option:selected").val();
115
+ if (selected_category == 'BASE') {
116
116
  result = $('#simple_plan_product_name').attr('known_base');
117
- } else if (selected_category == 'Add_on') {
117
+ } else if (selected_category == 'ADD_ON') {
118
118
  result = $('#simple_plan_product_name').attr('known_ao');
119
119
  } else {
120
120
  result = $('#simple_plan_product_name').attr('known_std');
121
121
  }
122
- return result.split(",");
122
+ if (result) {
123
+ return result.split(",");
124
+ } else {
125
+ return [];
126
+ }
123
127
  }
124
128
 
125
129
  function switch_xml_config() {
@@ -128,7 +132,7 @@ function switch_xml_config() {
128
132
  }
129
133
 
130
134
  function recompute_available_base_products_for_ao() {
131
- if ($("#simple_plan_product_category option:selected" ).text() != 'Add_on') {
135
+ if ($("#simple_plan_product_category option:selected" ).val() != 'ADD_ON') {
132
136
  return;
133
137
  }
134
138
  var product_name = $('#simple_plan_product_name').val();
@@ -147,10 +151,7 @@ function recompute_available_base_products_for_ao() {
147
151
  }
148
152
 
149
153
  function display_available_base_products_for_ao() {
150
- /* Reset prodcut name value; known_products from auto completion will also be updated accordingly */
151
- $('#simple_plan_product_name').val('');
152
-
153
- if ($("#simple_plan_product_category option:selected" ).text() == 'Add_on') {
154
+ if ($("#simple_plan_product_category option:selected" ).val() == 'ADD_ON') {
154
155
  $('#form_base_products').show();
155
156
  } else {
156
157
  $('#form_base_products').hide();
@@ -5,7 +5,7 @@
5
5
  <div class="form-group">
6
6
  <%= f.label :amount, 'Amount', :class => 'col-sm-2 control-label' %>
7
7
  <div class="col-sm-10">
8
- <%= f.number_field :amount, :id => 'chargeback_amount', :class => 'form-control' %>
8
+ <%= f.number_field :amount, :step => :any, :id => 'chargeback_amount', :class => 'form-control' %>
9
9
  <p class="help-block">Currency: <%= @chargeback.currency %></p>
10
10
  </div>
11
11
  </div>
@@ -15,7 +15,7 @@
15
15
  <div class="form-group">
16
16
  <%= f.label :amount, 'Amount', :class => 'col-sm-2 control-label' %>
17
17
  <div class="col-sm-10">
18
- <%= f.number_field :amount, :id => 'charge_amount', :class => 'form-control' %>
18
+ <%= f.number_field :amount, :step => :any, :id => 'charge_amount', :class => 'form-control' %>
19
19
  <% if @invoice.present? %>
20
20
  <p class="help-block">Currency: <%= @invoice.currency %></p>
21
21
  <% end %>
@@ -14,7 +14,7 @@
14
14
  <div class="form-group">
15
15
  <%= f.label :purchased_amount, 'Amount', :class => 'col-sm-3 control-label' %>
16
16
  <div class="col-sm-9">
17
- <%= f.number_field :purchased_amount, :id => 'payment_amount', :class => 'form-control' %>
17
+ <%= f.number_field :purchased_amount, :step => :any, :id => 'payment_amount', :class => 'form-control' %>
18
18
  <p class="help-block">Currency: <%= @invoice.present? ? @invoice.currency : @account.currency %></p>
19
19
  </div>
20
20
  </div>
@@ -9,7 +9,7 @@
9
9
  <div class="form-group">
10
10
  <%= label_tag :price_override, 'Price Override', :class => 'col-sm-3 control-label' %>
11
11
  <div class="col-sm-9">
12
- <%= number_field_tag :price_override, nil, :class => 'form-control' %>
12
+ <%= number_field_tag :price_override, nil, :step => :any, :class => 'form-control' %>
13
13
  </div>
14
14
  </div>
15
15
  <div class="form-group">
@@ -37,7 +37,7 @@
37
37
  <div class="form-group">
38
38
  <%= label_tag :price_override, 'Price Override', :class => 'col-sm-2 control-label' %>
39
39
  <div class="col-sm-10">
40
- <%= number_field_tag :price_override, nil, :class => 'form-control' %>
40
+ <%= number_field_tag :price_override, nil, :step => :any, :class => 'form-control' %>
41
41
  </div>
42
42
  </div>
43
43
  <div class="form-group">
@@ -1,3 +1,3 @@
1
1
  module Kaui
2
- VERSION = '2.0.1'
2
+ VERSION = '2.0.2'
3
3
  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: 2.0.1
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Killbill core team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-21 00:00:00.000000000 Z
11
+ date: 2020-02-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails