flipper-ui 0.17.2 → 0.18.0

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 (147) hide show
  1. checksums.yaml +4 -4
  2. data/docs/ui/README.md +15 -5
  3. data/examples/ui/basic.ru +19 -0
  4. data/flipper-ui.gemspec +1 -2
  5. data/lib/flipper/ui.rb +0 -3
  6. data/lib/flipper/ui/action.rb +2 -1
  7. data/lib/flipper/ui/actions/feature.rb +5 -2
  8. data/lib/flipper/ui/actions/features.rb +1 -0
  9. data/lib/flipper/ui/actions/file.rb +1 -1
  10. data/lib/flipper/ui/assets/javascripts/application.coffee +5 -3
  11. data/lib/flipper/ui/configuration.rb +14 -10
  12. data/lib/flipper/ui/decorators/feature.rb +39 -13
  13. data/lib/flipper/ui/public/css/application.css +20 -6493
  14. data/lib/flipper/ui/public/js/application.js +5 -5
  15. data/lib/flipper/ui/util.rb +40 -0
  16. data/lib/flipper/ui/views/add_actor.erb +1 -1
  17. data/lib/flipper/ui/views/add_feature.erb +1 -1
  18. data/lib/flipper/ui/views/add_group.erb +1 -1
  19. data/lib/flipper/ui/views/feature.erb +198 -179
  20. data/lib/flipper/ui/views/features.erb +42 -36
  21. data/lib/flipper/ui/views/layout.erb +4 -14
  22. data/lib/flipper/version.rb +1 -1
  23. data/spec/flipper/ui/actions/actors_gate_spec.rb +0 -4
  24. data/spec/flipper/ui/actions/feature_spec.rb +14 -16
  25. data/spec/flipper/ui/actions/features_spec.rb +1 -5
  26. data/spec/flipper/ui/actions/file_spec.rb +0 -10
  27. data/spec/flipper/ui/actions/groups_gate_spec.rb +0 -6
  28. data/spec/flipper/ui/actions/percentage_of_actors_gate_spec.rb +0 -2
  29. data/spec/flipper/ui/actions/percentage_of_time_gate_spec.rb +0 -2
  30. data/spec/flipper/ui/configuration_spec.rb +21 -34
  31. data/spec/flipper/ui/decorators/feature_spec.rb +0 -30
  32. metadata +5 -121
  33. data/lib/flipper/ui/assets/stylesheets/.DS_Store +0 -0
  34. data/lib/flipper/ui/assets/stylesheets/application.scss +0 -19
  35. data/lib/flipper/ui/assets/stylesheets/bootstrap/_alert.scss +0 -51
  36. data/lib/flipper/ui/assets/stylesheets/bootstrap/_badge.scss +0 -47
  37. data/lib/flipper/ui/assets/stylesheets/bootstrap/_breadcrumb.scss +0 -38
  38. data/lib/flipper/ui/assets/stylesheets/bootstrap/_button-group.scss +0 -166
  39. data/lib/flipper/ui/assets/stylesheets/bootstrap/_buttons.scss +0 -143
  40. data/lib/flipper/ui/assets/stylesheets/bootstrap/_card.scss +0 -270
  41. data/lib/flipper/ui/assets/stylesheets/bootstrap/_carousel.scss +0 -191
  42. data/lib/flipper/ui/assets/stylesheets/bootstrap/_close.scss +0 -34
  43. data/lib/flipper/ui/assets/stylesheets/bootstrap/_code.scss +0 -56
  44. data/lib/flipper/ui/assets/stylesheets/bootstrap/_custom-forms.scss +0 -297
  45. data/lib/flipper/ui/assets/stylesheets/bootstrap/_dropdown.scss +0 -131
  46. data/lib/flipper/ui/assets/stylesheets/bootstrap/_forms.scss +0 -333
  47. data/lib/flipper/ui/assets/stylesheets/bootstrap/_functions.scss +0 -86
  48. data/lib/flipper/ui/assets/stylesheets/bootstrap/_grid.scss +0 -52
  49. data/lib/flipper/ui/assets/stylesheets/bootstrap/_images.scss +0 -42
  50. data/lib/flipper/ui/assets/stylesheets/bootstrap/_input-group.scss +0 -159
  51. data/lib/flipper/ui/assets/stylesheets/bootstrap/_jumbotron.scss +0 -16
  52. data/lib/flipper/ui/assets/stylesheets/bootstrap/_list-group.scss +0 -115
  53. data/lib/flipper/ui/assets/stylesheets/bootstrap/_media.scss +0 -8
  54. data/lib/flipper/ui/assets/stylesheets/bootstrap/_mixins.scss +0 -42
  55. data/lib/flipper/ui/assets/stylesheets/bootstrap/_modal.scss +0 -168
  56. data/lib/flipper/ui/assets/stylesheets/bootstrap/_nav.scss +0 -118
  57. data/lib/flipper/ui/assets/stylesheets/bootstrap/_navbar.scss +0 -311
  58. data/lib/flipper/ui/assets/stylesheets/bootstrap/_pagination.scss +0 -77
  59. data/lib/flipper/ui/assets/stylesheets/bootstrap/_popover.scss +0 -183
  60. data/lib/flipper/ui/assets/stylesheets/bootstrap/_print.scss +0 -124
  61. data/lib/flipper/ui/assets/stylesheets/bootstrap/_progress.scss +0 -33
  62. data/lib/flipper/ui/assets/stylesheets/bootstrap/_reboot.scss +0 -482
  63. data/lib/flipper/ui/assets/stylesheets/bootstrap/_root.scss +0 -19
  64. data/lib/flipper/ui/assets/stylesheets/bootstrap/_tables.scss +0 -180
  65. data/lib/flipper/ui/assets/stylesheets/bootstrap/_tooltip.scss +0 -115
  66. data/lib/flipper/ui/assets/stylesheets/bootstrap/_transitions.scss +0 -36
  67. data/lib/flipper/ui/assets/stylesheets/bootstrap/_type.scss +0 -125
  68. data/lib/flipper/ui/assets/stylesheets/bootstrap/_utilities.scss +0 -14
  69. data/lib/flipper/ui/assets/stylesheets/bootstrap/_variables.scss +0 -894
  70. data/lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap-grid.scss +0 -32
  71. data/lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap-reboot.scss +0 -12
  72. data/lib/flipper/ui/assets/stylesheets/bootstrap/bootstrap.scss +0 -42
  73. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_alert.scss +0 -13
  74. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_background-variant.scss +0 -21
  75. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_badge.scss +0 -12
  76. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_border-radius.scss +0 -35
  77. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_box-shadow.scss +0 -5
  78. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_breakpoints.scss +0 -123
  79. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_buttons.scss +0 -109
  80. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_caret.scss +0 -65
  81. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_clearfix.scss +0 -7
  82. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_float.scss +0 -11
  83. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_forms.scss +0 -137
  84. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_gradients.scss +0 -45
  85. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid-framework.scss +0 -67
  86. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_grid.scss +0 -52
  87. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_hover.scss +0 -39
  88. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_image.scss +0 -36
  89. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_list-group.scss +0 -21
  90. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_lists.scss +0 -7
  91. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_nav-divider.scss +0 -10
  92. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_navbar-align.scss +0 -10
  93. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_pagination.scss +0 -22
  94. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_reset-text.scss +0 -17
  95. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_resize.scss +0 -6
  96. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_screen-reader.scss +0 -35
  97. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_size.scss +0 -6
  98. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_table-row.scss +0 -30
  99. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss +0 -14
  100. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-hide.scss +0 -9
  101. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_text-truncate.scss +0 -8
  102. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_transition.scss +0 -9
  103. data/lib/flipper/ui/assets/stylesheets/bootstrap/mixins/_visibility.scss +0 -7
  104. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_align.scss +0 -8
  105. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_background.scss +0 -19
  106. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_borders.scss +0 -59
  107. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_clearfix.scss +0 -3
  108. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_display.scss +0 -38
  109. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_embed.scss +0 -52
  110. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_flex.scss +0 -46
  111. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_float.scss +0 -9
  112. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_position.scss +0 -36
  113. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_screenreaders.scss +0 -11
  114. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_sizing.scss +0 -12
  115. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_spacing.scss +0 -51
  116. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_text.scss +0 -52
  117. data/lib/flipper/ui/assets/stylesheets/bootstrap/utilities/_visibility.scss +0 -11
  118. data/lib/flipper/ui/assets/stylesheets/primer/.scss-lint.yml +0 -446
  119. data/lib/flipper/ui/assets/stylesheets/primer/_alerts.scss +0 -106
  120. data/lib/flipper/ui/assets/stylesheets/primer/_avatars.scss +0 -36
  121. data/lib/flipper/ui/assets/stylesheets/primer/_base.scss +0 -40
  122. data/lib/flipper/ui/assets/stylesheets/primer/_blankslate.scss +0 -96
  123. data/lib/flipper/ui/assets/stylesheets/primer/_buttons.scss +0 -404
  124. data/lib/flipper/ui/assets/stylesheets/primer/_counter.scss +0 -10
  125. data/lib/flipper/ui/assets/stylesheets/primer/_filter-list.scss +0 -68
  126. data/lib/flipper/ui/assets/stylesheets/primer/_flex-table.scss +0 -20
  127. data/lib/flipper/ui/assets/stylesheets/primer/_forms.scss +0 -756
  128. data/lib/flipper/ui/assets/stylesheets/primer/_layout.scss +0 -69
  129. data/lib/flipper/ui/assets/stylesheets/primer/_menu.scss +0 -113
  130. data/lib/flipper/ui/assets/stylesheets/primer/_mixins.scss +0 -53
  131. data/lib/flipper/ui/assets/stylesheets/primer/_normalize.scss +0 -425
  132. data/lib/flipper/ui/assets/stylesheets/primer/_states.scss +0 -32
  133. data/lib/flipper/ui/assets/stylesheets/primer/_tabnav.scss +0 -65
  134. data/lib/flipper/ui/assets/stylesheets/primer/_tooltips.scss +0 -255
  135. data/lib/flipper/ui/assets/stylesheets/primer/_truncate.scss +0 -27
  136. data/lib/flipper/ui/assets/stylesheets/primer/_type.scss +0 -92
  137. data/lib/flipper/ui/assets/stylesheets/primer/_utility.scss +0 -73
  138. data/lib/flipper/ui/assets/stylesheets/primer/_variables.scss +0 -34
  139. data/lib/flipper/ui/assets/stylesheets/primer/primer.scss +0 -39
  140. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.eot +0 -0
  141. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.svg +0 -288
  142. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.ttf +0 -0
  143. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.woff +0 -0
  144. data/lib/flipper/ui/public/fonts/bootstrap/glyphicons-halflings-regular.woff2 +0 -0
  145. data/lib/flipper/ui/public/images/remove.png +0 -0
  146. data/lib/flipper/ui/public/octicons/octicons.less +0 -235
  147. 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 %>