Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/release/14.5' into dev
Browse files Browse the repository at this point in the history
  • Loading branch information
ulferts committed Sep 9, 2024
2 parents 02fc6bf + 49f2a50 commit c1bddca
Show file tree
Hide file tree
Showing 145 changed files with 735 additions and 457 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@
selected: selected_columns,
protected: helpers.protected_projects_columns_options,
name: COLUMN_HTML_NAME,
id: 'columns-select',
id: COLUMN_HTML_ID,
dragAreaName: "#{COLUMN_HTML_ID}_dragarea",
formControlId: "#{COLUMN_HTML_ID}_autocompleter",
inputLabel: I18n.t(:'queries.configure_view.columns.input_label'),
inputPlaceholder: I18n.t(:'queries.configure_view.columns.input_placeholder'),
dragAreaLabel: I18n.t(:'queries.configure_view.columns.drag_area_label'),
Expand Down
1 change: 1 addition & 0 deletions app/components/projects/configure_view_modal_component.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ class Projects::ConfigureViewModalComponent < ApplicationComponent
MODAL_ID = "op-project-list-configure-dialog"
QUERY_FORM_ID = "op-project-list-configure-query-form"
COLUMN_HTML_NAME = "columns"
COLUMN_HTML_ID = "columns-select"

options :query

Expand Down
4 changes: 2 additions & 2 deletions app/components/work_packages/details/tab_component.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@
flex.with_column(classes: "op-work-package-details-tab-component--action") do
render(Primer::Beta::IconButton.new(icon: :x,
tag: :a,
href: helpers.url_for_with_params(action: :close_split_view),
data: { turbo: true, 'turbo-stream': true },
href: base_route,
data: { turbo: true, target: "_top", turbo_action: "advance" },
scheme: :invisible,
test_selector: "wp-details-tab-component--close",
aria: { label: I18n.t(:button_close) }))
Expand Down
2 changes: 1 addition & 1 deletion app/components/work_packages/split_view_component.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
flex.with_row(flex: 1) do
helpers.angular_component_tag "opce-wp-split-view",
inputs: {
work_package_id: params[:work_package_id] || @work_package.id,
work_package_id: @id,
resizerClass: "op-work-package-split-view",
activeTab: @tab
}
Expand Down
4 changes: 4 additions & 0 deletions app/components/work_packages/split_view_component.sass
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,7 @@
@media screen and (max-width: $breakpoint-lg)
// Unfortunately, we have to enforce this style via !important as the resizer writes the width directly on the element as inline style
min-width: unset !important

@media screen and (max-width: $breakpoint-sm)
.work-packages--details-toolbar-container
@include hide-button-texts
28 changes: 0 additions & 28 deletions app/controllers/concerns/work_packages/with_split_view.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,33 +37,5 @@ module WithSplitView
def split_view_work_package_id
params[:work_package_id].to_i
end

def close_split_view
respond_to do |format|
format.turbo_stream do
render turbo_stream: [
turbo_stream.remove("work-package-details-#{split_view_work_package_id}"),
turbo_stream.push_state(url: split_view_base_route),
turbo_stream.set_title(title: helpers.page_title(I18n.t("js.notifications.title")))
]
end
format.html do
redirect_to split_view_base_route
end
end
end

def respond_to_with_split_view(&format_block)
respond_to do |format|
format.turbo_stream do
render turbo_stream: [
turbo_stream.update("content-bodyRight", helpers.split_view_instance.render_in(view_context)),
turbo_stream.push_state(url: request.fullpath)
]
end

yield(format) if format_block
end
end
end
end
10 changes: 7 additions & 3 deletions app/controllers/notifications_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,20 @@ class NotificationsController < ApplicationController

before_action :require_login
before_action :filtered_query, only: :mark_all_read
no_authorization_required! :index, :split_view, :update_counter, :close_split_view, :mark_all_read, :date_alerts, :share_upsale
no_authorization_required! :index, :split_view, :update_counter, :mark_all_read, :date_alerts, :share_upsale

def index
render_notifications_layout
end

