diff --git a/config/initializers/flipper.rb b/config/initializers/flipper.rb
index dd2f97ba2c..42cee7e0d6 100644
--- a/config/initializers/flipper.rb
+++ b/config/initializers/flipper.rb
@@ -1,11 +1,28 @@
require "flipper"
require "flipper/adapters/active_record"
+require "open_food_network/feature_toggle"
-if Rails.env.production?
- Flipper::UI.configure do |config|
- config.banner_text = '⚠️ Production environment: be aware that the changes have an impact on the application. Please, read the how-to before: https://github.com/openfoodfoundation/openfoodnetwork/wiki/Feature-toggle-with-Flipper'
+Flipper.register(:admins) { |actor| actor.respond_to?(:admin?) && actor.admin? }
+
+Flipper::UI.configure do |config|
+ config.descriptions_source = ->(_keys) do
+ # return has to be hash of {String key => String description}
+ OpenFoodNetwork::FeatureToggle::CURRENT_FEATURES
+ end
+
+ # Defaults to false. Set to true to show feature descriptions on the list
+ # page as well as the view page.
+ # config.show_feature_description_in_list = true
+
+ if Rails.env.production?
+ config.banner_text = <<~TEXT
+ ⚠️ Production environment: be aware that the changes have an impact on the
+ application. Please read the how-to before:
+ https://github.com/openfoodfoundation/openfoodnetwork/wiki/Feature-toggle-with-Flipper
+ TEXT
config.banner_class = 'danger'
end
end
-Flipper.register(:admins) { |actor| actor.respond_to?(:admin?) && actor.admin? }
+# Add known feature toggles. This may fail if the database isn't setup yet.
+OpenFoodNetwork::FeatureToggle.setup! rescue ActiveRecord::StatementInvalid
diff --git a/lib/open_food_network/feature_toggle.rb b/lib/open_food_network/feature_toggle.rb
index 888342fab3..e0b8e49451 100644
--- a/lib/open_food_network/feature_toggle.rb
+++ b/lib/open_food_network/feature_toggle.rb
@@ -7,10 +7,60 @@ module OpenFoodNetwork
# - http://localhost:3000/admin/feature-toggle/features
#
module FeatureToggle
+ # Please add your new feature here to appear in the Flipper UI.
+ # We way move this to a YAML file when it becomes too awkward.
+ CURRENT_FEATURES = {
+ "admin_style_v2" => <<~DESC,
+ Change some colour and layout in the backend to a newer version.
+ DESC
+ "api_reports" => <<~DESC,
+ An API endpoint for reports at
+ /api/v0/reports/:report_type(/:report_subtype)
+ DESC
+ "api_v1" => <<~DESC,
+ Enable the new API at /api/v1
+ DESC
+ "background_reports" => <<~DESC,
+ Generate reports in a background process to limit memory consumption.
+ DESC
+ "dfc_provider" => <<~DESC,
+ Enable the DFC compatible endpoint at /api/dfc-*.
+ DESC
+ "match_shipping_categories" => <<~DESC,
+ During checkout, show only shipping methods that support all
+ shipping categories. Activating this feature for an enterprise owner
+ will activate it for all shops of this enterprise.
+ DESC
+ "new_products_page" => <<~DESC,
+ Show the new (experimental) version of the admin products page.
+ DESC
+ "split_checkout" => <<~DESC,
+ Replace the one-page checkout with a multi-step checkout.
+ DESC
+ }.freeze
+
+ # Move your feature entry from CURRENT_FEATURES to RETIRED_FEATURES when
+ # you remove it from the code. It will then be deleted from the database.
+ #
+ # We may delete this field one day and regard all features not listed in
+ # CURRENT_FEATURES as unsupported and remove them. But until this approach
+ # is accepted we delete only the features listed here.
+ RETIRED_FEATURES = {}.freeze
+
+ def self.setup!
+ CURRENT_FEATURES.each_key do |name|
+ feature = Flipper.feature(name)
+ feature.add unless feature.exist?
+ end
+
+ RETIRED_FEATURES.each_key do |name|
+ feature = Flipper.feature(name)
+ feature.remove if feature.exist?
+ end
+ end
+
def self.enabled?(feature_name, user = nil)
- feature = Flipper.feature(feature_name)
- feature.add unless feature.exist?
- feature.enabled?(user)
+ Flipper.enabled?(feature_name, user)
end
def self.disabled?(feature_name, user = nil)
diff --git a/spec/lib/open_food_network/feature_toggle_spec.rb b/spec/lib/open_food_network/feature_toggle_spec.rb
index ce18fb5bba..97e41108a6 100644
--- a/spec/lib/open_food_network/feature_toggle_spec.rb
+++ b/spec/lib/open_food_network/feature_toggle_spec.rb
@@ -13,13 +13,6 @@ module OpenFoodNetwork
Flipper.enable(:foo)
expect(FeatureToggle.enabled?(:foo)).to be true
end
-
- it "adds features to the database for easy admin in the UI" do
- feature = Flipper.feature(:sparkling_new)
-
- expect { FeatureToggle.enabled?(:sparkling_new) }.
- to change { feature.exist? }.from(false).to(true)
- end
end
end
end