Rename 'source variant' to linked variant (in most places)

There are two types of linked variant associations: source and target, so we need to keep the name there.
But when cloning a variant and retaining a link as source,  we will prefer the general term 'linked variant'. Hopefully this name works well.
This commit is contained in:
David Cook
2026-03-10 16:45:24 +11:00
parent c165ade4ba
commit e9ce2df5a9
16 changed files with 74 additions and 74 deletions

View File

@@ -6,7 +6,7 @@ angular.module("ofn.admin").factory 'EnterpriseRelationships', ($http, enterpris
'manage_products'
'edit_profile'
'create_variant_overrides'
'create_sourced_variants'
'create_linked_variants'
]
constructor: ->
@@ -31,4 +31,4 @@ angular.module("ofn.admin").factory 'EnterpriseRelationships', ($http, enterpris
when "manage_products" then t('js.services.manage_products')
when "edit_profile" then t('js.services.edit_profile')
when "create_variant_overrides" then t('js.services.add_products_to_inventory')
when "create_sourced_variants" then t('js.services.create_sourced_variants')
when "create_linked_variants" then t('js.services.create_linked_variants')

View File

@@ -108,14 +108,14 @@ module Admin
end
# Clone a variant, retaining a link to the "source"
def create_sourced_variant
source_variant = Spree::Variant.find(params[:variant_id])
def create_linked_variant
linked_variant = Spree::Variant.find(params[:variant_id])
product_index = params[:product_index]
authorize! :create_sourced_variant, source_variant
authorize! :create_linked_variant, linked_variant
status = :ok
begin
variant = source_variant.create_sourced_variant(spree_current_user)
variant = linked_variant.create_linked_variant(spree_current_user)
flash.now[:success] = t('.success')
variant_index = "-#{variant.id}"
@@ -127,9 +127,9 @@ module Admin
respond_with do |format|
format.turbo_stream {
locals = { source_variant:, variant:, product_index:, variant_index:,
locals = { linked_variant:, variant:, product_index:, variant_index:,
producer_options:, category_options: categories, tax_category_options: }
render :create_sourced_variant, status:, locals:
render :create_linked_variant, status:, locals:
}
end
end

View File

@@ -50,7 +50,7 @@ module Admin
def allowed_source_producers
@allowed_source_producers ||= OpenFoodNetwork::Permissions.new(spree_current_user)
.enterprises_granting_sourced_variants
.enterprises_granting_linked_variants
end
end
end

View File

@@ -215,15 +215,15 @@ module Spree
end
# An enterprise user can clone if they have been granted permission to the source variant.
# Technically I'd call this permission clone_source_variant, but it would be less confusing to
# Technically I'd call this permission clone_linked_variant, but it would be less confusing to
# use the same name as everywhere else.
can [:create_sourced_variant], Spree::Variant do |variant|
can [:create_linked_variant], Spree::Variant do |variant|
OpenFoodNetwork::Permissions.new(user).
enterprises_granting_sourced_variants.include? variant.supplier
enterprises_granting_linked_variants.include? variant.supplier
end
can [:admin, :index, :bulk_update, :destroy, :destroy_variant, :clone,
:create_sourced_variant], :products_v3
:create_linked_variant], :products_v3
can [:create], Spree::Variant
can [:admin, :index, :read, :edit,

View File

@@ -274,10 +274,10 @@ module Spree
end
# Clone this variant, retaining a 'source' link to it
def create_sourced_variant(user)
# Owner is my enterprise which has permission to create sourced variants from that supplier
def create_linked_variant(user)
# Owner is my enterprise which has permission to create variants sourced from that supplier
owner_id = EnterpriseRelationship.permitted_by(supplier).permitting(user.enterprises)
.with_permission(:create_sourced_variants)
.with_permission(:create_linked_variants)
.pick(:child_id)
dup.tap do |variant|

View File

@@ -93,7 +93,7 @@
= link_to t('admin.products_page.actions.edit'), edit_admin_product_variant_path(variant.product, variant)
- if allowed_source_producers.include?(variant.supplier)
= link_to t('admin.products_page.actions.create_sourced_variant'), admin_create_sourced_variant_path(variant_id: variant.id, product_index:), 'data-turbo-method': :post
= link_to t('admin.products_page.actions.create_linked_variant'), admin_create_linked_variant_path(variant_id: variant.id, product_index:), 'data-turbo-method': :post
- if variant.product.variants.size > 1
%a{ "data-controller": "modal-link", "data-action": "click->modal-link#setModalDataSetOnConfirm click->modal-link#open",

View File

@@ -1,4 +1,4 @@
-# locals: (variant:, source_variant:, product_index:, variant_index:, producer_options:, category_options:, tax_category_options:)
-# locals: (variant:, linked_variant:, product_index:, variant_index:, producer_options:, category_options:, tax_category_options:)
-# Pre-render the form, because you can't do it inside turbo stream block
- variant_row = nil
- fields_for("products][#{product_index}][variants_attributes", variant, index: variant_index) do |f|
@@ -8,7 +8,7 @@
producer_options:,
category_options:,
tax_category_options:})
= turbo_stream.after dom_id(source_variant) do
= turbo_stream.after dom_id(linked_variant) do
%tr.condensed{ id: dom_id(variant), 'data-controller': "variant", 'class': "nested-form-wrapper slide-in" }
= variant_row

View File

@@ -717,7 +717,7 @@ en:
delete: Delete
remove: Remove
preview: Preview
create_sourced_variant: Create sourced variant
create_linked_variant: Create linked variant
image:
edit: Edit
variant_row:
@@ -1101,8 +1101,8 @@ en:
clone:
success: Successfully cloned the product
error: Unable to clone the product
create_sourced_variant:
success: "Successfully created sourced variant"
create_linked_variant:
success: "Successfully created linked variant"
tag_rules:
rules_per_tag:
one: "%{tag} has 1 rule"
@@ -3906,7 +3906,7 @@ en:
manage_products: "manage products"
edit_profile: "edit profile"
add_products_to_inventory: "add products to inventory"
create_sourced_variants: "create sourced variants [BETA]"
create_linked_variants: "create linked variants [BETA]"
resources:
could_not_delete_customer: 'Could not delete customer'
product_import:

View File

@@ -82,7 +82,7 @@ Openfoodnetwork::Application.routes.draw do
delete 'products_v3/:id', to: 'products_v3#destroy', as: 'product_destroy'
delete 'products_v3/destroy_variant/:id', to: 'products_v3#destroy_variant', as: 'destroy_variant'
post 'clone/:id', to: 'products_v3#clone', as: 'clone_product'
post 'products/create_sourced_variant', to: 'products_v3#create_sourced_variant', as: 'create_sourced_variant'
post 'products/create_linked_variant', to: 'products_v3#create_linked_variant', as: 'create_linked_variant'
resources :product_preview, only: [:show]
resources :variant_overrides do

View File

@@ -86,8 +86,8 @@ module OpenFoodNetwork
managed_and_related_enterprises_granting :manage_products
end
def enterprises_granting_sourced_variants
related_enterprises_granting :create_sourced_variants
def enterprises_granting_linked_variants
related_enterprises_granting :create_linked_variants
end
def manages_one_enterprise?

View File

@@ -16,4 +16,4 @@ describe "enterprise relationships", ->
expect(EnterpriseRelationships.permission_presentation("manage_products")).toEqual "manage products"
expect(EnterpriseRelationships.permission_presentation("edit_profile")).toEqual "edit profile"
expect(EnterpriseRelationships.permission_presentation("create_variant_overrides")).toEqual "add products to inventory"
expect(EnterpriseRelationships.permission_presentation("create_sourced_variants")).toEqual "create sourced variants [BETA]"
expect(EnterpriseRelationships.permission_presentation("create_linked_variants")).toEqual "create linked variants [BETA]"

View File

@@ -364,16 +364,16 @@ RSpec.describe Spree::Ability do
for: p2.variants.first)
end
describe "create_sourced_variant" do
it "should not be able to create sourced variant without permission" do
is_expected.not_to have_ability([:create_sourced_variant], for: p_related.variants.first)
describe "create_linked_variant" do
it "should not be able to create linked variant without permission" do
is_expected.not_to have_ability([:create_linked_variant], for: p_related.variants.first)
end
it "should be able to create sourced variant when granted permission" do
it "should be able to create linked variant when granted permission" do
create(:enterprise_relationship, parent: s_related, child: s1,
permissions_list: [:create_sourced_variants])
permissions_list: [:create_linked_variants])
is_expected.to have_ability([:create_sourced_variant], for: p_related.variants.first)
is_expected.to have_ability([:create_linked_variant], for: p_related.variants.first)
end
end
@@ -734,16 +734,16 @@ RSpec.describe Spree::Ability do
is_expected.to have_ability([:for_order_cycle], for: EnterpriseFee)
end
describe "create_sourced_variant" do
it "should not be able to create sourced variant without permission" do
is_expected.not_to have_ability([:create_sourced_variant], for: p_related.variants.first)
describe "create_linked_variant" do
it "should not be able to create linked variant without permission" do
is_expected.not_to have_ability([:create_linked_variant], for: p_related.variants.first)
end
it "should be able to create sourced variant when granted permission" do
it "should be able to create linked variant when granted permission" do
create(:enterprise_relationship, parent: s_related, child: d1,
permissions_list: [:create_sourced_variants])
permissions_list: [:create_linked_variants])
is_expected.to have_ability([:create_sourced_variant], for: p_related.variants.first)
is_expected.to have_ability([:create_linked_variant], for: p_related.variants.first)
end
end
end
@@ -822,16 +822,16 @@ RSpec.describe Spree::Ability do
is_expected.to have_ability([:admin, :create], for: Voucher)
end
describe "create_sourced_variant for own enterprise" do
describe "create_linked_variant for own enterprise" do
it "should not be able to create own sourced variant without permission" do
is_expected.not_to have_ability([:create_sourced_variant], for: p1.variants.first)
is_expected.not_to have_ability([:create_linked_variant], for: p1.variants.first)
end
it "should be able to create own sourced variant when granted self permission" do
create(:enterprise_relationship, parent: s1, child: s1,
permissions_list: [:create_sourced_variants])
permissions_list: [:create_linked_variants])
is_expected.to have_ability([:create_sourced_variant], for: p1.variants.first)
is_expected.to have_ability([:create_linked_variant], for: p1.variants.first)
end
end
end