def split_view
respond_to_with_split_view do |format|
respond_to do |format|
format.html do
render :index, layout: "notifications"
if turbo_frame_request?
render "work_packages/split_view", layout: false
else
render :index, layout: "notifications"
end
end
end
end
Expand Down
2 changes: 1 addition & 1 deletion app/helpers/work_packages/split_view_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ def optional_work_package_split_view
def split_view_instance
WorkPackages::SplitViewComponent.new(id: params[:work_package_id],
tab: params[:tab],
base_route: params[:base_route] || work_packages_path)
base_route: split_view_base_route)
end
end
2 changes: 1 addition & 1 deletion app/mailers/sharing_mailer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ def shared_work_package(sharer, membership, group = nil)
@role_rights = derive_role_rights(role)
@allowed_work_package_actions = derive_allowed_work_package_actions(role)
@url = optionally_activated_url(work_package_url(@work_package.id), @invitation_token)
@notification_url = optionally_activated_url(details_notifications_url(@work_package.id), @invitation_token)
@notification_url = optionally_activated_url(details_notifications_url(@work_package.id, tab: :activity), @invitation_token)

set_open_project_headers(@work_package)
message_id(membership, sharer)
Expand Down
4 changes: 2 additions & 2 deletions app/views/layouts/base.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -155,9 +155,9 @@ See COPYRIGHT and LICENSE files for more details.
<%= yield %>
<% end %>
</div>
<div id="content-bodyRight">
<%= turbo_frame_tag "content-bodyRight" do %>
<%= content_for :content_body_right %>
</div>
<% end %>
<% end %>
</main>
</div>
Expand Down
4 changes: 2 additions & 2 deletions app/views/mailer/_notification_row.html.erb
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<a style="text-decoration: none;display: block;"
href="<%= local_assigns[:notification_url] || details_notifications_url(work_package.id) %>"
href="<%= local_assigns[:notification_url] || details_notifications_url(work_package.id, tab: :activity) %>"
target="_blank">
<%= render layout: 'mailer/border_table' do %>
<tr>
Expand Down Expand Up @@ -104,7 +104,7 @@
</table>

<a style="margin-left: 12px;"
href="<%= defined?(open_in_browser_path) ? open_in_browser_path : details_notifications_url(work_package.id) %>"
href="<%= defined?(open_in_browser_path) ? open_in_browser_path : details_notifications_url(work_package.id, tab: :activity) %>"
target="_blank"
rel="noopener noreferrer">
<%= I18n.t('mail.work_packages.open_in_browser') %>
Expand Down
2 changes: 1 addition & 1 deletion app/views/work_package_mailer/mentioned.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<%= render partial: 'mailer/mailer_header',
locals: {
summary: I18n.t(:'mail.work_packages.mentioned_by', user: @journal.user),
button_href: details_notifications_url(@work_package.id),
button_href: details_notifications_url(@work_package.id, tab: :activity),
button_text: I18n.t(:'mail.notification.see_in_center'),
user: @user,
} %>
Expand Down
3 changes: 3 additions & 0 deletions app/views/work_packages/split_view.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<%= turbo_frame_tag "content-bodyRight" do %>
<%= render(split_view_instance) %>
<% end %>
6 changes: 0 additions & 6 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -725,9 +725,6 @@
defaults: { tab: :overview },
as: :details,
work_package_split_view: true

get "/:work_package_id/close",
action: :close_split_view
end

resources :notifications, only: :index do
Expand Down Expand Up @@ -756,9 +753,6 @@
end

if OpenProject::Configuration.lookbook_enabled?
# Dummy route for the split screen controller
get :close_split_view, controller: "homescreen"

mount Lookbook::Engine, at: "/lookbook"
end

