diff --git a/.rubocop.yml b/.rubocop.yml
index 99d15bb5e7..f253edae99 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -39,3 +39,7 @@ Rails/LexicallyScopedActionFilter:
Style/OptionalBooleanParameter:
Exclude:
- 'app/workers/*.rb'
+
+Lint/MissingSuper:
+ Exclude:
+ - 'app/components/*/*.rb'
diff --git a/Gemfile b/Gemfile
index bb751e2d14..5a5b2d157d 100644
--- a/Gemfile
+++ b/Gemfile
@@ -58,6 +58,7 @@ gem "sprockets-rails"
gem "transitions", require: ["transitions", "active_record/transitions"]
gem "uglifier"
gem "validates_email_format_of"
+gem "view_component"
gem "whenever", require: false
group :development, :test do
diff --git a/Gemfile.lock b/Gemfile.lock
index d8b1379a5b..e8e8863b5a 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -717,6 +717,10 @@ GEM
validates_email_format_of (1.7.2)
i18n
version_gem (1.1.0)
+ view_component (2.71.0)
+ activesupport (>= 5.0.0, < 8.0)
+ concurrent-ruby (~> 1.0)
+ method_source (~> 1.0)
warden (1.2.9)
rack (>= 2.0.9)
warden-oauth2 (0.0.1)
@@ -828,6 +832,7 @@ DEPENDENCIES
transitions
uglifier
validates_email_format_of
+ view_component
webmock
whenever
diff --git a/app/components/admin/form_cancel_component.html.erb b/app/components/admin/form_cancel_component.html.erb
new file mode 100644
index 0000000000..bd46bf80c7
--- /dev/null
+++ b/app/components/admin/form_cancel_component.html.erb
@@ -0,0 +1 @@
+Cancel
diff --git a/app/components/admin/form_cancel_component.rb b/app/components/admin/form_cancel_component.rb
new file mode 100644
index 0000000000..8408bc715d
--- /dev/null
+++ b/app/components/admin/form_cancel_component.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+class Admin::FormCancelComponent < ViewComponent::Base
+
+ def initialize(object:)
+ @url_maker = Whitehall::UrlMaker.new(host: Plek.find("whitehall"))
+ @object = object
+ end
+
+private
+
+ def path
+ if @object.new_record?
+ case @object
+ when CorporateInformationPage
+ @url_maker.polymorphic_path([:admin, @object.owning_organisation, CorporateInformationPage])
+ when Edition
+ @url_maker.admin_editions_path
+ else
+ @url_maker.polymorphic_path([:admin, @object.class])
+ end
+ else
+ case @object
+ when CorporateInformationPage, Edition
+ @url_maker.admin_edition_path(@object)
+ else
+ @url_maker.polymorphic_path([:admin, object])
+ end
+ end
+ end
+end
diff --git a/test/components/admin/form_cancel_component_test.rb b/test/components/admin/form_cancel_component_test.rb
new file mode 100644
index 0000000000..60a4a5484b
--- /dev/null
+++ b/test/components/admin/form_cancel_component_test.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+require "test_helper"
+
+class Admin::FormCancelComponentTest < ViewComponent::TestCase
+ def test_component_renders_something_useful
+ # assert_equal(
+ # %(Hello, components!),
+ # render_inline(Admin::FormCancelComponent.new(message: "Hello, components!")).css("span").to_html
+ # )
+ end
+end