View File

@@ -1006,28 +1006,28 @@ RSpec.describe Spree::Variant do
end
end
describe "#create_sourced_variant" do
describe "#create_linked_variant" do
let(:user) { create(:user, enterprises: [enterprise]) }
let(:supplier) { variant.supplier }
let(:enterprise) { create(:enterprise) }
context "with create_sourced_variants permissions on supplier" do
context "with create_linked_variants permissions on supplier" do
let!(:enterprise_relationship) {
create(:enterprise_relationship,
parent: supplier,
child: enterprise,
permissions_list: [:create_sourced_variants])
permissions_list: [:create_linked_variants])
}
let(:variant) { create(:variant, price: 10.95, on_demand: false, on_hand: 5) }
it "clones the variant, retaining a link to the source" do
sourced_variant = variant.create_sourced_variant(user)
linked_variant = variant.create_linked_variant(user)
expect(sourced_variant.source_variants).to eq [variant]
expect(sourced_variant.owner).to eq enterprise
expect(sourced_variant.price).to eq 10.95
expect(sourced_variant.on_demand).to eq false
expect(sourced_variant.on_hand).to eq 5
expect(linked_variant.source_variants).to eq [variant]
expect(linked_variant.owner).to eq enterprise
expect(linked_variant.price).to eq 10.95
expect(linked_variant.on_demand).to eq false
expect(linked_variant.on_hand).to eq 5
end
end
end

