flipper-ui 0.17.2 → 0.18.0

Sign up to get free protection for your applications and to get access to all the features.
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 %>