Consistent naming of upsell, not upsale

This commit is contained in:
Oliver Günther
2025-04-24 11:57:56 +02:00
parent c78a0ec6ae
commit e27ac494d3
109 changed files with 288 additions and 288 deletions
+1 -1
View File
@@ -28,5 +28,5 @@
@import "work_package_relations_tab/relation_component"
@import "users/hover_card_component"
@import "enterprise_edition/banner_component"
@import "enterprise_edition/upsale_page_component"
@import "enterprise_edition/upsell_page_component"
@import "work_packages/types/pattern_input"
@@ -17,7 +17,7 @@
title_flex.with_column do
render(Primer::Beta::Octicon.new(icon: :"op-enterprise-addons",
size: :medium,
classes: "upsale-colored"))
classes: "upsell-colored"))
end
title_flex.with_column(ml: 2) do
@@ -42,7 +42,7 @@
end
flex.with_row(mt: 2) do
render EnterpriseEdition::UpsaleButtonsComponent.new(feature_key)
render EnterpriseEdition::UpsellButtonsComponent.new(feature_key)
end
end
end
@@ -65,7 +65,7 @@
href: dismiss_enterprise_banner_path(feature_key: @dismiss_key),
data: { turbo_stream: true, turbo_method: :post },
icon: :x,
aria: { label: t("ee.upsale.hide_banner") }
aria: { label: t("ee.upsell.hide_banner") }
)
)
end
@@ -47,7 +47,7 @@ module EnterpriseEdition
# @param image [String, NilClass] Path to the image to show on the banner, or nil.
# Required when variant is :medium.
# @param i18n_scope [String] Provide the i18n scope to look for title, description, and features.
# Defaults to "ee.upsale.{feature_key}"
# Defaults to "ee.upsell.{feature_key}"
# @param dismissable [boolean] Allow this banner to be dismissed.
# @param show_always [boolean] Always show the banner, regardless of the dismissed or feature state.
# @param dismiss_key [String] Provide a string to identify this banner when being dismissed. Defaults to feature_key
@@ -55,7 +55,7 @@ module EnterpriseEdition
def initialize(feature_key, # rubocop:disable Metrics/AbcSize
variant: DEFAULT_VARIANT,
image: nil,
i18n_scope: "ee.upsale.#{feature_key}",
i18n_scope: "ee.upsell.#{feature_key}",
dismissable: false,
show_always: false,
dismiss_key: feature_key,
@@ -71,12 +71,12 @@
padding: var(--base-size-6) var(--base-size-8)
&--icon
color: var(--enterprise-upsale-color)
color: var(--enterprise-upsell-color)
margin-block: var(--base-size-2)
&--close-icon
.Button-visual
color: var(--enterprise-upsale-color)
color: var(--enterprise-upsell-color)
&_hovering
position: absolute
@@ -74,11 +74,11 @@ module EnterpriseEdition
end
def plan_text
plan_name = render(Primer::Beta::Text.new(font_weight: :bold, classes: "upsale-colored")) do
I18n.t("ee.upsale.plan_name", plan:)
plan_name = render(Primer::Beta::Text.new(font_weight: :bold, classes: "upsell-colored")) do
I18n.t("ee.upsell.plan_name", plan:)
end
I18n.t("ee.upsale.plan_text_html", plan_name:).html_safe
I18n.t("ee.upsell.plan_text_html", plan_name:).html_safe
end
end
end
@@ -29,7 +29,7 @@
# ++
module EnterpriseEdition
class UpsaleButtonsComponent < ApplicationComponent
class UpsellButtonsComponent < ApplicationComponent
include OpPrimer::ComponentHelpers
# @param feature_key [Symbol, NilClass] The key of the feature to show the banner for.
@@ -84,7 +84,7 @@ module EnterpriseEdition
end
def link_title
I18n.t("ee.upsale.#{feature_key}.link_title", default: I18n.t(:label_more_information))
I18n.t("ee.upsell.#{feature_key}.link_title", default: I18n.t(:label_more_information))
end
def enterprise_link
@@ -3,13 +3,13 @@
<% helpers.write_trial_key_to_gon if !EnterpriseToken.current.present? %>
<% end %>
<div class="op-enterprise-upsale-page" data-test-selector="op-enterprise-upsale-page">
<div class="op-enterprise-upsell-page" data-test-selector="op-enterprise-upsell-page">
<%=
render(Primer::OpenProject::FlexLayout.new(justify_content: :center, align_items: :center)) do |flex|
flex.with_column do
render(Primer::Beta::Octicon.new(icon: :"op-enterprise-addons",
size: :medium,
classes: "upsale-colored"))
classes: "upsell-colored"))
end
flex.with_column(ml: 2) do
@@ -18,7 +18,7 @@
end
%>
<p class="upsale--feature-reference">
<p class="upsell--feature-reference">
<%= render(Primer::Beta::Text.new) { description } %>
<%= render(Primer::Beta::Text.new) { plan_text } %>
</p>
@@ -42,5 +42,5 @@
<%= image_tag "enterprise-add-on.svg", class: "widget-box--teaser-image widget-box--teaser-image_default" %>
<% end %>
<%= render EnterpriseEdition::UpsaleButtonsComponent.new(feature_key, justify_content: :center) %>
<%= render EnterpriseEdition::UpsellButtonsComponent.new(feature_key, justify_content: :center) %>
</div>
@@ -30,16 +30,16 @@
module EnterpriseEdition
# A full page banner for the enterprise edition
class UpsalePageComponent < ApplicationComponent
class UpsellPageComponent < ApplicationComponent
include OpPrimer::ComponentHelpers
include PlanForFeature
# @param feature_key [Symbol, NilClass] The key of the feature to show the upsale page for.
# @param feature_key [Symbol, NilClass] The key of the feature to show the upsell page for.
# @param i18n_scope [String] Provide the i18n scope to look for title, description, and features.
# Defaults to "ee.upsale.{feature_key}"
# @param image [String, NilClass] Path to the image to show on the upsale page, or nil.
# @param video [String, NilClass] Path to the video to show on the upsale page, or nil.
def initialize(feature_key, i18n_scope: "ee.upsale.#{feature_key}", image: nil, video: nil)
# Defaults to "ee.upsell.{feature_key}"
# @param image [String, NilClass] Path to the image to show on the upsell page, or nil.
# @param video [String, NilClass] Path to the video to show on the upsell page, or nil.
def initialize(feature_key, i18n_scope: "ee.upsell.#{feature_key}", image: nil, video: nil)
super
self.feature_key = feature_key
@@ -27,7 +27,7 @@
/ See COPYRIGHT and LICENSE files for more details.
/ ++
/
.op-enterprise-upsale-page
.op-enterprise-upsell-page
max-width: 50vw
margin: auto
padding-top: 20px
@@ -42,7 +42,7 @@
<%= menu_item.title %>
<% if menu_item.show_enterprise_icon %>
<%= render Primer::Beta::Octicon.new(icon: "op-enterprise-addons", "aria-label": I18n.t(:label_enterprise_edition), classes: "upsale-colored", ml: 2) %>
<%= render Primer::Beta::Octicon.new(icon: "op-enterprise-addons", "aria-label": I18n.t(:label_enterprise_edition), classes: "upsell-colored", ml: 2) %>
<% end %>
</span>
@@ -82,7 +82,7 @@
<%= child_item.title %>
<% if child_item.show_enterprise_icon %>
<%= render Primer::Beta::Octicon.new(icon: "op-enterprise-addons", "aria-label": I18n.t(:label_enterprise_edition), classes: "upsale-colored", ml: 2) %>
<%= render Primer::Beta::Octicon.new(icon: "op-enterprise-addons", "aria-label": I18n.t(:label_enterprise_edition), classes: "upsell-colored", ml: 2) %>
<% end %>
<% if child_item.favored %>
@@ -62,7 +62,7 @@ module Settings
def activity_title
label = t("label_activity").html_safe
unless EnterpriseToken.allows_to?(:internal_comments)
label << render(Primer::Beta::Octicon.new(icon: "op-enterprise-addons", classes: "upsale-colored", ml: 2))
label << render(Primer::Beta::Octicon.new(icon: "op-enterprise-addons", classes: "upsell-colored", ml: 2))
end
label
end
@@ -1,10 +1,10 @@
<%=
modal_content.with_row(data: { "test-selector": "op-share-dialog-upsale-block" }) do
render Primer::OpenProject::FeedbackMessage.new(icon_arguments: { icon: :"op-enterprise-addons", classes: "upsale-colored" }, border: true) do |component|
component.with_heading(tag: :h2, classes: "upsale-colored").with_content(I18n.t(:"ee.upsale.title"))
component.with_description { I18n.t("sharing.project_queries.upsale.message") }
modal_content.with_row(data: { "test-selector": "op-share-dialog-upsell-block" }) do
render Primer::OpenProject::FeedbackMessage.new(icon_arguments: { icon: :"op-enterprise-addons", classes: "upsell-colored" }, border: true) do |component|
component.with_heading(tag: :h2, classes: "upsell-colored").with_content(I18n.t(:"ee.upsell.title"))
component.with_description { I18n.t("sharing.project_queries.upsell.message") }
href = "#{OpenProject::Static::Links.links[:upsale][:href]}/?utm_source=unknown&utm_medium=community-edition&utm_campaign=project-list-sharing-modal"
href = "#{OpenProject::Static::Links.links[:upsell][:href]}/?utm_source=unknown&utm_medium=community-edition&utm_campaign=project-list-sharing-modal"
component.with_secondary_action(href:) do |link|
link.with_trailing_visual_icon(icon: "link-external")
I18n.t("admin.enterprise.enterprise_link")
@@ -28,7 +28,7 @@
module Shares
module ProjectQueries
class UpsaleComponent < ApplicationComponent # rubocop:disable OpenProject/AddPreviewForViewComponent
class UpsellComponent < ApplicationComponent # rubocop:disable OpenProject/AddPreviewForViewComponent
include OpPrimer::ComponentHelpers
def initialize(modal_content:)
@@ -1,10 +1,10 @@
<%=
component_wrapper(tag: "turbo-frame") do
render Primer::OpenProject::FeedbackMessage.new(icon_arguments: { icon: :"op-enterprise-addons", classes: "upsale-colored" }, border: true) do |component|
component.with_heading(tag: :h2, classes: "upsale-colored").with_content(I18n.t(:"ee.upsale.title"))
render Primer::OpenProject::FeedbackMessage.new(icon_arguments: { icon: :"op-enterprise-addons", classes: "upsell-colored" }, border: true) do |component|
component.with_heading(tag: :h2, classes: "upsell-colored").with_content(I18n.t(:"ee.upsell.title"))
component.with_description { I18n.t("mail.sharing.work_packages.enterprise_text") }
href = "#{OpenProject::Static::Links.links[:upsale][:href]}/?utm_source=unknown&utm_medium=community-edition&utm_campaign=work-package-sharing-modal"
href = "#{OpenProject::Static::Links.links[:upsell][:href]}/?utm_source=unknown&utm_medium=community-edition&utm_campaign=work-package-sharing-modal"
component.with_secondary_action(href:) do |link|
link.with_trailing_visual_icon(icon: "link-external")
I18n.t("admin.enterprise.enterprise_link")
@@ -28,7 +28,7 @@
module Shares
module WorkPackages
class ModalUpsaleComponent < ApplicationComponent # rubocop:disable OpenProject/AddPreviewForViewComponent
class ModalUpsellComponent < ApplicationComponent # rubocop:disable OpenProject/AddPreviewForViewComponent
include ApplicationHelper
include OpTurbo::Streamable
include OpPrimer::ComponentHelpers
@@ -39,7 +39,7 @@ See COPYRIGHT and LICENSE files for more details.
feature = tab[:enterprise_feature]
if feature && !EnterpriseToken.allows_to?(feature)
t.with_icon(icon: :"op-enterprise-addons", classes: "upsale-colored")
t.with_icon(icon: :"op-enterprise-addons", classes: "upsell-colored")
end
t.with_text { I18n.t(tab[:label]) }
end
@@ -44,7 +44,7 @@ module WorkPackages
render(Primer::Beta::Octicon.new(
icon: "op-enterprise-addons",
"aria-label": I18n.t(:label_enterprise_edition),
classes: "upsale-colored", ml: 2
classes: "upsell-colored", ml: 2
))
end
+1 -1
View File
@@ -86,7 +86,7 @@ class CustomActionsController < ApplicationController
return if EnterpriseToken.allows_to?(:custom_actions)
if request.get?
render template: "custom_actions/upsale"
render template: "custom_actions/upsell"
else
render_403
end
+3 -3
View File
@@ -39,7 +39,7 @@ class CustomStylesController < ApplicationController
before_action :require_admin,
except: UNGUARDED_ACTIONS
before_action :require_ee_token,
except: UNGUARDED_ACTIONS + %i[upsale]
except: UNGUARDED_ACTIONS + %i[upsell]
skip_before_action :check_if_login_required,
only: UNGUARDED_ACTIONS
no_authorization_required! *UNGUARDED_ACTIONS
@@ -58,7 +58,7 @@ class CustomStylesController < ApplicationController
end
end
def upsale; end
def upsell; end
def create
@custom_style = CustomStyle.create(custom_style_params)
@@ -180,7 +180,7 @@ class CustomStylesController < ApplicationController
def require_ee_token
unless EnterpriseToken.allows_to?(:define_custom_style)
redirect_to custom_style_upsale_path
redirect_to custom_style_upsell_path
end
end
+3 -3
View File
@@ -31,7 +31,7 @@ class NotificationsController < ApplicationController
before_action :require_login
before_action :filtered_query, only: :mark_all_read
no_authorization_required! :index, :split_view, :update_counter, :mark_all_read, :date_alerts, :share_upsale
no_authorization_required! :index, :split_view, :update_counter, :mark_all_read, :date_alerts, :share_upsell
before_action :check_filter, only: %i[index]
@@ -65,7 +65,7 @@ class NotificationsController < ApplicationController
render_notifications_layout
end
def share_upsale
def share_upsell
render_notifications_layout
end
@@ -98,7 +98,7 @@ class NotificationsController < ApplicationController
return if EnterpriseToken.allows_to?(:date_alerts)
if params[:filter] == "reason" && params[:name] == "dateAlert"
redirect_to notifications_date_alert_upsale_path
redirect_to notifications_date_alert_upsell_path
end
end
end
+3 -3
View File
@@ -42,7 +42,7 @@ class WorkPackagesController < ApplicationController
:check_allowed_export,
:protect_from_unauthorized_export, only: %i[index export_dialog]
before_action :authorize, only: %i[show_conflict_flash_message share_upsale]
before_action :authorize, only: %i[show_conflict_flash_message share_upsell]
authorization_checked! :index, :show, :export_dialog, :generate_pdf_dialog, :generate_pdf
before_action :load_and_validate_query, only: :index, unless: -> { request.format.html? }
@@ -128,8 +128,8 @@ class WorkPackagesController < ApplicationController
respond_with_turbo_streams
end
def share_upsale
render :share_upsale,
def share_upsell
render :share_upsell,
locals: { menu_name: project_or_global_menu }
end
+1 -1
View File
@@ -148,7 +148,7 @@ module CustomFieldsHelper
label = format.label.is_a?(Proc) ? format.label.call : I18n.t(format.label)
show_enterprise_text = format_string == "hierarchy" && !EnterpriseToken.allows_to?(:custom_field_hierarchies)
suffix = show_enterprise_text ? " (#{I18n.t(:"ee.upsale.title")})" : ""
suffix = show_enterprise_text ? " (#{I18n.t(:"ee.upsell.title")})" : ""
"#{label}#{suffix}"
end
+2 -2
View File
@@ -113,9 +113,9 @@ module Notifications
def query_path(query_params)
if query_params[:name] == "shared" && show_enterprise_icon?("shared")
return notifications_share_upsale_path(query_params)
return notifications_share_upsell_path(query_params)
elsif query_params[:name] == "dateAlert" && show_enterprise_icon?("dateAlert")
return notifications_date_alert_upsale_path(query_params)
return notifications_date_alert_upsell_path(query_params)
end
notifications_center_path(query_params)
+3 -3
View File
@@ -51,7 +51,7 @@ module WorkPackages
def query_path(query_params)
if query_params[:show_enterprise_icon].present?
return ee_upsale_path(query_params)
return ee_upsell_path(query_params)
end
if project.present?
@@ -76,8 +76,8 @@ module WorkPackages
params[:on_work_package_path] == "true"
end
def ee_upsale_path(query_params)
share_upsale_work_packages_path({ name: query_params[:name] })
def ee_upsell_path(query_params)
share_upsell_work_packages_path({ name: query_params[:name] })
end
def check_for_redirected_urls(query_params)
@@ -109,7 +109,7 @@ module SharingStrategies
if EnterpriseToken.allows_to?(:project_list_sharing)
super
else
Shares::ProjectQueries::UpsaleComponent.new(modal_content:)
Shares::ProjectQueries::UpsellComponent.new(modal_content:)
end
end
@@ -103,7 +103,7 @@ module SharingStrategies
if EnterpriseToken.allows_to?(:work_package_sharing)
super
else
Shares::WorkPackages::ModalUpsaleComponent.new
Shares::WorkPackages::ModalUpsellComponent.new
end
end
@@ -27,10 +27,10 @@ See COPYRIGHT and LICENSE files for more details.
++#%>
<% html_title t(:label_administration), t("ee.upsale.custom_actions.title") %>
<% html_title t(:label_administration), t("ee.upsell.custom_actions.title") %>
<%=
render EnterpriseEdition::UpsalePageComponent.new(
render EnterpriseEdition::UpsellPageComponent.new(
:custom_actions,
video: "enterprise/custom-actions.mp4"
)
@@ -29,7 +29,7 @@ See COPYRIGHT and LICENSE files for more details.
<% html_title t(:label_administration), t(:label_custom_style) %>
<%= render EnterpriseEdition::UpsalePageComponent.new(
<%= render EnterpriseEdition::UpsellPageComponent.new(
:define_custom_style,
video: "enterprise/custom-design.mp4"
) %>
+2 -2
View File
@@ -4,9 +4,9 @@
data-company="<%= @current_token.try(:company) %>"
data-domain="<%= @current_token.try(:domain) %>"
data-plan="<%= enterprise_token_plan_name(@current_token) %>"
data-user-count="<%= @current_token.restrictions.nil? ? t("js.admin.enterprise.upsale.unlimited") : @current_token.restrictions[:active_user_count] %>"
data-user-count="<%= @current_token.restrictions.nil? ? t("js.admin.enterprise.upsell.unlimited") : @current_token.restrictions[:active_user_count] %>"
data-starts-at="<%= format_date @current_token.starts_at %>"
data-expires-at="<%= @current_token.will_expire? ? (format_date @current_token.expires_at) : t("js.admin.enterprise.upsale.unlimited") %>"
data-expires-at="<%= @current_token.will_expire? ? (format_date @current_token.expires_at) : t("js.admin.enterprise.upsell.unlimited") %>"
data-is-expired="<%= @current_token.expired?(reprieve: false) %>"
data-additional-features="<%= enterprise_plan_additional_features(@current_token) %>"
data-reprieve-days-left="<%= @current_token.reprieve_days_left %>">
+26 -26
View File
@@ -31,12 +31,12 @@ See COPYRIGHT and LICENSE files for more details.
"data-cb-site": OpenProject::Configuration.enterprise_chargebee_site %>
<% end %>
<div class="upsale--information-container">
<div class='upsale-information'>
<div class="upsell--information-container">
<div class='upsell-information'>
<opce-enterprise-base></opce-enterprise-base>
</div>
<div class='upsale-actions'>
<div class='upsell-actions'>
<a href="#"
class="button -highlight-inverted"
data-cb-type="checkout"
@@ -44,7 +44,7 @@ See COPYRIGHT and LICENSE files for more details.
<%= t("admin.enterprise.book_now") %>
</a>
<% quote_link = OpenProject::Static::Links.links.fetch :upsale_get_quote %>
<% quote_link = OpenProject::Static::Links.links.fetch :upsell_get_quote %>
<%= link_to t(quote_link[:label]),
quote_link[:href],
target: "_blank",
@@ -54,21 +54,21 @@ See COPYRIGHT and LICENSE files for more details.
<%= static_link_to :contact %>
</div>
<div class="info-boxes upsale-benefits">
<h3 class="info-boxes--title -no-border"><%= t("js.admin.enterprise.upsale.benefits.description") %></h3>
<div class="info-boxes upsell-benefits">
<h3 class="info-boxes--title -no-border"><%= t("js.admin.enterprise.upsell.benefits.description") %></h3>
<div class="info-boxes--container">
<div class="info-boxes--item">
<%= image_tag "installation_alerts.svg",
class: "info-boxes--teaser-image",
title: t("js.admin.enterprise.upsale.benefits.installation"),
alt: t("js.admin.enterprise.upsale.benefits.installation") %>
<h4 class="info-boxes--item-title"><%= t("js.admin.enterprise.upsale.benefits.installation") %></h4>
title: t("js.admin.enterprise.upsell.benefits.installation"),
alt: t("js.admin.enterprise.upsell.benefits.installation") %>
<h4 class="info-boxes--item-title"><%= t("js.admin.enterprise.upsell.benefits.installation") %></h4>
<div class="info-boxes--item-content">
<p><%= t("js.admin.enterprise.upsale.benefits.installation_text") %></p>
<p><%= t("js.admin.enterprise.upsell.benefits.installation_text") %></p>
<ul class="widget-box--arrow-links">
<li>
<%= static_link_to :upsale_benefits_installation %>
<%= static_link_to :upsell_benefits_installation %>
</li>
</ul>
</div>
@@ -76,14 +76,14 @@ See COPYRIGHT and LICENSE files for more details.
<div class="info-boxes--item">
<%= image_tag "professional_support.svg",
class: "info-boxes--teaser-image",
title: t("js.admin.enterprise.upsale.benefits.professional_support"),
alt: t("js.admin.enterprise.upsale.benefits.professional_support") %>
<h4 class="info-boxes--item-title"><%= t("js.admin.enterprise.upsale.benefits.professional_support") %></h4>
title: t("js.admin.enterprise.upsell.benefits.professional_support"),
alt: t("js.admin.enterprise.upsell.benefits.professional_support") %>
<h4 class="info-boxes--item-title"><%= t("js.admin.enterprise.upsell.benefits.professional_support") %></h4>
<div class="info-boxes--item-content">
<p><%= t("js.admin.enterprise.upsale.benefits.professional_support_text") %></p>
<p><%= t("js.admin.enterprise.upsell.benefits.professional_support_text") %></p>
<ul class="widget-box--arrow-links">
<li>
<%= static_link_to :upsale_benefits_support %>
<%= static_link_to :upsell_benefits_support %>
</li>
</ul>
</div>
@@ -91,14 +91,14 @@ See COPYRIGHT and LICENSE files for more details.
<div class="info-boxes--item">
<%= image_tag "enterprise-add-on.svg",
class: "info-boxes--teaser-image",
title: t("js.admin.enterprise.upsale.benefits.premium_features"),
alt: t("js.admin.enterprise.upsale.benefits.premium_features") %>
<h4 class="info-boxes--item-title"><%= t("js.admin.enterprise.upsale.benefits.premium_features") %></h4>
title: t("js.admin.enterprise.upsell.benefits.premium_features"),
alt: t("js.admin.enterprise.upsell.benefits.premium_features") %>
<h4 class="info-boxes--item-title"><%= t("js.admin.enterprise.upsell.benefits.premium_features") %></h4>
<div class="info-boxes--item-content">
<p><%= t("js.admin.enterprise.upsale.benefits.premium_features_text") %></p>
<p><%= t("js.admin.enterprise.upsell.benefits.premium_features_text") %></p>
<ul class="widget-box--arrow-links">
<li>
<%= static_link_to :upsale_benefits_features %>
<%= static_link_to :upsell_benefits_features %>
</li>
</ul>
</div>
@@ -106,14 +106,14 @@ See COPYRIGHT and LICENSE files for more details.
<div class="info-boxes--item">
<%= image_tag "security_alerts.svg",
class: "info-boxes--teaser-image",
title: t("js.admin.enterprise.upsale.benefits.high_security"),
alt: t("js.admin.enterprise.upsale.benefits.high_security") %>
<h4 class="info-boxes--item-title"><%= t("js.admin.enterprise.upsale.benefits.high_security") %></h4>
title: t("js.admin.enterprise.upsell.benefits.high_security"),
alt: t("js.admin.enterprise.upsell.benefits.high_security") %>
<h4 class="info-boxes--item-title"><%= t("js.admin.enterprise.upsell.benefits.high_security") %></h4>
<div class="info-boxes--item-content">
<p><%= t("js.admin.enterprise.upsale.benefits.high_security_text") %></p>
<p><%= t("js.admin.enterprise.upsell.benefits.high_security_text") %></p>
<ul class="widget-box--arrow-links">
<li>
<%= static_link_to :upsale_benefits_security %>
<%= static_link_to :upsell_benefits_security %>
</li>
</ul>
</div>
@@ -1,27 +1,27 @@
<div class="widget-box--description">
<%= image_tag "enterprise-add-on.svg", role: "presentation", class: "widget-box--blocks--upsale-image" %>
<div class="widget-box--blocks--upsale-text">
<div class="widget-box--blocks--upsale-title">
<%= image_tag "enterprise-add-on.svg", role: "presentation", class: "widget-box--blocks--upsell-image" %>
<div class="widget-box--blocks--upsell-text">
<div class="widget-box--blocks--upsell-title">
<%= spot_icon("enterprise-addons") %>
<span><%= t("homescreen.blocks.upsale.title") %></span>
<span><%= t("homescreen.blocks.upsell.title") %></span>
</div>
<p class="widget-box--blocks--upsale-description">
<%= t("js.admin.enterprise.upsale.text") %>
<p class="widget-box--blocks--upsell-description">
<%= t("js.admin.enterprise.upsell.text") %>
</p>
<p>
<b><%= t("js.admin.enterprise.upsale.become_hero") %></b> <%= t("js.admin.enterprise.upsale.you_contribute") %>
<b><%= t("js.admin.enterprise.upsell.become_hero") %></b> <%= t("js.admin.enterprise.upsell.you_contribute") %>
</p>
<p>
<b><%= t("js.admin.enterprise.upsale.confidence") %></b>
<b><%= t("js.admin.enterprise.upsell.confidence") %></b>
</p>
</div>
</div>
<div class="widget-box--blocks--upsale-buttons">
<%= link_to "#{OpenProject::Static::Links.links[:upsale][:href]}/?utm_source=unknown&utm_medium=community-edition&utm_campaign=home-screen",
class: "button--link widget-box--blocks--upsale-info-button",
<div class="widget-box--blocks--upsell-buttons">
<%= link_to "#{OpenProject::Static::Links.links[:upsell][:href]}/?utm_source=unknown&utm_medium=community-edition&utm_campaign=home-screen",
class: "button--link widget-box--blocks--upsell-info-button",
target: "_blank",
rel: "noopener" do %>
<%= spot_icon("external-link") %>
@@ -40,6 +40,6 @@
<% end %>
<% if current_user.admin? %>
<%= link_to t("js.admin.enterprise.upsale.button_start_trial"), enterprise_path, class: "button -primary" %>
<%= link_to t("js.admin.enterprise.upsell.button_start_trial"), enterprise_path, class: "button -primary" %>
<% end %>
</div>
+1 -1
View File
@@ -1,6 +1,6 @@
<% html_title t("js.notifications.title") %>
<%= render EnterpriseEdition::UpsalePageComponent.new(
<%= render EnterpriseEdition::UpsellPageComponent.new(
:date_alerts,
video: "enterprise/date-alert-notifications.mp4"
) %>
@@ -1,6 +1,6 @@
<% html_title t("js.notifications.title") %>
<%= render EnterpriseEdition::UpsalePageComponent.new(
<%= render EnterpriseEdition::UpsellPageComponent.new(
:work_package_sharing,
video: "enterprise/share-work-package.mp4"
) %>
+1 -1
View File
@@ -62,6 +62,6 @@ See COPYRIGHT and LICENSE files for more details.
<%= render PlaceholderUsers::TableComponent.new(rows: @placeholder_users) %>
<% else %>
<%= render EnterpriseEdition::UpsalePageComponent.new(:placeholder_users,
<%= render EnterpriseEdition::UpsellPageComponent.new(:placeholder_users,
video: "enterprise/placeholder_users.mp4") %>
<% end %>
@@ -39,7 +39,7 @@ See COPYRIGHT and LICENSE files for more details.
"enterprise-addons",
inline: true,
size: "1_25",
classnames: "upsale-colored"
classnames: "upsell-colored"
) %>
<% end %>
</label>
@@ -40,5 +40,5 @@ See COPYRIGHT and LICENSE files for more details.
<%= render(Projects::Settings::WorkPackages::Activities::Form.new(f)) %>
<% end %>
<% else %>
<%= render(EnterpriseEdition::UpsalePageComponent.new(:internal_comments)) %>
<%= render(EnterpriseEdition::UpsellPageComponent.new(:internal_comments)) %>
<% end %>
@@ -1,6 +1,6 @@
<% html_title t(:label_work_package_plural) %>
<%= render EnterpriseEdition::UpsalePageComponent.new(
<%= render EnterpriseEdition::UpsellPageComponent.new(
:work_package_sharing,
video: "enterprise/share-work-package.mp4"
) %>
+1 -1
View File
@@ -152,7 +152,7 @@ ignore_unused:
- 'permission_*'
- '{devise,kaminari,will_paginate}.*'
- '*.permission_header_explanation'
- 'storages.upsale.*'
- 'storages.upsell.*'
- 'services.*'
- 'storages.health.connection_validation.{one_drive,nextcloud}.*'
+1 -1
View File
@@ -63,7 +63,7 @@ OpenProject::Static::Homescreen.manage :blocks do |blocks|
if: Proc.new { User.current.admin? }
},
{
partial: "upsale",
partial: "upsell",
if: Proc.new { !EnterpriseToken.hide_banners? }
}
)
+2 -2
View File
@@ -215,7 +215,7 @@ Rails.application.reloader.to_prepare do
map.permission :edit_attribute_help_texts,
{
admin: %i[index],
attribute_help_texts: %i[index new edit upsale create update destroy]
attribute_help_texts: %i[index new edit upsell create update destroy]
},
permissible_on: :global,
require: :loggedin,
@@ -245,7 +245,7 @@ Rails.application.reloader.to_prepare do
{
versions: %i[index show status_by],
journals: %i[index],
work_packages: %i[show index show_conflict_flash_message share_upsale],
work_packages: %i[show index show_conflict_flash_message share_upsell],
work_packages_api: [:get],
"work_packages/reports": %i[report report_details],
"work_packages/activities_tab": %i[index update_streams update_sorting update_filter],
+4 -4
View File
@@ -2069,11 +2069,11 @@ en:
work_package_query_relation_columns: Work Package Query Relation Columns
work_package_sharing: Share work packages with external users
work_package_subject_generation: Work Package Subject Generation
upsale:
upsell:
title: "Enterprise add-on"
plan_title: "Enterprise %{plan} add-on"
plan_name: "%{plan} enterprise plan"
plan_text_html: "Available only through the %{plan_name}."
plan_text_html: "Available starting with the %{plan_name}."
hide_banner: "Hide this banner"
baseline_comparison:
description: Highlight changes made to this list since any point in the past.
@@ -2351,7 +2351,7 @@ en:
users: "Newest registered users in this instance."
blocks:
community: "OpenProject community"
upsale:
upsell:
title: "Upgrade to Enterprise edition"
links:
upgrade_enterprise_edition: "Upgrade to Enterprise edition"
@@ -4471,7 +4471,7 @@ en:
view_description: "Can view this project list."
edit: "Edit"
edit_description: "Can view, share and edit this project list."
upsale:
upsell:
message: "Sharing project lists with individual users is an enterprise add-on."
working_days:
info: >
+2 -2
View File
@@ -263,7 +263,7 @@ en:
status_waiting: "email sent - waiting for confirmation"
test_ee: "Test the Enterprise edition 14 days for free"
quick_overview: "Get a quick overview of project management and team collaboration with OpenProject Enterprise edition."
upsale:
upsell:
become_hero: "Become a hero!"
enterprise_info_html: "%{feature_title} is an Enterprise <span class='spot-icon spot-icon_inline spot-icon_enterprise-addons'></span> add-on."
upgrade_info: "Please upgrade to a paid plan to activate and start using it in your team."
@@ -945,7 +945,7 @@ en:
tl_toolbar:
zooms: "Zoom level"
outlines: "Hierarchy level"
upsale:
upsell:
ee_only: "Enterprise edition add-on"
wiki_formatting:
strong: "Strong"
+4 -4
View File
@@ -482,7 +482,7 @@ Rails.application.routes.draw do
delete "design/export_cover" => "custom_styles#export_cover_delete", as: "custom_style_export_cover_delete"
delete "design/favicon" => "custom_styles#favicon_delete", as: "custom_style_favicon_delete"
delete "design/touch_icon" => "custom_styles#touch_icon_delete", as: "custom_style_touch_icon_delete"
get "design/upsale" => "custom_styles#upsale", as: "custom_style_upsale"
get "design/upsell" => "custom_styles#upsell", as: "custom_style_upsell"
post "design/colors" => "custom_styles#update_colors", as: "update_design_colors"
post "design/themes" => "custom_styles#update_themes", as: "update_design_themes"
post "design/export_cover_text_color" => "custom_styles#update_export_cover_text_color",
@@ -710,7 +710,7 @@ Rails.application.routes.draw do
get "/new" => "work_packages#index", on: :collection, as: "new", state: "new"
# We do not want to match the work package export routes
get "(/*state)" => "work_packages#show", on: :member, as: "", constraints: { id: /\d+/, state: /(?!(shares|split_view)).+/ }
get "/share_upsale" => "work_packages#share_upsale", on: :collection, as: "share_upsale"
get "/share_upsell" => "work_packages#share_upsell", on: :collection, as: "share_upsell"
get "/edit" => "work_packages#show", on: :member, as: "edit"
end
@@ -868,8 +868,8 @@ Rails.application.routes.draw do
end
scope :notifications do
get "/share_upsale" => "notifications#share_upsale", as: "notifications_share_upsale"
get "/date_alerts" => "notifications#date_alerts", as: "notifications_date_alert_upsale"
get "/share_upsell" => "notifications#share_upsell", as: "notifications_share_upsell"
get "/date_alerts" => "notifications#date_alerts", as: "notifications_date_alert_upsell"
get "/", to: "notifications#index", as: :notifications_center
end
+6 -6
View File
@@ -1,19 +1,19 @@
upsale:
upsell:
href: https://www.openproject.org/enterprise-edition
label: homescreen.links.upgrade_enterprise_edition
upsale_benefits_features:
upsell_benefits_features:
href: https://www.openproject.org/enterprise-edition/#premium-features
label: noscript_learn_more
upsale_benefits_installation:
upsell_benefits_installation:
href: https://www.openproject.org/enterprise-edition/#installation
label: noscript_learn_more
upsale_benefits_security:
upsell_benefits_security:
href: https://www.openproject.org/enterprise-edition/#security-features
label: noscript_learn_more
upsale_benefits_support:
upsell_benefits_support:
href: https://www.openproject.org/enterprise-edition/#professional-support
label: noscript_learn_more
upsale_get_quote:
upsell_get_quote:
href: https://www.openproject.org/request-quote/
label: admin.enterprise.get_quote
user_guides:
+1 -1
View File
@@ -185,7 +185,7 @@ OpenProject 10 significantly improves the performance, especially for the work p
- Fixed: Overview page: click on link opens edit mode, instead of following the link [[#30948](https://community.openproject.org/wp/30948)]
- Fixed: Custom Action. Exception on OP Edge. "undefined method `iso8601' for "%CURRENT_DATE%":String" [[#30949](https://community.openproject.org/wp/30949)]
- Fixed: Wrong formatting of scroll bars on overview page in Windows [[#30951](https://community.openproject.org/wp/30951)]
- Fixed: Boards. EE upsale. Translation missing. [[#30954](https://community.openproject.org/wp/30954)]
- Fixed: Boards. EE upsell. Translation missing. [[#30954](https://community.openproject.org/wp/30954)]
- Fixed: Drag and drop in embedded tables does not work (or should be deactivated for now) [[#30967](https://community.openproject.org/wp/30967)]
- Fixed: Picture slider in for BCF issues even if there is only one picture [[#30969](https://community.openproject.org/wp/30969)]
- Fixed: Members: Error message overlapping form but not X-icon to remove it [[#30971](https://community.openproject.org/wp/30971)]
+1 -1
View File
@@ -95,7 +95,7 @@ We added a new “Files” tab in the work package details. This way, you will h
- Changed: Updated placement and design of the create button in the sidebar \[[#40958](https://community.openproject.org/wp/40958)\]
- Changed: Replace work strips on the team planner calendar with full cards \[[#40962](https://community.openproject.org/wp/40962)\]
- Changed: Change scrolling behavior of team planner \[[#40981](https://community.openproject.org/wp/40981)\]
- Changed: Show "Start trial" button in EE upsale templates \[[#40990](https://community.openproject.org/wp/40990)\]
- Changed: Show "Start trial" button in EE upsell templates \[[#40990](https://community.openproject.org/wp/40990)\]
- Changed: Add team planner to onboarding tour \[[#41050](https://community.openproject.org/wp/41050)\]
- Changed: Empty team planner view needs some more love \[[#41073](https://community.openproject.org/wp/41073)\]
- Changed: The date indicators must update when dragging a card in the planner horizontally \[[#41075](https://community.openproject.org/wp/41075)\]
@@ -63,8 +63,8 @@ export class BoardPartitionedPageComponent extends UntilDestroyedMixin {
unnamedBoard: this.I18n.t('js.boards.label_unnamed_board'),
loadingError: 'No such board found',
addList: this.I18n.t('js.boards.add_list'),
upsaleBoards: this.I18n.t('js.boards.upsale.teaser_text'),
upsaleCheckOutLink: this.I18n.t('js.work_packages.table_configuration.upsale.check_out_link'),
upsellBoards: this.I18n.t('js.boards.upsell.teaser_text'),
upsellCheckOutLink: this.I18n.t('js.work_packages.table_configuration.upsell.check_out_link'),
unnamed_list: this.I18n.t('js.boards.label_unnamed_list'),
};
@@ -41,14 +41,14 @@ import { EnterpriseTrialService } from 'core-app/features/enterprise/enterprise-
})
export class EnterpriseBaseComponent {
public text = {
button_trial: this.I18n.t('js.admin.enterprise.upsale.button_start_trial'),
button_book: this.I18n.t('js.admin.enterprise.upsale.button_book_now'),
link_quote: this.I18n.t('js.admin.enterprise.upsale.link_quote'),
become_hero: this.I18n.t('js.admin.enterprise.upsale.become_hero'),
you_contribute: this.I18n.t('js.admin.enterprise.upsale.you_contribute'),
button_trial: this.I18n.t('js.admin.enterprise.upsell.button_start_trial'),
button_book: this.I18n.t('js.admin.enterprise.upsell.button_book_now'),
link_quote: this.I18n.t('js.admin.enterprise.upsell.link_quote'),
become_hero: this.I18n.t('js.admin.enterprise.upsell.become_hero'),
you_contribute: this.I18n.t('js.admin.enterprise.upsell.you_contribute'),
email_not_received: this.I18n.t('js.admin.enterprise.trial.email_not_received'),
enterprise_edition: this.I18n.t('js.admin.enterprise.upsale.text'),
confidence: this.I18n.t('js.admin.enterprise.upsale.confidence'),
enterprise_edition: this.I18n.t('js.admin.enterprise.upsell.text'),
confidence: this.I18n.t('js.admin.enterprise.upsell.confidence'),
try_another_email: this.I18n.t('js.admin.enterprise.trial.try_another_email'),
};
@@ -53,7 +53,7 @@ export class FreeTrialButtonComponent implements OnInit {
email = '';
public text = {
button_trial: this.I18n.t('js.admin.enterprise.upsale.button_start_trial'),
button_trial: this.I18n.t('js.admin.enterprise.upsell.button_start_trial'),
confirmation_info: (date:string, email:string):string => this.I18n.t('js.admin.enterprise.trial.confirmation_info', {
date,
email,
@@ -81,8 +81,8 @@ export class QueryFilterComponent implements OnInit {
open_filter: this.I18n.t('js.filter.description.text_open_filter'),
close_filter: this.I18n.t('js.filter.description.text_close_filter'),
label_filter_add: this.I18n.t('js.work_packages.label_filter_add'),
upsale_for_more: this.I18n.t('js.filter.upsale_for_more'),
upsale_link: this.I18n.t('js.filter.upsale_link'),
upsell_for_more: this.I18n.t('js.filter.upsell_for_more'),
upsell_link: this.I18n.t('js.filter.upsell_link'),
button_delete: this.I18n.t('js.button_delete'),
incompatible_filter: this.I18n.t('js.work_packages.filters.baseline_incompatible'),
};
@@ -17,7 +17,7 @@
<svg
*ngIf="showEnterpriseIcon"
op-enterprise-addons-icon
class="button--icon upsale-colored"
class="button--icon upsell-colored"
size="small"
></svg>
@@ -27,8 +27,8 @@ export class WpTableConfigurationFiltersTabComponent implements TabComponent, On
selectedColumns: this.I18n.t('js.description_selected_columns'),
multiSelectLabel: this.I18n.t('js.work_packages.label_column_multiselect'),
upsaleRelationColumns: this.I18n.t('js.modals.upsale_relation_columns'),
upsaleRelationColumnsLink: this.I18n.t('js.modals.upsale_relation_columns_link'),
upsellRelationColumns: this.I18n.t('js.modals.upsell_relation_columns'),
upsellRelationColumnsLink: this.I18n.t('js.modals.upsell_relation_columns_link'),
};
constructor(
@@ -52,8 +52,8 @@ export class WpTableConfigurationHighlightingTabComponent implements TabComponen
priority: this.I18n.t('js.work_packages.table_configuration.highlighting_mode.priority'),
entire_row_by: this.I18n.t('js.work_packages.table_configuration.highlighting_mode.entire_row_by'),
},
upsaleAttributeHighlighting: this.I18n.t('js.work_packages.table_configuration.upsale.attribute_highlighting'),
upsaleCheckOutLink: this.I18n.t('js.work_packages.table_configuration.upsale.check_out_link'),
upsellAttributeHighlighting: this.I18n.t('js.work_packages.table_configuration.upsell.attribute_highlighting'),
upsellCheckOutLink: this.I18n.t('js.work_packages.table_configuration.upsell.check_out_link'),
more_info_link: enterpriseDocsUrl.tableHighlighting,
};
@@ -52,8 +52,8 @@ export class WpTableConfigurationModalComponent extends OpModalComponent impleme
applyButton: this.I18n.t('js.modals.button_apply'),
cancelButton: this.I18n.t('js.modals.button_cancel'),
upsaleRelationColumns: this.I18n.t('js.modals.upsale_relation_columns'),
upsaleRelationColumnsLink: this.I18n.t('js.modals.upsale_relation_columns_link'),
upsellRelationColumns: this.I18n.t('js.modals.upsell_relation_columns'),
upsellRelationColumnsLink: this.I18n.t('js.modals.upsell_relation_columns_link'),
};
public onDataUpdated = new EventEmitter<void>();
@@ -1,4 +1,4 @@
.upsale-actions
.upsell-actions
display: flex
flex-wrap: wrap
align-items: baseline
@@ -6,14 +6,14 @@
.openproject--static-link
margin-left: 1rem
.upsale--information-container
.upsell--information-container
margin-bottom: 40px
.token-form textarea
font-family: "Lucida Console", Monaco, monospace
max-width: 560px
.widget-box--blocks--upsale-buttons
.widget-box--blocks--upsell-buttons
display: flex
justify-content: flex-end
@@ -22,32 +22,32 @@
text-decoration: none
margin: 0.625rem 0.625rem 0 0
.widget-box--blocks--upsale-info-button
.widget-box--blocks--upsell-info-button
display: flex
justify-content: center
align-items: center
.upsale-colored
color: var(--enterprise-upsale-color) !important
.upsell-colored
color: var(--enterprise-upsell-color) !important
.upsale-colored-background
background: var(--enterprise-upsale-color) !important
.upsell-colored-background
background: var(--enterprise-upsell-color) !important
color: white !important
.widget-box--blocks--upsale-title
.widget-box--blocks--upsell-title
font-weight: 400
font-size: 20px
margin-top: 10px
display: flex
.widget-box--blocks--upsale-text
.widget-box--blocks--upsell-text
line-height: 24px
margin-top: 10px
.widget-box--blocks--upsale-description
.widget-box--blocks--upsell-description
margin: 10px 0 10px 0
display: flex
.widget-box--blocks--upsale-image
.widget-box--blocks--upsell-image
width: 200px
margin: auto
@@ -17,7 +17,7 @@
.advanced-filters--add-filter
max-width: 100%
.ee-attribute-highlighting-upsale
.ee-attribute-highlighting-upsell
margin-bottom: 1.5rem
.tab-content
@@ -32,7 +32,7 @@
.widget-box
box-shadow: none
&.upsale
&.upsell
background: var(--bgColor-accent-muted)
flex-basis: 100%
border-color: var(--borderColor-accent-muted)
@@ -137,6 +137,6 @@
--split-screen-width: 550px;
--full-view-split-right-width: 550px;
--gantt-split-width: 50%;
--enterprise-upsale-color: #FB8F44;
--enterprise-upsale-border-color: var(--borderColor-severe-muted);
--enterprise-upsell-color: #FB8F44;
--enterprise-upsell-border-color: var(--borderColor-severe-muted);
}
+1 -1
View File
@@ -246,7 +246,7 @@ module Redmine::MenuManager::MenuHelper
title_text = "".html_safe + content_tag(:span, caption, class: "ellipsis") + badge_for(item)
if item.enterprise_feature.present? && !EnterpriseToken.allows_to?(item.enterprise_feature)
title_text += ("".html_safe + render(Primer::Beta::Octicon.new(icon: "op-enterprise-addons",
classes: "upsale-colored",
classes: "upsell-colored",
ml: 2)))
end
title_text
@@ -91,8 +91,8 @@ module Redmine::MenuManager::TopMenu::HelpMenu
title: I18n.t("top_menu.help_and_support")
end
unless EnterpriseToken.hide_banners? && EnterpriseToken.active?
result << static_link_item(:upsale,
href_suffix: "/?utm_source=unknown&utm_medium=op-instance&utm_campaign=ee-upsale-help-menu")
result << static_link_item(:upsell,
href_suffix: "/?utm_source=unknown&utm_medium=op-instance&utm_campaign=ee-upsell-help-menu")
end
result << static_link_item(:user_guides)
result << content_tag(:li, class: "op-menu--item") do
+10 -10
View File
@@ -1,4 +1,4 @@
OpenProject provides multiple ways to render upsale components. This document describes the different components and how to use them.
OpenProject provides multiple ways to render upsell components. This document describes the different components and how to use them.
# Requirements
@@ -13,8 +13,8 @@ To use the banners below, you need to add translations and links.
**Translations**
You need to add translations for the feature and the upsale banner.
The feature translation is used in the feature list, the upsale translation is used in the upsale banner.
You need to add translations for the feature and the upsell banner.
The feature translation is used in the feature list, the upsell translation is used in the upsell banner.
This is the default convention:
@@ -25,7 +25,7 @@ en:
feature:
# ...
your_feature_name: "Fancy EE feature!"
upsale:
upsell:
# ...
your_feature_name:
title: "Title of the banner"
@@ -36,7 +36,7 @@ en:
```
You can optionally provide a `i18n_scope` parameter to the components below to customize the place to look
for the upsale translation keys.
for the upsell translation keys.
**docs/static_links.yml**
@@ -46,21 +46,21 @@ file under the `enterprise_features` section.
If none is provided, the link will go to the enterprise landing page.
## Full-page upsale pages
## Full-page upsell pages
Use when: You have a feature video / image and a full page to fill
```ruby
render EnterpriseEdition::UpsalePageComponent.new(
render EnterpriseEdition::UpsellPageComponent.new(
:enterprise_feature,
video: "enterprise/some-video.mp4",
# or image: "enterprise/some-image.png"
)
```
<%= embed OpenProject::EnterpriseEdition::UpsalePageComponentPreview, :default, panels: %i[] %>
<%= embed OpenProject::EnterpriseEdition::UpsellPageComponentPreview, :default, panels: %i[] %>
## Inline upsale banners
## Inline upsell banners
Use when: You want to show content below the banners, e.g. in administrative setting pages.
@@ -70,7 +70,7 @@ render EnterpriseEdition::BannerComponent.new(:enterprise_feature)
<%= embed OpenProject::EnterpriseEdition::BannerComponentPreview, :default, panels: %i[] %>
## Dismissible upsale banners
## Dismissible upsell banners
Use when: You want to show a feature to regular users, but allow them to hide it for good.
@@ -38,7 +38,7 @@ module OpenProject
# ee:
# # Title used unless it is overwritten for the specific feature
# title: "Enterprise add-on"
# upsale:
# upsell:
# [feature_key]:
# # Title used for this feature only. If this is missing, the default feature key is used.
# title: "A splendid feature"
@@ -31,8 +31,8 @@
module OpenProject
module EnterpriseEdition
# @logical_path OpenProject/EnterpriseEdition
class UpsalePageComponentPreview < Lookbook::Preview
# Render a full-screen upsale page, with optional video or image features.
class UpsellPageComponentPreview < Lookbook::Preview
# Render a full-screen upsell page, with optional video or image features.
# The easiest way to render the banner component is to provide a feature key and
# have the assorted data structures match the expectations.
# The text will be fetched from the i18n files:
@@ -41,7 +41,7 @@ module OpenProject
# ee:
# # Title used unless it is overwritten for the specific feature
# title: "Enterprise add-on"
# upsale:
# upsell:
# [feature_key]:
# # Title used for this feature only. If this is missing, the default title is used.
# title: "A splendid feature"
@@ -61,12 +61,12 @@ module OpenProject
# The href is inferred from `OpenProject::Static::Links.enterprise_features[feature_key][:href]`.
# @display min_height 450px
def default
render ::EnterpriseEdition::UpsalePageComponent.new(:customize_life_cycle)
render ::EnterpriseEdition::UpsellPageComponent.new(:customize_life_cycle)
end
def video
render(
::EnterpriseEdition::UpsalePageComponent
::EnterpriseEdition::UpsellPageComponent
.new(:date_alerts,
video: "enterprise/date-alert-notifications.mp4")
)
@@ -74,7 +74,7 @@ module OpenProject
def image
render(
::EnterpriseEdition::UpsalePageComponent
::EnterpriseEdition::UpsellPageComponent
.new(:ldap_groups, image: "enterprise/ldap-groups.jpg")
)
end
@@ -24,5 +24,5 @@
end %>
<% end %>
<%= render EnterpriseEdition::BannerComponent.new(:sso_auth_providers, i18n_scope: "saml.providers.upsale")%>
<%= render EnterpriseEdition::BannerComponent.new(:sso_auth_providers, i18n_scope: "saml.providers.upsell")%>
<%= render ::Saml::Providers::TableComponent.new(rows: @providers) %>
+1 -1
View File
@@ -66,7 +66,7 @@ en:
are used to provide user attributes in OpenProject
metadata:
dialog: "This is the URL where the OpenProject SAML metadata is available. Optionally use it to configure your identity provider:"
upsale:
upsell:
title: "Single Sign-On (SSO) with SAML"
description: Connect OpenProject to a SAML identity provider
request_attributes:
@@ -193,7 +193,7 @@ RSpec.describe "SAML administration CRUD",
end
context "without EE", without_ee: %i[sso_auth_providers] do
it "renders the upsale page" do
it "renders the upsell page" do
visit "/admin/saml/providers"
expect(page).to have_enterprise_banner(:professional)
end
+1 -1
View File
@@ -9,7 +9,7 @@ en:
project_module_board_view: "Boards"
ee:
upsale:
upsell:
board_view:
description: 'Would you like to automate your workflows with Boards? Advanced boards are an Enterprise add-on. Please upgrade to a paid plan.'
boards:
+1 -1
View File
@@ -1,7 +1,7 @@
# English strings go here
en:
ee:
upsale:
upsell:
board_view:
description: 'Would you like to automate your workflows with Boards? Advanced boards are an Enterprise add-on. Please upgrade to a paid plan.'
js:
+1 -1
View File
@@ -234,6 +234,6 @@ en:
ee:
features:
time_entry_time_restrictions: Require exact time tracking
upsale:
upsell:
time_entry_time_restrictions:
description: "Improve your time tracking by requiring exact start and finish times when logging time."
+1 -1
View File
@@ -1,6 +1,6 @@
en:
ee:
upsale:
upsell:
grid_widget_wp_graph:
description: "Some widgets, like the work package graph widget, are only available in the Enterprise edition."
js:
+1 -1
View File
@@ -57,7 +57,7 @@ module Pages
def expect_add_widget_enterprise_edition_notice(row_number, column_number, location)
within_add_widget_modal(row_number, column_number, location) do
expect(page).to have_content(I18n.t("js.grid.add_widget"))
expect(page).to have_text "Available only through the Basic enterprise plan"
expect(page).to have_text "Available starting with the Basic enterprise plan"
end
end
@@ -77,7 +77,7 @@ module LdapGroups
def check_ee
unless EnterpriseToken.allows_to?(:ldap_groups)
render template: "ldap_groups/synchronized_groups/upsale"
render template: "ldap_groups/synchronized_groups/upsell"
false
end
end
@@ -56,7 +56,7 @@ module LdapGroups
def check_ee
unless EnterpriseToken.allows_to?(:ldap_groups)
render template: "ldap_groups/synchronized_groups/upsale"
render template: "ldap_groups/synchronized_groups/upsell"
false
end
end
@@ -1,3 +1,3 @@
<% html_title(t(:label_administration), t("ldap_groups.synchronized_groups.plural")) -%>
<%= render EnterpriseEdition::UpsalePageComponent.new(:ldap_groups, image: "enterprise/ldap-groups.jpg") %>
<%= render EnterpriseEdition::UpsellPageComponent.new(:ldap_groups, image: "enterprise/ldap-groups.jpg") %>
+2 -2
View File
@@ -1,6 +1,6 @@
en:
ee:
upsale:
upsell:
ldap_groups:
title: 'LDAP group synchronization'
description: 'Synchronize LDAP groups with OpenProject groups to manage users, change their permissions and facilitate user management across groups.'
@@ -82,5 +82,5 @@ en:
Without it, only existing accounts in OpenProject will be added to groups.
dn_text: 'Enter the full DN of the group in LDAP'
group_text: 'Select an existing OpenProject group that members of the LDAP group shall be synchronized with'
upsale:
upsell:
description: 'Take advantage of synchronised LDAP groups to manage users, change their permissions and facilitate user management across groups.'
@@ -9,9 +9,9 @@ RSpec.describe "LDAP group sync administration spec", :js do
end
context "without EE" do
it "shows upsale" do
expect(page).to have_enterprise_upsale_page
expect(page).to have_text "Available only through the Premium enterprise plan"
it "shows upsell" do
expect(page).to have_enterprise_upsell_page
expect(page).to have_text "Available starting with the Premium enterprise plan"
end
end
@@ -20,7 +20,7 @@ RSpec.describe "LDAP group sync administration spec", :js do
let!(:auth_source) { create(:ldap_auth_source, name: "ldap") }
it "allows synced group administration flow" do
expect(page).not_to have_enterprise_upsale_page
expect(page).not_to have_enterprise_upsell_page
# Open create menu
page.find_test_selector("op-admin-synchronized-groups--button-new", text: I18n.t(:button_add)).click
# Create group
@@ -40,5 +40,5 @@
end
%>
<%= render EnterpriseEdition::BannerComponent.new(:sso_auth_providers, i18n_scope: "openid_connect.providers.upsale") %>
<%= render EnterpriseEdition::BannerComponent.new(:sso_auth_providers, i18n_scope: "openid_connect.providers.upsell") %>
<%= render ::OpenIDConnect::Providers::TableComponent.new(rows: @providers) %>
+1 -1
View File
@@ -96,7 +96,7 @@ en:
name: Microsoft Entra
custom:
name: Custom
upsale:
upsell:
title: "Single Sign-On (SSO) with OpenID connect"
description: Connect OpenProject to an OpenID connect identity provider
label_add_new: Add a new OpenID provider
@@ -173,7 +173,7 @@ RSpec.describe "OIDC administration CRUD",
end
context "without EE", without_ee: %i[sso_auth_providers] do
it "renders the upsale page" do
it "renders the upsell page" do
visit "/admin/openid_connect/providers"
expect(page).to have_enterprise_banner(:premium)
end
@@ -79,7 +79,7 @@ class Storages::Admin::StoragesController < ApplicationController
@target_step = @wizard.prepare_next_step
end
def upsale; end
def upsell; end
def create
service_result = Storages::Storages::CreateService
@@ -268,7 +268,7 @@ class Storages::Admin::StoragesController < ApplicationController
def require_ee_token_for_one_drive
if ::Storages::Storage::one_drive_without_ee_token?(@provider_type)
redirect_to action: :upsale
redirect_to action: :upsell
end
end
@@ -36,7 +36,7 @@ end %>
) do |item|
item.with_trailing_visual_icon(
icon: "op-enterprise-addons",
classes: "upsale-colored"
classes: "upsell-colored"
) if ::Storages::Storage::one_drive_without_ee_token?(provider_type)
end
end
@@ -1,5 +1,5 @@
<% html_title(t(:label_administration), t("storages.upsale.title")) -%>
<% html_title(t(:label_administration), t("storages.upsell.title")) -%>
<%= render EnterpriseEdition::UpsalePageComponent.new(:one_drive_sharepoint_file_storage,
<%= render EnterpriseEdition::UpsellPageComponent.new(:one_drive_sharepoint_file_storage,
video: "enterprise/one_drive_sharepoint_integration.mp4",
i18n_scope: "storages.upsale") %>
i18n_scope: "storages.upsell") %>
+1 -1
View File
@@ -484,7 +484,7 @@ en:
description: Add a storage to see them here.
heading: You don't have any storages yet.
successful_storage_connection: Storage connected successfully! Remember to activate the storage in the Projects tab for each desired project to use it.
upsale:
upsell:
description: |-
Integrate your OneDrive/SharePoint as a file storage with OpenProject. Upload files and link them directly to
work packages in a project.
+1 -1
View File
@@ -66,7 +66,7 @@ Rails.application.routes.draw do
delete :replace_oauth_application
end
get :upsale, on: :collection
get :upsell, on: :collection
end
end
end
@@ -266,7 +266,7 @@ RSpec.describe "Admin Create a new file storage",
end
context "with OneDrive Storage and enterprise token missing", with_ee: false do
it "renders enterprise icon and redirects to upsale", :webmock do
it "renders enterprise icon and redirects to upsell", :webmock do
visit admin_settings_storages_path
within(".SubHeader") do
@@ -278,7 +278,7 @@ RSpec.describe "Admin Create a new file storage",
end
end
expect(page).to have_current_path(upsale_admin_settings_storages_path)
expect(page).to have_current_path(upsell_admin_settings_storages_path)
wait_for { page }.to have_text("OneDrive/SharePoint integration")
end
end
@@ -4,7 +4,7 @@ module ::TeamPlanner
include Layout
before_action :load_and_authorize_in_optional_project
before_action :build_plan_view, only: %i[new]
before_action :require_ee_token, except: %i[upsale]
before_action :require_ee_token, except: %i[upsell]
before_action :find_plan_view, only: %i[destroy]
menu_item :team_planner_view
@@ -38,7 +38,7 @@ module ::TeamPlanner
render layout: "angular/angular"
end
def upsale; end
def upsell; end
def destroy
if @view.destroy
@@ -52,7 +52,7 @@ module ::TeamPlanner
def require_ee_token
unless EnterpriseToken.allows_to?(:team_planner_view)
redirect_to action: :upsale
redirect_to action: :upsell
end
end
@@ -1,8 +0,0 @@
<% html_title(t(:label_administration), t("ee.upsale.team_planner_view.title")) -%>
<%=
render EnterpriseEdition::UpsalePageComponent.new(
:team_planner_view,
video: "enterprise/team-planner-animation.mp4"
)
%>
@@ -0,0 +1,8 @@
<% html_title(t(:label_administration), t("ee.upsell.team_planner_view.title")) -%>
<%=
render EnterpriseEdition::UpsellPageComponent.new(
:team_planner_view,
video: "enterprise/team-planner-animation.mp4"
)
%>
+1 -1
View File
@@ -11,7 +11,7 @@ en:
ee:
feature_names:
team_planner_view: "Team planner"
upsale:
upsell:
team_planner_view:
title: "Team planner"
description: "Get a complete overview of your teams planning with Team Planner. Stretch, shorten and drag-and-drop work packages to modify dates, move them or change assignees."
+2 -2
View File
@@ -5,7 +5,7 @@ Rails.application.routes.draw do
collection do
get "/", to: "team_planner/team_planner#overview"
get "/new", to: "team_planner/team_planner#new"
get "/upsale", to: "team_planner/team_planner#upsale", as: :upsale
get "/upsell", to: "team_planner/team_planner#upsell", as: :upsell
end
end
@@ -16,7 +16,7 @@ Rails.application.routes.draw do
as: :team_planners do
collection do
get "menu" => "team_planner/menus#show"
get "/upsale", to: "team_planner/team_planner#upsale", as: :upsale
get "/upsell", to: "team_planner/team_planner#upsell", as: :upsell
get "/new", to: "team_planner/team_planner#show", as: :new
end
@@ -40,13 +40,13 @@ module OpenProject::TeamPlanner
dependencies: :work_package_tracking,
enterprise_feature: "team_planner_view" do
permission :view_team_planner,
{ "team_planner/team_planner": %i[index show upsale overview],
{ "team_planner/team_planner": %i[index show upsell overview],
"team_planner/menus": %i[show] },
permissible_on: :project,
dependencies: %i[view_work_packages],
contract_actions: { team_planner: %i[read] }
permission :manage_team_planner,
{ "team_planner/team_planner": %i[index show new create destroy upsale] },
{ "team_planner/team_planner": %i[index show new create destroy upsell] },
permissible_on: :project,
dependencies: %i[view_team_planner
add_work_packages
@@ -40,21 +40,21 @@ RSpec.describe "Team planner index",
login_as current_user
end
it "redirects routes to upsale" do
it "redirects routes to upsell" do
visit team_planners_path
expect(page).to have_enterprise_upsale_page(:premium)
expect(page).to have_enterprise_upsell_page(:premium)
visit project_team_planners_path(project)
expect(page).to have_enterprise_upsale_page(:premium)
expect(page).to have_enterprise_upsell_page(:premium)
visit new_project_team_planners_path(project)
expect(page).to have_enterprise_upsale_page(:premium)
expect(page).to have_enterprise_upsell_page(:premium)
visit project_team_planner_path(project, id: "new")
expect(page).to have_enterprise_upsale_page(:premium)
expect(page).to have_enterprise_upsell_page(:premium)
end
end
@@ -48,10 +48,10 @@ RSpec.describe "Team planner routing" do
end
context "with :project_id" do
it "routes to team_planner#upsale" do
it "routes to team_planner#upsell" do
expect(subject)
.to route(:get, "/projects/foobar/team_planners/upsale")
.to(controller: "team_planner/team_planner", action: :upsale, project_id: "foobar")
.to route(:get, "/projects/foobar/team_planners/upsell")
.to(controller: "team_planner/team_planner", action: :upsell, project_id: "foobar")
end
it "routes to team_planner#show" do
@@ -62,10 +62,10 @@ RSpec.describe "Team planner routing" do
end
context "without :project_id" do
it "routes to team_planner#upsale" do
it "routes to team_planner#upsell" do
expect(subject)
.to route(:get, "/team_planners/upsale")
.to(controller: "team_planner/team_planner", action: :upsale)
.to route(:get, "/team_planners/upsell")
.to(controller: "team_planner/team_planner", action: :upsell)
end
it "routes to team_planner#new" do
@@ -86,7 +86,7 @@ en:
text_2fa_enabled: "Upon every login, this user will be requested to enter a OTP token from their default 2FA device."
text_2fa_disabled: "The user did not set up a 2FA device through their 'My account page'"
only_sms_allowed: "Only SMS delivery can be set up for other users."
upsale:
upsell:
title: "Two-factor authentication"
description: "Strenghten the security of your OpenProject instance by offering (or enforcing) two-factor authentification to all project members."
backup_codes:
@@ -39,7 +39,7 @@ RSpec.describe EnterpriseEdition::BannerComponent, type: :component do
let(:component_test_selector) { "op-enterprise-banner" }
let(:features) { nil }
let(:enforce_available_locales) { I18n.config.enforce_available_locales }
let(:i18n_upsale) do
let(:i18n_upsell) do
{
some_enterprise_feature: {
title:,
@@ -63,7 +63,7 @@ RSpec.describe EnterpriseEdition::BannerComponent, type: :component do
features: {
some_enterprise_feature: "Enterprise feature translation"
},
upsale: i18n_upsale
upsell: i18n_upsell
}
}
end
@@ -166,7 +166,7 @@ RSpec.describe EnterpriseEdition::BannerComponent, type: :component do
end
context "without a title, but a description_html" do
let(:i18n_upsale) do
let(:i18n_upsell) do
{
some_enterprise_feature: {
description_html: description
@@ -179,7 +179,7 @@ RSpec.describe EnterpriseEdition::BannerComponent, type: :component do
end
context "without a title, but a description" do
let(:i18n_upsale) do
let(:i18n_upsell) do
{
some_enterprise_feature: {
description:
@@ -192,7 +192,7 @@ RSpec.describe EnterpriseEdition::BannerComponent, type: :component do
end
context "with a more specific title in the i18n file" do
let(:i18n_upsale) do
let(:i18n_upsell) do
{
some_enterprise_feature: {
title:,
@@ -209,7 +209,7 @@ RSpec.describe EnterpriseEdition::BannerComponent, type: :component do
{
my: {
custom: {
upsale: {
upsell: {
title: "Foo",
description: "Bar"
}
@@ -224,13 +224,13 @@ RSpec.describe EnterpriseEdition::BannerComponent, type: :component do
end
let(:expected_title) { "Foo" }
let(:expected_description) { "Bar" }
let(:component_args) { { i18n_scope: "my.custom.upsale" } }
let(:component_args) { { i18n_scope: "my.custom.upsell" } }
it_behaves_like "renders the component"
end
context "without a description key in the i18n file" do
let(:i18n_upsale) do
let(:i18n_upsell) do
{
some_enterprise_feature: {}
}
@@ -46,7 +46,7 @@ RSpec.describe CustomActionsController, with_ee: %i[custom_actions] do
end
it "renders enterprise_token" do
expect(response).to render_template "custom_actions/upsale"
expect(response).to render_template "custom_actions/upsell"
end
end
end
@@ -50,18 +50,18 @@ RSpec.describe CustomStylesController do
allow(EnterpriseToken).to receive(:current).and_return(nil)
end
it "redirects to #upsale" do
expect(subject).to redirect_to action: :upsale
it "redirects to #upsell" do
expect(subject).to redirect_to action: :upsell
end
end
end
describe "#upsale" do
subject { get :upsale }
describe "#upsell" do
subject { get :upsell }
it "renders upsale" do
it "renders upsell" do
expect(subject).to be_successful
expect(subject).to render_template "upsale"
expect(subject).to render_template "upsell"
end
end
@@ -120,7 +120,7 @@ RSpec.describe EnterprisesController do
it "still renders #show with form" do
expect(response).not_to render_template partial: "enterprises/_current"
expect(response.body).to have_css ".upsale-benefits"
expect(response.body).to have_css ".upsell-benefits"
end
end
end
+6 -6
View File
@@ -196,13 +196,13 @@ RSpec.describe SharesController do
context "when the strategy allows viewing but enterprise check fails" do
before do
allow_any_instance_of(SharingStrategies::ProjectQueryStrategy).to receive_messages(viewable?: true, manageable?: false)
allow(Shares::ProjectQueries::UpsaleComponent).to receive(:new).and_call_original
allow(Shares::ProjectQueries::UpsellComponent).to receive(:new).and_call_original
end
it "renders the upsale component" do
it "renders the upsell component" do
make_request
expect(response).to have_http_status(:ok)
expect(Shares::ProjectQueries::UpsaleComponent).to have_received(:new)
expect(Shares::ProjectQueries::UpsellComponent).to have_received(:new)
end
end
@@ -230,13 +230,13 @@ RSpec.describe SharesController do
allow_any_instance_of(SharingStrategies::ProjectQueryStrategy).to receive_messages(
viewable?: false, manageable?: true
)
allow(Shares::ProjectQueries::UpsaleComponent).to receive(:new).and_call_original
allow(Shares::ProjectQueries::UpsellComponent).to receive(:new).and_call_original
end
it "renders the upsale component" do
it "renders the upsell component" do
make_request
expect(response).to have_http_status(:ok)
expect(Shares::ProjectQueries::UpsaleComponent).to have_received(:new)
expect(Shares::ProjectQueries::UpsellComponent).to have_received(:new)
end
end
@@ -37,9 +37,9 @@ RSpec.describe "Tabs navigation and content switching on the admin/design page"
visit custom_style_path(tab: "interface")
end
it "redirects to upsale page" do
expect(page).to have_enterprise_upsale_page
expect(page).to have_text "Available only through the Basic enterprise plan"
it "redirects to upsell page" do
expect(page).to have_enterprise_upsell_page
expect(page).to have_text "Available starting with the Basic enterprise plan"
end
end

Some files were not shown because too many files have changed in this diff Show More