View File

@@ -60,7 +60,7 @@ RSpec.describe "Admin::ProductsV3" do
end
end
describe "POST /admin/products/create_sourced_variant" do
describe "POST /admin/products/create_linked_variant" do
let(:enterprise) { create(:supplier_enterprise) }
let(:user) { create(:user, enterprises: [enterprise]) }
@@ -75,24 +75,24 @@ RSpec.describe "Admin::ProductsV3" do
params = { variant_id: variant.id, product_index: 1 }
expect {
post(admin_create_sourced_variant_path, as: :turbo_stream, params:)
post(admin_create_linked_variant_path, as: :turbo_stream, params:)
expect(response).to redirect_to('/unauthorized')
}.not_to change { variant.product.variants.count }
end
context "With create_sourced_variants permissions on supplier" do
context "With create_linked_variants permissions on supplier" do
let!(:enterprise_relationship) {
create(:enterprise_relationship,
parent: supplier,
child: enterprise,
permissions_list: [:create_sourced_variants])
permissions_list: [:create_linked_variants])
}
it "clones the variant, retaining link as source" do
params = { variant_id: variant.id, product_index: 1 }
expect {
post(admin_create_sourced_variant_path, as: :turbo_stream, params:)
post(admin_create_linked_variant_path, as: :turbo_stream, params:)
expect(response).to have_http_status(:ok)
expect(response.body).to match "Original variant" # cloned variant name
@@ -114,7 +114,7 @@ RSpec.describe "Admin::ProductsV3" do
params = { variant_id: variant.id, product_index: 1 }
expect {
post(admin_create_sourced_variant_path, as: :turbo_stream, params:)
post(admin_create_linked_variant_path, as: :turbo_stream, params:)
expect(response).to have_http_status(:ok)
}.to change { variant.product.variants.count }.by(1)

View File

@@ -47,7 +47,7 @@ create(:enterprise)
uncheck 'to manage products'
check 'to edit profile'
check 'to add products to inventory'
check 'to create sourced variants'
check 'to create linked variants'
select2_select 'Two', from: 'enterprise_relationship_child_id'
click_button 'Create'
@@ -56,14 +56,14 @@ create(:enterprise)
# Permissions appear.. in a different order for some reason.
expect_relationship_with_permissions e1, e2,
['to add to order cycle',
'to create sourced variants [BETA]',
'to create linked variants [BETA]',
'to add products to inventory',
'to edit profile']
er = EnterpriseRelationship.where(parent_id: e1, child_id: e2).first
expect(er).to be_present
expect(er.permissions.map(&:name)).to match_array ['add_to_order_cycle', 'edit_profile',
'create_variant_overrides',
'create_sourced_variants']
'create_linked_variants']
end
it "attempting to create a relationship with invalid data" do

