flipper-ui 0.17.1 → 0.20.0.beta1

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.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/docs/ui/README.md +31 -22
  3. data/docs/ui/images/banner.png +0 -0
  4. data/docs/ui/images/description.png +0 -0
  5. data/docs/ui/images/feature.png +0 -0
  6. data/docs/ui/images/features.png +0 -0
  7. data/examples/ui/basic.ru +20 -0
  8. data/flipper-ui.gemspec +3 -4
  9. data/lib/flipper/ui.rb +0 -3
  10. data/lib/flipper/ui/action.rb +2 -1
  11. data/lib/flipper/ui/actions/feature.rb +5 -2
  12. data/lib/flipper/ui/actions/features.rb +14 -1
  13. data/lib/flipper/ui/actions/file.rb +1 -1
  14. data/lib/flipper/ui/assets/javascripts/application.coffee +5 -3
  15. data/lib/flipper/ui/configuration.rb +23 -10
  16. data/lib/flipper/ui/decorators/feature.rb +39 -13
  17. data/lib/flipper/ui/public/css/application.css +20 -6493
  18. data/lib/flipper/ui/public/js/application.js +5 -5
  19. data/lib/flipper/ui/util.rb +40 -0
  20. data/lib/flipper/ui/views/add_actor.erb +1 -1
  21. data/lib/flipper/ui/views/add_feature.erb +1 -1
  22. data/lib/flipper/ui/views/add_group.erb +1 -1
  23. data/lib/flipper/ui/views/feature.erb +198 -179
  24. data/lib/flipper/ui/views/features.erb +47 -36
  25. data/lib/flipper/ui/views/layout.erb +4 -14
  26. data/lib/flipper/version.rb +1 -1
  27. data/spec/flipper/ui/actions/actors_gate_spec.rb +0 -4
  28. data/spec/flipper/ui/actions/feature_spec.rb +14 -16
  29. data/spec/flipper/ui/actions/features_spec.rb +1 -5
  30. data/spec/flipper/ui/actions/file_spec.rb +0 -10
  31. data/spec/flipper/ui/actions/groups_gate_spec.rb +0 -6
  32. data/spec/flipper/ui/actions/percentage_of_actors_gate_spec.rb +0 -2
  33. data/spec/flipper/ui/actions/percentage_of_time_gate_spec.rb +0 -2
  34. data/spec/flipper/ui/configuration_spec.rb +58 -34
  35. data/spec/flipper/ui/decorators/feature_spec.rb +0 -30
  36. metadata +11 -127
  37. data/docs/ui/images/configured-ui.png +0 -0
  38. data/docs/ui/images/environment-banner.png +0 -0
  39. data/lib/flipper/ui/assets/stylesheets/.DS_Store +0 -0
  40. data/lib/flipper/ui/assets/stylesheets/application.scss +0 -19
  41. data/lib/flipper/ui/assets/stylesheets/bootstrap/_alert.scss +0 -51
  42. data/lib/flipper/ui/assets/stylesheets/bootstrap/_badge.scss +0 -47
  43. data/lib/flipper/ui/assets/stylesheets/bootstrap/_breadcrumb.scss +0 -38
  44. data/lib/flipper/ui/assets/stylesheets/bootstrap/_button-group.scss +0 -166
  45. data/lib/flipper/ui/assets/stylesheets/bootstrap/_buttons.scss +0 -143
  46. data/lib/flipper/ui/assets/stylesheets/bootstrap/_card.scss +0 -270
  47. data/lib/flipper/ui/assets/stylesheets/bootstrap/_carousel.scss +0 -191
  48. data/lib/flipper/ui/assets/stylesheets/bootstrap/_close.scss +0 -34
  49. data/lib/flipper/ui/assets/stylesheets/bootstrap/_code.scss +0 -56
  50. data/lib/flipper/ui/assets/stylesheets/bootstrap/_custom-forms.scss +0 -297
  51. data/lib/flipper/ui/assets/stylesheets/bootstrap/_dropdown.scss +0 -131
  52. data/lib/flipper/ui/assets/stylesheets/bootstrap/_forms.scss +0 -333
  53. data/lib/flipper/ui/assets/stylesheets/bootstrap/_functions.scss +0 -86
  54. data/lib/flipper/ui/assets/stylesheets/bootstrap/_grid.scss +0 -52
  55. data/lib/flipper/ui/assets/stylesheets/bootstrap/_images.scss +0 -42
  56. data/lib/flipper/ui/assets/stylesheets/bootstrap/_input-group.scss +0 -159
  57. data/lib/flipper/ui/assets/stylesheets/bootstrap/_jumbotron.scss +0 -16
  58. data/lib/flipper/ui/assets/stylesheets/bootstrap/_list-group.scss +0 -115
  59. data/lib/flipper/ui/assets/stylesheets/bootstrap/_media.scss +0 -8
  60. data/lib/flipper/ui/assets/stylesheets/bootstrap/_mixins.scss +0 -42
  61. data/lib/flipper/ui/assets/stylesheets/bootstrap/_modal.scss +0 -168
  62. data/lib/flipper/ui/assets/stylesheets/bootstrap/_nav.scss +0 -118
  63. data/lib/flipper/ui/assets/stylesheets/bootstrap/_navbar.scss +0 -311
  64. data/lib/flipper/ui/assets/stylesheets/bootstrap/_pagination.scss +0 -77
  65. data/lib/flipper/ui/assets/stylesheets/bootstrap/_popover.scss +0 -183
  66. data/lib/flipper/ui/assets/stylesheets/bootstrap/_print.scss +0 -124
  67. data/lib/flipper/ui/assets/stylesheets/bootstrap/_progress.scss +0 -33
  68. data/lib/flipper/ui/assets/stylesheets/bootstrap/_reboot.scss +0 -482
  69. data/lib/flipper/ui/assets/stylesheets/bootstrap/_root.scss +0 -19
  70. data/lib/flipper/ui/assets/stylesheets/bootstrap/_tables.scss +0 -180
  71. data/lib/flipper/ui/assets/stylesheets/bootstrap/_tooltip.scss +0 -115
  72. data/lib/flipper/ui/assets/stylesheets/bootstrap/_transitions.scss +0 -36
  73. data/lib/flipper/ui/assets/stylesheets/bootstrap/_type.scss +0 -125
  74. data/lib/flipper/ui/assets/stylesheets/bootstrap/_utilities.scss +0 -14
  75. data/lib/flipper/ui/assets/stylesheets/bootstrap/_variables.scss +0 -894
  76. data/lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap-grid.scss +0 -32
  77. data/lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap-reboot.scss +0 -12
  78. data/lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap.scss +0 -42
  79. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_alert.scss +0 -13
  80. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -21
  81. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -12
  82. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_border-radius.scss +0 -35
  83. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +0 -5
  84. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +0 -123
  85. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_buttons.scss +0 -109
  86. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_caret.scss +0 -65
  87. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_clearfix.scss +0 -7
  88. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_float.scss +0 -11
  89. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_forms.scss +0 -137
  90. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_gradients.scss +0 -45
  91. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -67
  92. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid.scss +0 -52
  93. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -39
  94. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_image.scss +0 -36
  95. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_list-group.scss +0 -21
  96. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_lists.scss +0 -7
  97. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -10
  98. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_navbar-align.scss +0 -10
  99. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_pagination.scss +0 -22
  100. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_reset-text.scss +0 -17
  101. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_resize.scss +0 -6
  102. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -35
  103. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_size.scss +0 -6
  104. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -30
  105. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -14
  106. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -9
  107. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-truncate.scss +0 -8
  108. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_transition.scss +0 -9
  109. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -7
  110. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  111. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  112. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -59
  113. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_clearfix.scss +0 -3
  114. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_display.scss +0 -38
  115. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -52
  116. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -46
  117. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_float.scss +0 -9
  118. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_position.scss +0 -36
  119. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  120. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -12
  121. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -51
  122. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_text.scss +0 -52
  123. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -11
  124. data/lib/flipper/ui/assets/stylesheets/primer/.scss-lint.yml +0 -446
  125. data/lib/flipper/ui/assets/stylesheets/primer/_alerts.scss +0 -106
  126. data/lib/flipper/ui/assets/stylesheets/primer/_avatars.scss +0 -36
  127. data/lib/flipper/ui/assets/stylesheets/primer/_base.scss +0 -40
  128. data/lib/flipper/ui/assets/stylesheets/primer/_blankslate.scss +0 -96
  129. data/lib/flipper/ui/assets/stylesheets/primer/_buttons.scss +0 -404
  130. data/lib/flipper/ui/assets/stylesheets/primer/_counter.scss +0 -10
  131. data/lib/flipper/ui/assets/stylesheets/primer/_filter-list.scss +0 -68
  132. data/lib/flipper/ui/assets/stylesheets/primer/_flex-table.scss +0 -20
  133. data/lib/flipper/ui/assets/stylesheets/primer/_forms.scss +0 -756
  134. data/lib/flipper/ui/assets/stylesheets/primer/_layout.scss +0 -69
  135. data/lib/flipper/ui/assets/stylesheets/primer/_menu.scss +0 -113
  136. data/lib/flipper/ui/assets/stylesheets/primer/_mixins.scss +0 -53
  137. data/lib/flipper/ui/assets/stylesheets/primer/_normalize.scss +0 -425
  138. data/lib/flipper/ui/assets/stylesheets/primer/_states.scss +0 -32
  139. data/lib/flipper/ui/assets/stylesheets/primer/_tabnav.scss +0 -65
  140. data/lib/flipper/ui/assets/stylesheets/primer/_tooltips.scss +0 -255
  141. data/lib/flipper/ui/assets/stylesheets/primer/_truncate.scss +0 -27
  142. data/lib/flipper/ui/assets/stylesheets/primer/_type.scss +0 -92
  143. data/lib/flipper/ui/assets/stylesheets/primer/_utility.scss +0 -73
  144. data/lib/flipper/ui/assets/stylesheets/primer/_variables.scss +0 -34
  145. data/lib/flipper/ui/assets/stylesheets/primer/primer.scss +0 -39
  146. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
  147. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.svg +0 -288
  148. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
  149. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
  150. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
  151. data/lib/flipper/ui/public/images/remove.png +0 -0
  152. data/lib/flipper/ui/public/octicons/octicons.less +0 -235
  153. data/lib/flipper/ui/public/octicons/sprockets-octicons.scss +0 -232
