flipper-ui 0.22.1 → 0.22.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: a619370e297b8fc379c57c8394cdfc798120ebfd9d4d091bc1902f3d9a2183be
4
- data.tar.gz: a36c5d0a79836aec62188c04f5954a506d737e110a135028b3fc7d9d889a2579
3
+ metadata.gz: b17af1c2cd05d9026a457941c46e7c497460e4289bd8446b90d2f0342e53f34c
4
+ data.tar.gz: 4adae31beca41aebaae69c9c3a0efe51bb024d0acc54eadf3982ddfff4a16748
5
5
  SHA512:
6
- metadata.gz: b02d0683b248297b59e6013f816a6f09bbde28889e38201e0f41c89d29118f06f16061749d55041a786daf81d2d67da8e88885033c4819233794dbd55df3ea8d
7
- data.tar.gz: 425e485bc419c1ae45554298df69a2d6cfdb4d2169fa2b0dc1b3e5e32009e5bafd27372796ab8a1bf3ac68dbc2d1be6a2474cbd7855b1d245fd61c8940e1cb81
6
+ metadata.gz: a8e0d113cb89d77c9e8cd0ec83d8deb7a26f3f6e00452aa81ab6a308843dfe45e069b0e1303374ece24e4a5bd79718958e160249db9195ea22249bab2df66a5d
7
+ data.tar.gz: cc5f6567f690c2bd48b762083046b19e868f4885384885667f20d808cd09f0533df5d3df5239e4a21cc649babbe231e494af984b5c1261b4ef9358b68581784a
@@ -25,19 +25,22 @@ module Flipper
25
25
  def post
26
26
  feature = flipper[feature_name]
27
27
  value = params['value'].to_s.strip
28
+ values = value.split(UI.configuration.actors_separator).map(&:strip).uniq
28
29
 
29
- if Util.blank?(value)
30
+ if values.empty?
30
31
  error = "#{value.inspect} is not a valid actor value."
31
32
  redirect_to("/features/#{feature.key}/actors?error=#{error}")
32
33
  end
33
34
 
34
- actor = Flipper::Actor.new(value)
35
+ values.each do |value|
36
+ actor = Flipper::Actor.new(value)
35
37
 
36
- case params['operation']
37
- when 'enable'
38
- feature.enable_actor actor
39
- when 'disable'
40
- feature.disable_actor actor
38
+ case params['operation']
39
+ when 'enable'
40
+ feature.enable_actor actor
41
+ when 'disable'
42
+ feature.disable_actor actor
43
+ end
41
44
  end
42
45
 
43
46
  redirect_to("/features/#{feature.key}")
@@ -44,6 +44,11 @@ module Flipper
44
44
  # Default false. Only works when using descriptions.
45
45
  attr_accessor :show_feature_description_in_list
46
46
 
