diff --git a/app/assets/stylesheets/admin/menu.scss b/app/assets/stylesheets/admin/menu.scss
index 076a1f291..a3ea2801d 100644
--- a/app/assets/stylesheets/admin/menu.scss
+++ b/app/assets/stylesheets/admin/menu.scss
@@ -17,9 +17,7 @@
@include has-fa-icon($name, $style);
&::before {
- font-size: rem-calc(20);
- margin-left: rem-calc(8);
- margin-right: rem-calc(10);
+ @extend %admin-menu-icon;
}
}
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/mixins.scss b/app/assets/stylesheets/mixins.scss
index 47ab61b2e..060e31d83 100644
--- a/app/assets/stylesheets/mixins.scss
+++ b/app/assets/stylesheets/mixins.scss
@@ -141,6 +141,13 @@
}
}
+%font-icon {
+ @extend %fa-icon;
+ font-family: "Font Awesome 5 Free";
+ margin-right: rem-calc(4);
+ vertical-align: middle;
+}
+
%svg-icon {
background: currentcolor;
content: "";
@@ -150,14 +157,17 @@
width: 1em;
}
+%admin-menu-icon {
+ font-size: rem-calc(20);
+ margin-left: rem-calc(8);
+ margin-right: rem-calc(10);
+}
+
@mixin has-fa-icon($icon, $style) {
@extend .fa-#{$icon};
&::before {
- @extend %fa-icon;
- font-family: "Font Awesome 5 Free";
- margin-right: rem-calc(4);
- vertical-align: middle;
+ @extend %font-icon;
@if $style == "regular" {
font-weight: normal;
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..03d21e27d
--- /dev/null
+++ b/app/components/sdg_management/goals/index_component.html.erb
@@ -0,0 +1,21 @@
+<%= header %>
+
+
+
+
+ | <%= 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..7413be712
--- /dev/null
+++ b/app/components/sdg_management/goals/index_component.rb
@@ -0,0 +1,19 @@
+class SDGManagement::Goals::IndexComponent < ApplicationComponent
+ include SDGManagement::Header
+
+ 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/header.rb b/app/components/sdg_management/header.rb
new file mode 100644
index 000000000..0a9370031
--- /dev/null
+++ b/app/components/sdg_management/header.rb
@@ -0,0 +1,11 @@
+module SDGManagement::Header
+ extend ActiveSupport::Concern
+
+ def header
+ provide(:title) do
+ "#{t("sdg_management.header.title")} - #{title}"
+ end
+
+ tag.h2 title
+ 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/models/sdg.rb b/app/models/sdg.rb
new file mode 100644
index 000000000..67c0b0fcd
--- /dev/null
+++ b/app/models/sdg.rb
@@ -0,0 +1,5 @@
+module SDG
+ def self.table_name_prefix
+ "sdg_"
+ end
+end
diff --git a/app/models/sdg/goal.rb b/app/models/sdg/goal.rb
new file mode 100644
index 000000000..f65488ca7
--- /dev/null
+++ b/app/models/sdg/goal.rb
@@ -0,0 +1,15 @@
+class SDG::Goal < ApplicationRecord
+ validates :code, presence: true, uniqueness: true, inclusion: { in: 1..17 }
+
+ def title
+ I18n.t("sdg.goals.goal_#{code}.title")
+ end
+
+ def description
+ I18n.t("sdg.goals.goal_#{code}.description")
+ end
+
+ def self.[](code)
+ find_by!(code: code)
+ 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 @@