diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss
index 0e4d08318..daa8ffc81 100644
--- a/app/assets/stylesheets/application.scss
+++ b/app/assets/stylesheets/application.scss
@@ -28,3 +28,4 @@
@import "leaflet";
@import "sticky_overrides";
@import "admin/*";
+@import "sdg_management/*";
diff --git a/app/assets/stylesheets/sdg_management/menu.scss b/app/assets/stylesheets/sdg_management/menu.scss
new file mode 100644
index 000000000..744234610
--- /dev/null
+++ b/app/assets/stylesheets/sdg_management/menu.scss
@@ -0,0 +1,10 @@
+.sdg-content-menu {
+
+ .goals-link::before {
+ @extend %font-icon;
+ @extend %svg-icon;
+ @extend %admin-menu-icon;
+
+ mask-image: image-url("sdg.svg");
+ }
+}
diff --git a/app/components/sdg_management/goals/index_component.html.erb b/app/components/sdg_management/goals/index_component.html.erb
new file mode 100644
index 000000000..2564b8dec
--- /dev/null
+++ b/app/components/sdg_management/goals/index_component.html.erb
@@ -0,0 +1,25 @@
+<% provide(:title) do %>
+ <%= t("sdg_management.header.title") %> - <%= title %>
+<% end %>
+
+
<%= title %>
+
+
+
+
+ | <%= attribute_name(:code) %> |
+ <%= attribute_name(:title) %> |
+ <%= attribute_name(:description) %> |
+
+
+
+
+ <% goals.each do |goal| %>
+
+ | <%= goal.code %> |
+ <%= goal.title %> |
+ <%= goal.description %> |
+
+ <% end %>
+
+
diff --git a/app/components/sdg_management/goals/index_component.rb b/app/components/sdg_management/goals/index_component.rb
new file mode 100644
index 000000000..9c7517861
--- /dev/null
+++ b/app/components/sdg_management/goals/index_component.rb
@@ -0,0 +1,17 @@
+class SDGManagement::Goals::IndexComponent < ApplicationComponent
+ attr_reader :goals
+
+ def initialize(goals)
+ @goals = goals
+ end
+
+ private
+
+ def title
+ SDG::Goal.model_name.human(count: 2).titleize
+ end
+
+ def attribute_name(attribute)
+ SDG::Goal.human_attribute_name(attribute)
+ end
+end
diff --git a/app/components/sdg_management/menu_component.html.erb b/app/components/sdg_management/menu_component.html.erb
new file mode 100644
index 000000000..bd5783962
--- /dev/null
+++ b/app/components/sdg_management/menu_component.html.erb
@@ -0,0 +1,5 @@
+
diff --git a/app/components/sdg_management/menu_component.rb b/app/components/sdg_management/menu_component.rb
new file mode 100644
index 000000000..a4dfcb7a4
--- /dev/null
+++ b/app/components/sdg_management/menu_component.rb
@@ -0,0 +1,7 @@
+class SDGManagement::MenuComponent < ApplicationComponent
+ private
+
+ def sdg?
+ controller_name == "goals"
+ end
+end
diff --git a/app/controllers/sdg_management/base_controller.rb b/app/controllers/sdg_management/base_controller.rb
new file mode 100644
index 000000000..a5028f7d0
--- /dev/null
+++ b/app/controllers/sdg_management/base_controller.rb
@@ -0,0 +1,14 @@
+class SDGManagement::BaseController < ApplicationController
+ layout "admin"
+
+ before_action :authenticate_user!
+ before_action :verify_sdg_manager
+
+ skip_authorization_check
+
+ private
+
+ def verify_sdg_manager
+ raise CanCan::AccessDenied unless current_user&.administrator?
+ end
+end
diff --git a/app/controllers/sdg_management/goals_controller.rb b/app/controllers/sdg_management/goals_controller.rb
new file mode 100644
index 000000000..1eb68c6f3
--- /dev/null
+++ b/app/controllers/sdg_management/goals_controller.rb
@@ -0,0 +1,5 @@
+class SDGManagement::GoalsController < SDGManagement::BaseController
+ def index
+ @goals = SDG::Goal.order(:code)
+ end
+end
diff --git a/app/helpers/admin_helper.rb b/app/helpers/admin_helper.rb
index b531bf82a..dd5d9c6d4 100644
--- a/app/helpers/admin_helper.rb
+++ b/app/helpers/admin_helper.rb
@@ -42,6 +42,6 @@ module AdminHelper
private
def namespace
- controller.class.name.downcase.split("::").first
+ controller.class.name.split("::").first.underscore
end
end
diff --git a/app/views/layouts/admin.html.erb b/app/views/layouts/admin.html.erb
index ff29aa5d5..8c3176b12 100644
--- a/app/views/layouts/admin.html.erb
+++ b/app/views/layouts/admin.html.erb
@@ -15,6 +15,8 @@