47
+ # Public: What should be used to denote you are trying to add multiple
48
+ # actors at once (instead of just a single actor).
49
+ # Default is comma ",".
50
+ attr_accessor :actors_separator
51
+
47
52
  VALID_BANNER_CLASS_VALUES = %w(
48
53
  danger
49
54
  dark
@@ -68,6 +73,7 @@ module Flipper
68
73
  @add_actor_placeholder = "a flipper id"
69
74
  @descriptions_source = DEFAULT_DESCRIPTIONS_SOURCE
70
75
  @show_feature_description_in_list = false
76
+ @actors_separator = ','
71
77
  end
72
78
 
73
79
  def using_descriptions?
@@ -8,7 +8,7 @@
8
8
  <h4 class="card-header">Enable Actor for <%= @feature.key %></h4>
9
9
  <div class="card-body">
10
10
  <p>
11
- Turn on this feature for an individual actor.
11
+ Turn on this feature for actors.
12
12
  </p>
13
13
  <form action="<%= script_name %>/features/<%= @feature.key %>/actors" method="post" class="form-inline">
14
14
  <%== csrf_input_tag %>
@@ -130,8 +130,8 @@
130
130
  <%== csrf_input_tag %>
131
131
  <input type="hidden" name="operation" value="disable">
132
132
  <input type="hidden" name="value" value="<%= item %>">
133
- <button type="submit" value="Disable" class="btn btn-link btn-sm text-danger" data-toggle="tooltip" title="Disable <%= item %>" data-placement="left">
134
- <span class="octicon octicon-trashcan"></span>
133
+ <button type="submit" value="Disable" class="btn btn-outline-danger" data-toggle="tooltip" title="Disable <%= item %>" data-placement="left">
134
+ Remove
135
135
  </button>
136
136
  </form>
137
137
  </div>
@@ -1,3 +1,3 @@
1
1
  module Flipper
2
- VERSION = '0.22.1'.freeze
2
+ VERSION = '0.22.2'.freeze
3
3
  end
@@ -45,6 +45,7 @@ RSpec.describe Flipper::UI::Actions::ActorsGate do
45
45
  describe 'POST /features/:feature/actors' do
46
46
  context 'enabling an actor' do
47
47
  let(:value) { 'User;6' }
48
+ let(:multi_value) { 'User;5, User;7, User;9, User;12' }
48
49
 
49
50
  before do
50
51
  post 'features/search/actors',
@@ -53,7 +54,18 @@ RSpec.describe Flipper::UI::Actions::ActorsGate do
53
54
  end
54
55
 
55
56
  it 'adds item to members' do
56
- expect(flipper[:search].actors_value).to include('User;6')
57
+ expect(flipper[:search].actors_value).to include(value)
58
+ end
59
+
60
+ it 'adds item to multiple members' do
61
+ post 'features/search/actors',
62
+ { 'value' => multi_value, 'operation' => 'enable', 'authenticity_token' => token },
63
+ 'rack.session' => session
64
+
65
+ expect(flipper[:search].actors_value).to include('User;5')
66
+ expect(flipper[:search].actors_value).to include('User;7')
67
+ expect(flipper[:search].actors_value).to include('User;9')
68
+ expect(flipper[:search].actors_value).to include('User;12')
57
69
  end
58
70
 
59
71
  it 'redirects back to feature' do
@@ -80,10 +92,22 @@ RSpec.describe Flipper::UI::Actions::ActorsGate do
80
92
 
81
93
  context 'value contains whitespace' do
82
94
  let(:value) { ' User;6 ' }
95
+ let(:multi_value) { ' User;5 , User;7 , User;9 , User;12 ' }
83
96
 
84
97
  it 'adds item without whitespace' do
85
98
  expect(flipper[:search].actors_value).to include('User;6')
86
99
  end
100
+
101
+ it 'adds item to multi members without whitespace' do
102
+ post 'features/search/actors',
103
+ { 'value' => multi_value, 'operation' => 'enable', 'authenticity_token' => token },
104
+ 'rack.session' => session
105
+
106
+ expect(flipper[:search].actors_value).to include('User;5')
107
+ expect(flipper[:search].actors_value).to include('User;7')
108
+ expect(flipper[:search].actors_value).to include('User;9')
109
+ expect(flipper[:search].actors_value).to include('User;12')
110
+ end
87
111
  end
88
112
 
89
113
  context 'for an invalid actor value' do
@@ -109,16 +133,29 @@ RSpec.describe Flipper::UI::Actions::ActorsGate do
109
133
 
110
134
  context 'disabling an actor' do
111
135
  let(:value) { 'User;6' }
136
+ let(:multi_value) { 'User;5, User;7, User;9, User;12' }
112
137
 
113
138
  before do
114
- flipper[:search].enable_actor Flipper::Actor.new('User;6')
139
+ flipper[:search].enable_actor Flipper::Actor.new(value)
115
140
  post 'features/search/actors',
116
141
  { 'value' => value, 'operation' => 'disable', 'authenticity_token' => token },
117
142
  'rack.session' => session
118
143
  end
119
144
 
120
145
  it 'removes item from members' do
121
- expect(flipper[:search].actors_value).not_to include('User;6')
146
+ expect(flipper[:search].actors_value).not_to include(value)
147
+ end
148
+
149
+ it 'removes item from multi members' do
150
+ multi_value.split(',').map(&:strip).each do |value|
151
+ flipper[:search].enable_actor Flipper::Actor.new(value)
152
+ end
153
+
154
+ post 'features/search/actors',
155
+ { 'value' => multi_value, 'operation' => 'disable', 'authenticity_token' => token },
156
+ 'rack.session' => session
157
+
158
+ expect(flipper[:search].actors_value).not_to eq(Set.new(multi_value.split(',').map(&:strip)))
122
159
  end
123
160
 
124
161
  it 'redirects back to feature' do
@@ -128,10 +165,21 @@ RSpec.describe Flipper::UI::Actions::ActorsGate do
128
165
 
129
166
  context 'value contains whitespace' do
130
167
  let(:value) { ' User;6 ' }
168
+ let(:multi_value) { ' User;5 , User;7 , User;9 , User;12 ' }
131
169
 
132
170
  it 'removes item without whitespace' do
133
171
  expect(flipper[:search].actors_value).not_to include('User;6')
134
172
  end
173
+
174
+ it 'removes item without whitespace' do
175
+ multi_value.split(',').map(&:strip).each do |value|
176
+ flipper[:search].enable_actor Flipper::Actor.new(value)
177
+ end
178
+ post 'features/search/actors',
179
+ { 'value' => multi_value, 'operation' => 'disable', 'authenticity_token' => token },
180
+ 'rack.session' => session
181
+ expect(flipper[:search].actors_value).not_to eq(Set.new(multi_value.split(',').map(&:strip)))
182
+ end
135
183
  end
136
184
  end
137
185
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flipper-ui
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.22.1
4
+ version: 0.22.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-23 00:00:00.000000000 Z
11
+ date: 2021-10-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -56,14 +56,14 @@ dependencies:
56
56
  requirements:
57
57
  - - "~>"
58
58
  - !ruby/object:Gem::Version
59
- version: 0.22.1
59
+ version: 0.22.2
60
60
  type: :runtime
61
61
  prerelease: false
62
62
  version_requirements: !ruby/object:Gem::Requirement
63
63
  requirements:
64
64
  - - "~>"
65
65
  - !ruby/object:Gem::Version
66
- version: 0.22.1
66
+ version: 0.22.2
67
67
  - !ruby/object:Gem::Dependency
68
68
  name: erubi
69
69
  requirement: !ruby/object:Gem::Requirement