Expand Down
2 changes: 1 addition & 1 deletion docs/development/concepts/secure-coding/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ OpenProject recommends these authentication mechanisms:
- For any external connection (Database, LDAP, etc.), OpenProject uses openssl library for the host or container's openssl certificate store. Use your distribution's mechanisms to add verified certificate or certificate chains. For more information, see the [Ruby OpenSSL X509 Store documentation](https://ruby-doc.org/stdlib-2.4.0/libdoc/openssl/rdoc/OpenSSL/X509/Store.html).

- For smaller to medium organizations with no centralized authentication mechanism, use the internal username / password authentication mechanism for secure storing of your user's credentials using BCrypt salted cryptographic hash function.
- For organizations with a centralized and accessible LDAP server, [OpenProject provides LDAP userbind authentication](../../../system-admin-guide/authentication/ldap-authentication/) to forward the authentication request to your LDAP server. Use TLS or LDAPS encrypted connections to the LDAP server to ensure transport level security. Optionally, synchronize roles and permissions using the [LDAP Group sync functionality](../../../system-admin-guide/authentication/ldap-authentication/ldap-group-synchronization/).
- For organizations with a centralized and accessible LDAP server, [OpenProject provides LDAP userbind authentication](../../../system-admin-guide/authentication/ldap-connections/) to forward the authentication request to your LDAP server. Use TLS or LDAPS encrypted connections to the LDAP server to ensure transport level security. Optionally, synchronize roles and permissions using the [LDAP Group sync functionality](../../../system-admin-guide/authentication/ldap-connections/ldap-group-synchronization/).
- If your organization operates a central authentication services, it is very likely it supports one of the standard remote authentication mechanisms for single sign-on, such as [OpenID connect](../../../system-admin-guide/authentication/openid-providers/), [SAML](../../../system-admin-guide/authentication/saml/), or [Kerberos](../../../system-admin-guide/authentication/kerberos/). Use these mechanisms to ensure a standardized and secure authentication of users without requiring the storage of any credentials at OpenProject while providing a high level of usability due to centralized logins.

**References**
Expand Down
2 changes: 1 addition & 1 deletion docs/development/ldap/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ sidebar_navigation:

# Set up a development LDAP server

**Note:** This guide is targeted only at development with OpenProject. For the LDAP configuration guide, please see this [here](../../system-admin-guide/authentication/ldap-authentication/)
**Note:** This guide is targeted only at development with OpenProject. For the LDAP configuration guide, please see this [here](../../system-admin-guide/authentication/ldap-connections/)

OpenProject comes with a built-in LDAP server for development purposes. This server uses [ladle gem](https://github.com/NUBIC/ladle)
to run an underlying apacheDS server.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ Access to the database (including the PostgreSQL tables) is restricted for the E

## Can I use LDAP authentication in my Enterprise cloud environment?

You can use [LDAP authentication](../../../system-admin-guide/authentication/ldap-authentication/) in your cloud environment. **However**, usually LDAP servers will _not_ be exposed to the internet, which they have to be for this to work.
You can use [LDAP authentication](../../../system-admin-guide/authentication/ldap-connections/) in your cloud environment. **However**, usually LDAP servers will _not_ be exposed to the internet, which they have to be for this to work.
Whitelisting IPs is no option since the OpenProject servers' IPs are not permanent and can change without notice.
Moreover we do not have a mechanism to list all IP addresses currently in use.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ OpenProject provides means to fully erase both all identifiable information of a

- Data controllers can perform the deletion [through the administration](../../../system-admin-guide/users-permissions/users/).

- Depending on the configuration of your OpenProject instance, individual data subjects may perform the deletion of their own account through the [Delete Account](../../../getting-started/my-account/) page. If this is disabled, the request may be stated to the data controller.
- Depending on the configuration of your OpenProject instance, individual data subjects may perform the deletion of their own account through the [Delete Account](../../../user-guide/my-account/) page. If this is disabled, the request may be stated to the data controller.

### Data Portability

Expand Down
4 changes: 2 additions & 2 deletions docs/faq/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ However, if you're still using an old OpenProject subscription there may be limi

### What is the difference between Enterprise on-premises and Community edition regarding LDAP?

In the Community edition and in the Enterprise on-premises edition you can use the standard LDAP authentication. However, the Enterprise on-premises edition also includes LDAP group synchronization. This allows you to synchronize group members from LDAP with groups in OpenProject. The respective documentation can be found [here](../system-admin-guide/authentication/ldap-authentication/ldap-group-synchronization/#synchronize-ldap-and-openproject-groups-enterprise-add-on).
In the Community edition and in the Enterprise on-premises edition you can use the standard LDAP authentication. However, the Enterprise on-premises edition also includes LDAP group synchronization. This allows you to synchronize group members from LDAP with groups in OpenProject. The respective documentation can be found [here](../system-admin-guide/authentication/ldap-connections/ldap-group-synchronization/#synchronize-ldap-and-openproject-groups-enterprise-add-on).

## How to ... in OpenProject

Expand Down Expand Up @@ -151,7 +151,7 @@ Please find information on the features of OpenProject [here](https://www.openpr
### Is it possible to use multiple languages in OpenProject?

Yes, it is possible to use OpenProject in multiple languages. We support English, German, French and a number of additional languages. Each user can select their own preferred language by signing into OpenProject, clicking on the user avatar on the upper right side and selecting "My account" from the dropdown menu.
You can then select "Settings" from the side menu on the left side and [change the language](../getting-started/my-account/#change-your-language).
You can then select "Settings" from the side menu on the left side and [change the language](../user-guide/my-account/#change-your-language).

### Is there an OpenProject app?

Expand Down
Loading

0 comments on commit c1bddca

Please sign in to comment.