@@ -1,6 +1,6 @@
1
- (function() {
2
- $(function() {
3
- return $('[data-toggle="tooltip"]').tooltip();
1
+ $(function() {
2
+ $(document).on('click', '.js-toggle-trigger', function() {
3
+ var $container = $(this).closest('.js-toggle-container');
4
+ return $container.toggleClass('toggle-on');
4
5
  });
5
-
6
- }).call(this);
6
+ });
@@ -8,9 +8,49 @@ module Flipper
8
8
  str.to_s !~ NON_WHITESPACE_REGEXP
9
9
  end
10
10
 
11
+ def self.present?(str)
12
+ !blank?(str)
13
+ end
14
+
11
15
  def self.titleize(str)
12
16
  str.to_s.split('_').map(&:capitalize).join(' ')
13
17
  end
18
+
19
+ def self.truncate(str, length: 30)
20
+ if str.length > length
21
+ str[0..length]
22
+ else
23
+ str
24
+ end
25
+ end
26
+
27
+ def self.pluralize(count, singular, plural)
28
+ if count == 1
29
+ "#{count} #{singular}"
30
+ else
31
+ "#{count} #{plural}"
32
+ end
33
+ end
34
+
35
+ def self.to_sentence(array, options = {})
36
+ default_connectors = {
37
+ words_connector: ", ",
38
+ two_words_connector: " and ",
39
+ last_word_connector: ", and "
40
+ }
41
+ options = default_connectors.merge!(options)
42
+
43
+ case array.length
44
+ when 0
45
+ ""
46
+ when 1
47
+ "#{array[0]}"
48
+ when 2
49
+ "#{array[0]}#{options[:two_words_connector]}#{array[1]}"
50
+ else
51
+ "#{array[0...-1].join(options[:words_connector])}#{options[:last_word_connector]}#{array[-1]}"
52
+ end
53
+ end
14
54
  end
15
55
  end
16
56
  end
@@ -14,7 +14,7 @@
14
14
  <%== csrf_input_tag %>
15
15
  <input type="hidden" name="operation" value="enable">
16
16
  <input type="text" name="value" placeholder="<%= Flipper::UI.configuration.add_actor_placeholder %>" class="form-control mr-2">
17
- <input type="submit" value="Add Actor" class="btn btn-light">
17
+ <input type="submit" value="Add Actor" class="btn btn-primary">
18
18
  </form>
19
19
  </div>
20
20
  </div>
@@ -10,7 +10,7 @@
10
10
  <form action="<%= script_name %>/features" method="post" class="form-inline mb-2">
11
11
  <%== csrf_input_tag %>
12
12
  <input type="text" name="value" size="30" placeholder="search, new_pricing, etc." autofocus class="form-control mr-2 mb-2 mb-md-0">
13
- <input type="submit" value="Add Feature" class="btn btn-light">
13
+ <input type="submit" value="Add Feature" class="btn btn-primary">
14
14
  </form>
15
15
  <p class="text-muted">
16
16
  Recommended naming conventions: lower case, <a href="https://en.wikipedia.org/wiki/Snake_case">snake case</a>, underscores over dashes.
@@ -22,7 +22,7 @@
22
22
  <option value="<%= group.name %>"><%= group.name %></option>
23
23
  <% end %>
24
24
  </select>
25
- <input type="submit" value="Add Group" class="btn btn-light">
25
+ <input type="submit" value="Add Group" class="btn btn-primary">
26
26
  </form>
27
27
  <% end %>
28
28
  </div>
@@ -4,124 +4,98 @@
4
4
  </div>
5
5
  <% end %>
6
6
 
7
- <div>
8
- <div class="row">
7
+ <% if @feature.description %>
8
+ <div class="row mb-4">
9
9
  <div class="col">
10
10
  <div class="card">
11
- <h4 class="card-header">
12
- <span class="octicon octicon-squirrel <%= @feature.color_class %>"></span>
13
- <%= @feature.key %>
14
- </h4>
15
11
  <div class="card-body">
16
- <p>
17
- <% if @feature.boolean_value %>
18
- The feature is enabled for <strong>everyone</strong>. Disable this feature with one click.
19
- <% else %>
20
- Enable or disable this feature for <strong>everyone</strong> with one click.
21
- <% end %>
22
- </p>
23
-
24
- <form action="<%= script_name %>/features/<%= @feature.key %>/boolean" method="post">
25
- <%== csrf_input_tag %>
26
-
27
- <% unless @feature.boolean_value %>
28
- <button type="submit" name="action" value="Enable" class="btn btn-danger" data-toggle="tooltip" title="Enable for everyone">Enable</button>
29
- <% end %>
30
-
31
- <button type="submit" name="action" value="Disable" class="btn btn-light" data-toggle="tooltip" <% if @feature.off? %>disabled title="Already disabled for everyone"<% else %>title="Disable for everyone by clearing all percentages, groups and actors."<% end %>>Disable</button>
32
- </form>
12
+ <%= @feature.description %>
33
13
  </div>
34
14
  </div>
35
15
  </div>
36
16
  </div>
37
- <div class="row">
38
- <div class="col-md mb-4 mb-lg-0">
39
- <div class="card">
40
- <h4 class="card-header"><%= Flipper::UI.configuration.percentage_of_actors.title %></h4>
41
- <div class="card-body">
42
- <div class="row">
43
- <div class="col">
44
- <form action="<%= script_name %>/features/<%= @feature.key %>/percentage_of_actors" method="post">
45
- <%== csrf_input_tag %>
46
- <div class="btn-group">
47
- <% @percentages.each do |number| %>
48
- <input type="submit" name="value" value="<%= number %>%" class="btn btn-light btn-sm" <% if number == @feature.percentage_of_actors_value %>disabled<% end %>>
17
+ <% end %>
18
+
19
+ <div class="row mb-4">
20
+ <div class="col">
21
+ <div class="card">
22
+ <%# Gate State Header %>
23
+ <div class="card-header">
24
+ <span class="octicon octicon-squirrel <%= @feature.color_class %> mr-2"></span>
25
+ <%= @feature.gate_state_title %>
26
+ </div>
27
+
28
+ <% unless @feature.boolean_value %>
29
+ <%# Actors Info and Form %>
30
+ <div class="card-body border-bottom">
31
+ <div class="row align-items-center js-toggle-container">
32
+ <div class="col col-mr-auto toggle-block-when-off">
33
+ <h6 class="m-0">
34
+ <strong class="<%= "text-muted" if @feature.actors_value.empty? %>">
35
+ <% if @feature.actors_value.count > 0 %>
36
+ Enabled for <%= Util.pluralize @feature.actors_value.count, 'actor', 'actors' %>
37
+ <% else %>
38
+ No actors enabled
49
39
  <% end %>
50
- </div>
51
- </form>
40
+ </strong>
41
+ </h6>
52
42
  </div>
53
- </div>
54
- <div class="row">
55
- <div class="col">
56
- <h5>- or -</h5>
43
+ <div class="col col-auto toggle-block-when-off">
44
+ <button class="btn btn-outline-secondary js-toggle-trigger" data-toggle="collapse" data-target="#add-actor">Add an actor</button>
57
45
  </div>
58
- </div>
59
- <div class="row">
60
- <div class="col">
61
- <form action="<%= script_name %>/features/<%= @feature.key %>/percentage_of_actors" method="post" class="form-inline">
46
+ <div class="col toggle-block-when-on">
47
+ <form action="<%= script_name %>/features/<%= @feature.key %>/actors" method="post" class="form-inline">
62
48
  <%== csrf_input_tag %>
63
- <input type="text" name="value" <% if @feature.percentage_of_actors_value > 0 %>value="<%= @feature.percentage_of_actors_value %>"<% end %> placeholder="custom (26, 32, etc.)" class="form-control form-control-sm mr-sm-2 mb-2 mb-md-0">
64
- <input type="submit" name="action" value="Enable" class="btn btn-light btn-sm">
49
+ <input type="hidden" name="operation" value="enable">
50
+ <input type="text" name="value" placeholder="<%= Flipper::UI.configuration.add_actor_placeholder %>" class="form-control form-control-sm mr-sm-2 mb-2 mb-sm-0">
51
+ <input type="submit" value="Add Actor" class="btn btn-sm btn-light">
65
52
  </form>
66
53
  </div>
67
- </div>
68
- <div class="row">
69
- <div class="col">
70
- <p class="text-muted"><small><%= Flipper::UI.configuration.percentage_of_actors.description %></small></p>
54
+ <div class="col col-auto toggle-block-when-on">
55
+ <button type="button" class="btn btn-outline-secondary js-toggle-trigger">Cancel</button>
71
56
  </div>
72
57
  </div>
73
58
  </div>
74
- </div>
75
- </div>
76
- <div class="col-md">
77
- <div class="card">
78
- <h4 class="card-header"><%= Flipper::UI.configuration.percentage_of_time.title %></h4>
79
- <div class="card-body">
80
- <div class="row">
81
- <div class="col">
82
- <form action="<%= script_name %>/features/<%= @feature.key %>/percentage_of_time" method="post">
83
- <%== csrf_input_tag %>
84
- <div class="btn-group">
85
- <% @percentages.each do |number| %>
86
- <input type="submit" name="value" value="<%= number %>%" class="btn btn-light btn-sm" <% if number == @feature.percentage_of_time_value %>disabled<% end %>>
87
- <% end %>
88
- </div>
89
- </form>
90
- </div>
91
- </div>
92
- <div class="row">
93
- <div class="col">
94
- <h5>- or -</h5>
95
- </div>
96
- </div>
97
- <div class="row">
98
- <div class="col">
99
- <form action="<%= script_name %>/features/<%= @feature.key %>/percentage_of_time" method="post" class="form-inline">
100
- <%== csrf_input_tag %>
101
- <input type="text" name="value" <% if @feature.percentage_of_time_value > 0 %>value="<%= @feature.percentage_of_time_value %>"<% end %> placeholder="custom (26, 32, etc.)" class="form-control form-control-sm mr-sm-2 mb-2 mb-md-0">
102
- <input type="submit" name="action" value="Enable" class="btn btn-light btn-sm">
103
- </form>
104
- </div>
105
- </div>
106
- <div class="row">
107
- <div class="col">
108
- <p class="text-muted"><small><%= Flipper::UI.configuration.percentage_of_time.description %></small></p>
59
+
60
+ <%# Actors list %>
61
+ <% @feature.actors_value.each do |item| %>
62
+ <div class="card-body bg-lightest border-bottom py-3">
63
+ <div class="row align-items-center">
64
+ <div class="col col-mr-auto pl-md-5">
65
+ <h6 class="m-0"><%= item %></h6>
66
+ </div>
67
+ <div class="col col-auto">
68
+ <form action="<%= script_name %>/features/<%= @feature.key %>/actors" method="post">
69
+ <%== csrf_input_tag %>
70
+ <input type="hidden" name="operation" value="disable">
71
+ <input type="hidden" name="value" value="<%= item %>">
72
+ <button type="submit" value="Disable" class="btn btn-link btn-sm text-danger" data-toggle="tooltip" title="Disable <%= item %>" data-placement="left">
73
+ <span class="octicon octicon-trashcan"></span>
74
+ </button>
75
+ </form>
76
+ </div>
109
77
  </div>
110
78
  </div>
111
- </div>
112
- </div>
113
- </div>
114
- </div>
79
+ <% end %>
115
80
 
116
- <div class="row">
117
- <div class="col-md mb-4 mb-md-0">
118
- <div class="card">
119
- <div class="card-header">
120
- <div class="d-flex w-100 justify-content-between align-items-center">
121
- <div>
122
- <h4><%= Flipper::UI.configuration.groups.title %></h4>
81
+ <%# Groups Info and Form %>
82
+ <div class="card-body border-bottom">
83
+ <div class="row align-items-center js-toggle-container">
84
+ <div class="col col-mr-auto toggle-block-when-off">
85
+ <h6 class="m-0">
86
+ <strong class="<%= "text-muted" if @feature.groups_value.empty? %>">
87
+ <% if @feature.groups_value.count > 0 %>
88
+ Enabled for <%= Util.pluralize @feature.groups_value.count, 'group', 'groups' %>
89
+ <% else %>
90
+ No groups enabled
91
+ <% end %>
92
+ </strong>
93
+ </h6>
94
+ </div>
95
+ <div class="col col-auto toggle-block-when-off">
96
+ <button class="btn btn-outline-secondary js-toggle-trigger" data-toggle="collapse" data-target="#add-actor">Add a group</button>
123
97
  </div>
124
- <div>
98
+ <div class="col collapse toggle-block-when-on">
125
99
  <% if @feature.disabled_groups.empty? %>
126
100
  All groups enabled.
127
101
  <% else %>
@@ -134,106 +108,152 @@
134
108
  <option value="<%= group.name %>"><%= group.name %></option>
135
109
  <% end %>
136
110
  </select>
137
- <input type="submit" value="Add Group" class="btn btn-light btn-sm">
111
+ <input type="submit" value="Add Group" class="btn btn-sm btn-light btn">
138
112
  </form>
139
113
  <% end %>
140
114
  </div>
115
+ <div class="col col-auto toggle-block-when-on">
116
+ <button type="button" class="btn btn-outline-secondary js-toggle-trigger">Cancel</button>
117
+ </div>
141
118
  </div>
142
119
  </div>
143
- <% if @feature.groups_value.empty? %>
144
- <div class="card-body bg-light">
145
- <div class="text-center">
146
- <span class="mega-octicon octicon-organization text-muted"></span>
147
- <span class="mega-octicon octicon-squirrel text-muted"></span>
148
- <span class="mega-octicon octicon-zap text-muted"></span>
149
- <h4>No Enabled Groups</h4>
150
- <p><%= Flipper::UI.configuration.groups.description %></p>
120
+
121
+ <%# Groups list %>
122
+ <% @feature.groups_value.each do |item| %>
123
+ <div class="card-body bg-lightest border-bottom py-3">
124
+ <div class="row align-items-center">
125
+ <div class="col col-mr-auto pl-md-5">
126
+ <h6 class="m-0"><%= item %></h6>
127
+ </div>
128
+ <div class="col col-auto">
129
+ <form action="<%= script_name %>/features/<%= @feature.key %>/groups" method="post">
130
+ <%== csrf_input_tag %>
131
+ <input type="hidden" name="operation" value="disable">
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>
135
+ </button>
136
+ </form>
137
+ </div>
151
138
  </div>
152
139
  </div>
153
- <% else %>
154
- <ul class="list-group list-group-flush">
155
- <% @feature.groups_value.each do |item| %>
156
- <li class="list-group-item">
157
- <div class="d-flex w-100 justify-content-between align-items-center">
158
- <div>
159
- <%= item %>
160
- </div>
161
- <div>
162
- <form action="<%= script_name %>/features/<%= @feature.key %>/groups" method="post">
163
- <%== csrf_input_tag %>
164
- <input type="hidden" name="operation" value="disable">
165
- <input type="hidden" name="value" value="<%= item %>">
166
- <button type="submit" value="Disable" class="btn btn-link btn-sm text-danger" data-toggle="tooltip" title="Disable <%= item %>" data-placement="left">
167
- <span class="octicon octicon-trashcan"></span>
168
- </button>
169
- </form>
170
- </div>
171
- </div>
172
- </li>
173
- <% end %>
174
- </ul>
175
140
  <% end %>
176
- </div>
177
- </div>
178
- <div class="col-md">
179
- <div class="card">
180
- <div class="card-header">
181
- <div class="d-flex w-100 justify-content-between align-items-center">
182
- <div>
183
- <h4><%= Flipper::UI.configuration.actors.title %></h4>
141
+
142
+ <%# % of Actors %>
143
+ <div class="js-toggle-container">
144
+ <div class="card-body border-bottom">
145
+ <div class="row align-items-center">
146
+ <div class="col col-mr-auto">
147
+ <h6 class="m-0"><strong class="<%= "text-muted" unless @feature.percentage_of_actors_value > 0 %>">Enabled for <%= @feature.percentage_of_actors_value %>% of actors</strong></h6>
148
+ </div>
149
+ <div class="col col-auto toggle-block-when-off">
150
+ <button class="btn btn-outline-secondary js-toggle-trigger">Edit</button>
151
+ </div>
152
+ <div class="col col-auto toggle-block-when-on">
153
+ <button class="btn btn-outline-secondary js-toggle-trigger">Hide</button>
154
+ </div>
184
155
  </div>
185
- <div>
186
- <form action="<%= script_name %>/features/<%= @feature.key %>/actors" method="post" class="form-inline">
187
- <%== csrf_input_tag %>
188
- <input type="hidden" name="operation" value="enable">
189
- <input type="text" name="value" placeholder="<%= Flipper::UI.configuration.add_actor_placeholder %>" class="form-control form-control-sm mr-sm-2 mb-2 mb-sm-0">
190
- <input type="submit" value="Add Actor" class="btn btn-light btn-sm">
191
- </form>
156
+ </div>
157
+
158
+ <div class="card-body border-bottom toggle-block-when-on bg-lightest">
159
+ <div class="row">
160
+ <div class="col-12 col-md-6 mb-3 mb-md-0">
161
+ <form action="<%= script_name %>/features/<%= @feature.key %>/percentage_of_actors" method="post">
162
+ <%== csrf_input_tag %>
163
+ <div class="btn-group">
164
+ <% @percentages.each do |number| %>
165
+ <input type="submit" name="value" value="<%= number %>%" class="btn btn-light btn-sm" <% if number == @feature.percentage_of_actors_value %>disabled<% end %>>
166
+ <% end %>
167
+ </div>
168
+ </form>
169
+ </div>
170
+ <div class="col-12 col-md-6">
171
+ <form action="<%= script_name %>/features/<%= @feature.key %>/percentage_of_actors" method="post" class="form-inline">
172
+ <%== csrf_input_tag %>
173
+ <input type="text" name="value" <% if @feature.percentage_of_actors_value > 0 %>value="<%= @feature.percentage_of_actors_value %>"<% end %> placeholder="custom (26, 32, etc.)" class="form-control form-control-sm mr-sm-2 mb-2 mb-md-0">
174
+ <input type="submit" name="action" value="Save" class="btn btn-light btn-sm">
175
+ </form>
176
+ </div>
192
177
  </div>
193
178
  </div>
194
179
  </div>
195
- <% if @feature.actors_value.empty? %>
196
- <div class="card-body bg-light">
197
- <div class="text-center">
198
- <span class="mega-octicon octicon-person text-muted"></span>
199
- <span class="mega-octicon octicon-squirrel text-muted"></span>
200
- <span class="mega-octicon octicon-zap text-muted"></span>
201
- <h4>No Enabled Actors</h4>
202
- <p><%= Flipper::UI.configuration.actors.description %></p>
180
+
181
+ <%# % of Time %>
182
+ <div class="js-toggle-container">
183
+ <div class="card-body border-bottom">
184
+ <div class="row align-items-center">
185
+ <div class="col col-mr-auto">
186
+ <h6 class="m-0"><strong class="<%= "text-muted" unless @feature.percentage_of_time_value > 0 %>">Enabled for <%= @feature.percentage_of_time_value %>% of time</strong></h6>
187
+ </div>
188
+ <div class="col col-auto toggle-block-when-off">
189
+ <button class="btn btn-outline-secondary js-toggle-trigger">Edit</button>
190
+ </div>
191
+ <div class="col col-auto toggle-block-when-on">
192
+ <button class="btn btn-outline-secondary js-toggle-trigger">Hide</button>
193
+ </div>
203
194
  </div>
204
195
  </div>
205
- <% else %>
206
- <ul class="list-group list-group-flush">
207
- <% @feature.actors_value.each do |item| %>
208
- <li class="list-group-item">
209
- <div class="d-flex w-100 justify-content-between align-items-center">
210
- <div>
211
- <%= item %>
212
- </div>
213
- <div>
214
- <form action="<%= script_name %>/features/<%= @feature.key %>/actors" method="post">
215
- <%== csrf_input_tag %>
216
- <input type="hidden" name="operation" value="disable">
217
- <input type="hidden" name="value" value="<%= item %>">
218
- <button type="submit" value="Disable" class="btn btn-link btn-sm text-danger" data-toggle="tooltip" title="Disable <%= item %>" data-placement="left">
219
- <span class="octicon octicon-trashcan"></span>
220
- </button>
221
- </form>
196
+
197
+ <div class="card-body border-bottom toggle-block-when-on bg-lightest">
198
+ <div class="row">
199
+ <div class="col-12 col-md-6 mb-3 mb-md-0">
200
+ <form action="<%= script_name %>/features/<%= @feature.key %>/percentage_of_time" method="post">
201
+ <%== csrf_input_tag %>
202
+ <div class="btn-group">
203
+ <% @percentages.each do |number| %>
204
+ <input type="submit" name="value" value="<%= number %>%" class="btn btn-light btn-sm" <% if number == @feature.percentage_of_time_value %>disabled<% end %>>
205
+ <% end %>
222
206
  </div>
223
- </div>
224
- </li>
207
+ </form>
208
+ </div>
209
+ <div class="col-12 col-md-6">
210
+ <form action="<%= script_name %>/features/<%= @feature.key %>/percentage_of_time" method="post" class="form-inline">
211
+ <%== csrf_input_tag %>
212
+ <input type="text" name="value" <% if @feature.percentage_of_time_value > 0 %>value="<%= @feature.percentage_of_time_value %>"<% end %> placeholder="custom (26, 32, etc.)" class="form-control form-control-sm mr-sm-2 mb-2 mb-md-0">
213
+ <input type="submit" name="action" value="Save" class="btn btn-light btn-sm">
214
+ </form>
215
+ </div>
216
+ </div>
217
+ </div>
218
+ </div>
219
+ <% end %>
220
+
221
+ <div class="card-body">
222
+ <form action="<%= script_name %>/features/<%= @feature.key %>/boolean" method="post">
223
+ <%== csrf_input_tag %>
224
+
225
+ <div class="row">
226
+ <% unless @feature.boolean_value %>
227
+ <div class="col">
228
+ <button type="submit" name="action" value="Enable" class="btn btn-outline-success btn-block">
229
+ <span class="d-block" data-toggle="tooltip" title="Enable for everyone">
230
+ Fully Enable
231
+ </span>
232
+ </button>
233
+ </div>
225
234
  <% end %>
226
- </ul>
227
- <% end %>
235
+
236
+ <% unless @feature.off? %>
237
+ <div class="col">
238
+ <button type="submit" name="action" value="Disable" class="btn btn-outline-danger btn-block">
239
+ <span class="d-block" data-toggle="tooltip" title="Disable for everyone by clearing all percentages, groups and actors.">
240
+ Disable
241
+ </span>
242
+ </button>
243
+ </div>
244
+ <% end %>
245
+ </div>
246
+ </form>
228
247
  </div>
229
248
  </div>
230
249
  </div>
250
+ </div>
231
251
 
232
- <% if Flipper::UI.configuration.feature_removal_enabled %>
252
+ <% if Flipper::UI.configuration.feature_removal_enabled %>
233
253
  <div class="row">
234
254
  <div class="col">
235
- <div class="card border-danger">
236
- <h4 class="card-header bg-danger text-white"><%= Flipper::UI.configuration.delete.title %></h4>
255
+ <div class="card border">
256
+ <h4 class="card-header"><%= Flipper::UI.configuration.delete.title %></h4>
237
257
  <div class="card-body">
238
258
  <p>
239
259
  <%= Flipper::UI.configuration.delete.description %>
@@ -242,11 +262,10 @@
242
262
  <form action="<%= script_name %>/features/<%= @feature.key %>" method="post" onsubmit="return confirm('Are you sure you want to remove this feature from the list of features and disable it for everyone?')">
243
263
  <%== csrf_input_tag %>
244
264
  <input type="hidden" name="_method" value="DELETE">
245
- <button type="submit" name="action" value="Delete" class="btn btn-danger" data-toggle="tooltip" title="Remove feature from list of features and disable it." data-placement="right">Delete</button>
265
+ <button type="submit" name="action" value="Delete" class="btn btn-outline-danger" data-toggle="tooltip" title="Remove feature from list of features and disable it." data-placement="right">Delete</button>
246
266
  </form>
247
267
  </div>
248
268
  </div>
249
269
  </div>
250
270
  </div>
251
- <% end %>
252
- </div>
271
+ <% end %>