Skip to content

Commit

Permalink
Merge pull request #15847 from opf/bug/55651-missing-custom-action-st…
Browse files Browse the repository at this point in the history
…rategy-for-custom-fields-with-field-format-link-(url)

[#55651] Missing custom action strategy for custom fields with field format link (URL)
  • Loading branch information
aaron-contreras committed Jun 13, 2024
2 parents 8f2f00a + 294a8cb commit 1339d5e
Show file tree
Hide file tree
Showing 6 changed files with 181 additions and 0 deletions.
2 changes: 2 additions & 0 deletions app/models/custom_actions/actions/custom_field.rb
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ def self.strategy(custom_field)
CustomActions::Actions::Strategies::String
when "text"
CustomActions::Actions::Strategies::Text
when "link"
CustomActions::Actions::Strategies::Link
when "int"
CustomActions::Actions::Strategies::Integer
when "float"
Expand Down
52 changes: 52 additions & 0 deletions app/models/custom_actions/actions/strategies/link.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) 2012-2024 the OpenProject GmbH
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 3.
#
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
# Copyright (C) 2006-2013 Jean-Philippe Lang
# Copyright (C) 2010-2013 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# See COPYRIGHT and LICENSE files for more details.
#++

module CustomActions::Actions::Strategies::Link
include CustomActions::Actions::Strategies::ValuesToString

def type
:link_property
end

def validate(errors)
if values.first.present?
validate_link_value(errors, values.first)
end
super
end

private

def validate_link_value(errors, value)
strategy = CustomValue::LinkStrategy.new(CustomValue.new(custom_field:, value:))
validation_error = strategy.validate_type_of_value
if validation_error
errors.add human_name, validation_error
end
end
end
7 changes: 7 additions & 0 deletions app/views/custom_actions/_form.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,13 @@
container_class: '-slim',
step: 'any' %>
</div>
<% elsif %i(link_property).include?(action.type) %>
<div class="form--field-container">
<%= styled_url_field_tag input_name,
action.values,
container_class: '-slim',
step: 'any' %>
</div>
<% elsif action.type == :float_property %>
<div class="form--field-container">
<%= styled_number_field_tag input_name,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) 2012-2024 the OpenProject GmbH
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 3.
#
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
# Copyright (C) 2006-2013 Jean-Philippe Lang
# Copyright (C) 2010-2013 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# See COPYRIGHT and LICENSE files for more details.
#++

require "spec_helper"

RSpec.describe "Custom actions link cf value", :js, :with_cuprite, with_ee: %i[custom_actions] do
shared_let(:admin) { create(:admin) }

let(:permissions) { %i(view_work_packages edit_work_packages) }
let(:role) { create(:project_role, permissions:) }
let(:user) do
create(:user, member_with_roles: { project => role })
end
let(:type) { create(:type_task) }
let(:project) { create(:project, types: [type], name: "This project") }
let!(:custom_field) { create(:link_wp_custom_field, types: [type], projects: [project]) }
let!(:work_package) do
create(:work_package,
type:,
project:)
end

let(:wp_page) { Pages::FullWorkPackage.new(work_package) }
let(:default_priority) do
create(:default_priority, name: "Normal")
end
let(:new_ca_page) { Pages::Admin::CustomActions::New.new }

before do
login_as(admin)
end

it "can set link field value" do
new_ca_page.visit!

new_ca_page.set_name("Set Link CF")
new_ca_page.add_action(custom_field.name, "https://example.com")

new_ca_page.create

assign = CustomAction.last
expect(assign.actions.length).to eq(1)
expect(assign.conditions.length).to eq(0)
expect(assign.actions.first.values).to eq(["https://example.com"])

login_as user
wp_page.visit!

wp_page.expect_custom_action("Set Link CF")
wp_page.click_custom_action("Set Link CF")
wp_page.expect_attributes "customField#{custom_field.id}": "https://example.com"
end
end
25 changes: 25 additions & 0 deletions spec/models/custom_actions/actions/custom_field_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@
let(:string_custom_field) do
build_stubbed(:string_wp_custom_field)
end
let(:link_custom_field) do
build_stubbed(:link_wp_custom_field)
end
let(:date_custom_field) do
build_stubbed(:date_wp_custom_field)
end
Expand All @@ -77,6 +80,7 @@
float_custom_field,
text_custom_field,
string_custom_field,
link_custom_field,
date_custom_field]
end
let(:klass) do
Expand Down Expand Up @@ -164,6 +168,12 @@
it_behaves_like "string values transformation"
end

context "for a link custom field" do
let(:custom_field) { link_custom_field }

it_behaves_like "string values transformation"
end

context "for a text custom field" do
let(:custom_field) { text_custom_field }

Expand Down Expand Up @@ -219,6 +229,15 @@
end
end

context "for a link custom field" do
let(:custom_field) { link_custom_field }

it "is :link_property" do
expect(instance.type)
.to be(:link_property)
end
end

context "for a version custom field" do
let(:custom_field) { version_custom_field }

Expand Down Expand Up @@ -566,6 +585,12 @@
it_behaves_like "string custom action validations"
end

context "for a link custom field" do
let(:custom_field) { link_custom_field }

it_behaves_like "link custom action validations"
end

context "for a date custom field" do
let(:custom_field) { date_custom_field }

Expand Down
17 changes: 17 additions & 0 deletions spec/models/custom_actions/shared_expectations.rb
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,23 @@
it_behaves_like "string custom action validations"
end

RSpec.shared_examples_for "link custom action validations" do
it_behaves_like "string custom action validations"

let(:errors) do
build_stubbed(:custom_action).errors
end

it "adds an error on actions if value an invalid url" do
instance.values = ["invalid_link"]

instance.validate(errors)

expect(errors.symbols_for(instance.human_name.to_sym))
.to eql [:invalid_url]
end
end

RSpec.shared_examples_for "date custom action validations" do
describe "#validate" do
let(:errors) do
Expand Down

0 comments on commit 1339d5e

Please sign in to comment.