View File

@@ -272,7 +272,7 @@ RSpec.describe 'As an enterprise user, I can perform actions on the products scr
end
end
describe "Create sourced variant" do
describe "Create linked variant" do
let!(:variant) {
create(:variant, display_name: "My box", supplier: producer)
}
@@ -286,11 +286,11 @@ RSpec.describe 'As an enterprise user, I can perform actions on the products scr
permissions_list: [:manage_products])
}
context "with create_sourced_variants permission for my, and other's variants" do
it "creates a sourced variant" do
context "with create_linked_variants permission for my, and other's variants" do
it "creates a linked variant" do
create(:enterprise_relationship, parent: producer, child: producer,
permissions_list: [:create_sourced_variants])
enterprise_relationship.permissions.create! name: :create_sourced_variants
permissions_list: [:create_linked_variants])
enterprise_relationship.permissions.create! name: :create_linked_variants
visit admin_products_url
@@ -298,39 +298,39 @@ RSpec.describe 'As an enterprise user, I can perform actions on the products scr
within row_containing_name("My box") do
page.find(".vertical-ellipsis-menu").click
expect(page).to have_link "Create sourced variant"
expect(page).to have_link "Create linked variant"
end
# Create variant sourced from my friend
# Create linked variant sourced from my friend
within row_containing_name("My friends box") do
page.find(".vertical-ellipsis-menu").click
click_link "Create sourced variant"
click_link "Create linked variant"
end
expect(page).to have_content "Successfully created sourced variant"
expect(page).to have_content "Successfully created linked variant"
within "table.products" do
# There are now two copies
expect(all_input_values).to match /My friends box.*My friends box/
# One of them is designated as a source variant
# One of them is designated as a linked variant
expect(page).to have_content "🔗"
end
end
end
context "without create_sourced_variants permission" do
context "without create_linked_variants permission" do
it "does not show the option in the menu" do
visit admin_products_url
within row_containing_name("My box") do
page.find(".vertical-ellipsis-menu").click
expect(page).not_to have_link "Create sourced variant"
expect(page).not_to have_link "Create linked variant"
end
within row_containing_name("My friends box") do
page.find(".vertical-ellipsis-menu").click
expect(page).not_to have_link "Create sourced variant"
expect(page).not_to have_link "Create linked variant"
end
end
end