<% end %>
diff --git a/app/views/admin/backups/reset_token.html.erb b/app/views/admin/backups/reset_token.html.erb
index 91b8977b3af8..2abc3be990af 100644
--- a/app/views/admin/backups/reset_token.html.erb
+++ b/app/views/admin/backups/reset_token.html.erb
@@ -69,7 +69,7 @@ See COPYRIGHT and LICENSE files for more details.
- <%= styled_button_tag '', class: '-primary', disabled: true do
+ <%= styled_button_tag '', class: '-highlight', disabled: true do
concat content_tag :i, '', class: "button--icon icon-#{icon}"
concat content_tag :span, t("backup.reset_token.action_#{action}"), class: 'button--text'
end %>
diff --git a/app/views/admin/backups/show.html.erb b/app/views/admin/backups/show.html.erb
index c17f8d8a0ffe..071e15aea84d 100644
--- a/app/views/admin/backups/show.html.erb
+++ b/app/views/admin/backups/show.html.erb
@@ -36,7 +36,7 @@ See COPYRIGHT and LICENSE files for more details.
<%=
link_to(
{ action: 'reset_token' },
- class: 'button -primary',
+ class: 'button -alt-highlight',
aria: {label: label},
title: label
) do
@@ -52,7 +52,7 @@ See COPYRIGHT and LICENSE files for more details.
link_to(
{ action: 'delete_token' },
method: :post,
- class: 'button -primary',
+ class: 'button -alt-highlight',
aria: {label: label},
title: label
) do
diff --git a/app/views/admin/plugins.html.erb b/app/views/admin/plugins.html.erb
index 5ad7fe0851f0..2343204c7d44 100644
--- a/app/views/admin/plugins.html.erb
+++ b/app/views/admin/plugins.html.erb
@@ -27,7 +27,7 @@ See COPYRIGHT and LICENSE files for more details.
++#%>
<% html_title t(:label_administration), t(:label_plugins) %>
-<%= toolbar title: t(:label_plugins) %>
+<%= toolbar title: t(:label_modules_and_plugins) %>
<% if @plugins.any? %>
@@ -88,6 +88,5 @@ See COPYRIGHT and LICENSE files for more details.
<% else %>
- <%= no_results_box display_action: true,
- action_url: OpenProject::Static::Links.url_for(:integrations) %>
+ <%= no_results_box %>
<% end %>
diff --git a/app/views/admin/settings/aggregation_settings/show.html.erb b/app/views/admin/settings/aggregation_settings/show.html.erb
index 2e7fc0b2b362..dbd45c84e3f4 100644
--- a/app/views/admin/settings/aggregation_settings/show.html.erb
+++ b/app/views/admin/settings/aggregation_settings/show.html.erb
@@ -47,5 +47,5 @@ See COPYRIGHT and LICENSE files for more details.
- <%= styled_button_tag t(:button_save), class: '-primary -with-icon icon-checkmark' %>
+ <%= styled_button_tag t(:button_save), class: '-highlight -with-icon icon-checkmark' %>
<% end %>
diff --git a/app/views/admin/settings/api_settings/show.html.erb b/app/views/admin/settings/api_settings/show.html.erb
index 1f3e78ea358b..c2b2a97efe50 100644
--- a/app/views/admin/settings/api_settings/show.html.erb
+++ b/app/views/admin/settings/api_settings/show.html.erb
@@ -39,14 +39,6 @@ See COPYRIGHT and LICENSE files for more details.
<% end %>
<% end %>
diff --git a/app/views/groups/_users.html.erb b/app/views/groups/_users.html.erb
index cb511e6762d4..32fd094c0e8b 100644
--- a/app/views/groups/_users.html.erb
+++ b/app/views/groups/_users.html.erb
@@ -62,7 +62,7 @@ See COPYRIGHT and LICENSE files for more details.
<% end %>
diff --git a/app/views/groups/index.html.erb b/app/views/groups/index.html.erb
index e0894b0a9918..5a6c29f31355 100644
--- a/app/views/groups/index.html.erb
+++ b/app/views/groups/index.html.erb
@@ -31,7 +31,7 @@ See COPYRIGHT and LICENSE files for more details.
<%= toolbar title: t(:label_group_plural) do %>
<%= link_to new_group_path,
- { class: 'button -primary',
+ { class: 'button -alt-highlight',
aria: {label: t(:label_group_new)},
title: t(:label_group_new)} do %>
<%= op_icon('button--icon icon-add') %>
diff --git a/app/views/groups/new.html.erb b/app/views/groups/new.html.erb
index ef6c1e256e03..b4bbdf816a4c 100644
--- a/app/views/groups/new.html.erb
+++ b/app/views/groups/new.html.erb
@@ -33,5 +33,5 @@ See COPYRIGHT and LICENSE files for more details.
<%= labelled_tabular_form_for(@group) do |f| %>
<%= render partial: 'form', locals: { f: f } %>
-
@@ -103,7 +103,7 @@ See COPYRIGHT and LICENSE files for more details.
<%= wikitoolbar_for 'comment_comments', preview_context: preview_context(@news) %>
<% end %>
<% end %>
diff --git a/app/views/oauth/applications/edit.html.erb b/app/views/oauth/applications/edit.html.erb
index db35803c9adb..c56fe48382e8 100644
--- a/app/views/oauth/applications/edit.html.erb
+++ b/app/views/oauth/applications/edit.html.erb
@@ -39,6 +39,6 @@ See COPYRIGHT and LICENSE files for more details.
<%= render partial: 'form', locals: { f: f } %>
<% end %>
diff --git a/app/views/oauth/applications/index.html.erb b/app/views/oauth/applications/index.html.erb
index 20f3c4c732c6..47cb78921c1f 100644
--- a/app/views/oauth/applications/index.html.erb
+++ b/app/views/oauth/applications/index.html.erb
@@ -31,7 +31,7 @@ See COPYRIGHT and LICENSE files for more details.
<%= toolbar title: t('oauth.application.plural'), title_class: 'no-padding-bottom' do %>
<%= link_to new_oauth_application_path,
- { class: 'button -primary',
+ { class: 'button -alt-highlight',
title: t('oauth.application.new')} do %>
<%= op_icon('button--icon icon-add') %>
<%= t(:button_add) %>
diff --git a/app/views/oauth/applications/new.html.erb b/app/views/oauth/applications/new.html.erb
index c208d363ebcd..1ee51f8ec9ff 100644
--- a/app/views/oauth/applications/new.html.erb
+++ b/app/views/oauth/applications/new.html.erb
@@ -42,6 +42,6 @@ See COPYRIGHT and LICENSE files for more details.
<%= render partial: 'form', locals: { f: f } %>
<% end %>
diff --git a/app/views/projects/_toolbar.html.erb b/app/views/projects/_toolbar.html.erb
index d31df7c88e3c..49fba78032ef 100644
--- a/app/views/projects/_toolbar.html.erb
+++ b/app/views/projects/_toolbar.html.erb
@@ -31,7 +31,7 @@ See COPYRIGHT and LICENSE files for more details.
<% if User.current.allowed_in_project?(:add_subprojects, @project) %>
<%= link_to new_project_path(parent_id: @project.id),
- { class: 'button -primary',
+ { class: 'button -alt-highlight',
aria: {label: t(:label_subproject_new)},
title: t(:label_subproject_new)} do %>
<%= op_icon('button--icon icon-add') %>
diff --git a/app/views/projects/destroy_info.html.erb b/app/views/projects/destroy_info.html.erb
index b1b8adbb862d..4f5191b94d2b 100644
--- a/app/views/projects/destroy_info.html.erb
+++ b/app/views/projects/destroy_info.html.erb
@@ -56,7 +56,7 @@ See COPYRIGHT and LICENSE files for more details.
- <%= styled_button_tag title: t(:button_delete), class: '-primary', disabled: true do
+ <%= styled_button_tag title: t(:button_delete), class: '-highlight', disabled: true do
concat content_tag :i, '', class: 'button--icon icon-delete'
concat content_tag :span, t(:button_delete), class: 'button--text'
end %>
diff --git a/app/views/projects/identifier/show.html.erb b/app/views/projects/identifier/show.html.erb
index 7c59b32a8ec3..ff4b7ecabe62 100644
--- a/app/views/projects/identifier/show.html.erb
+++ b/app/views/projects/identifier/show.html.erb
@@ -49,11 +49,11 @@ See COPYRIGHT and LICENSE files for more details.
<%= f.text_field :identifier %>
- <%= f.submit t(:button_update), class: 'button -primary -with-icon icon-checkmark' %>
+ <%= f.submit t(:button_update), class: 'button -highlight -with-icon icon-checkmark' %>
<%= link_to project_settings_general_path(@project), class: 'button' do %>
- <%= op_icon('button--icon icon-cancel') %>
+ <%= op_icon('button--icon icon-cancel') %>
<%= t(:button_cancel) %>
<% end %>
diff --git a/app/views/projects/settings/categories/show.html.erb b/app/views/projects/settings/categories/show.html.erb
index be486d0a4c87..69d2edca9210 100644
--- a/app/views/projects/settings/categories/show.html.erb
+++ b/app/views/projects/settings/categories/show.html.erb
@@ -33,7 +33,7 @@ See COPYRIGHT and LICENSE files for more details.
<%= link_to_if_authorized({ controller: '/categories', action: 'new', project_id: @project },
{ aria: { label: t(:label_work_package_category_new) },
title: t(:label_work_package_category_new),
- class: 'button -primary'}) do %>
+ class: 'button -alt-highlight'}) do %>
<%= op_icon('icon-add button--icon') %>
<%= t('activerecord.models.category') %>
<% end %>
diff --git a/app/views/projects/settings/custom_fields/show.html.erb b/app/views/projects/settings/custom_fields/show.html.erb
index 6c8e10459d8c..abe34a478c83 100644
--- a/app/views/projects/settings/custom_fields/show.html.erb
+++ b/app/views/projects/settings/custom_fields/show.html.erb
@@ -33,7 +33,7 @@ See COPYRIGHT and LICENSE files for more details.
<% if current_user.admin? %>
<%= link_to new_custom_field_path(type: 'WorkPackageCustomField'),
- { class: 'button -primary',
+ { class: 'button -alt-highlight',
aria: {label: t(:label_custom_field_new)},
title: t(:label_custom_field_new)} do %>
<%= op_icon('button--icon icon-add') %>
@@ -56,7 +56,7 @@ See COPYRIGHT and LICENSE files for more details.
} %>
diff --git a/app/views/projects/settings/versions/show.html.erb b/app/views/projects/settings/versions/show.html.erb
index 84c6f7498a92..2cdf798b8c49 100644
--- a/app/views/projects/settings/versions/show.html.erb
+++ b/app/views/projects/settings/versions/show.html.erb
@@ -31,7 +31,7 @@ See COPYRIGHT and LICENSE files for more details.
<% if current_user.allowed_in_project?(:manage_versions, @project) %>
<%= link_to_if_authorized({ controller: '/versions', action: 'new', project_id: @project },
- { class: 'button -primary',
+ { class: 'button -alt-highlight',
aria: {label: t(:label_version_new)},
title: t(:label_version_new)}) do %>
<%= op_icon('button--icon icon-add') %>
diff --git a/app/views/repositories/committers.html.erb b/app/views/repositories/committers.html.erb
index e583ab76cb06..86291b1a6db6 100644
--- a/app/views/repositories/committers.html.erb
+++ b/app/views/repositories/committers.html.erb
@@ -75,12 +75,12 @@ See COPYRIGHT and LICENSE files for more details.
<% end -%>
-
+
- <%= submit_tag t(:button_update), class: 'button -primary' %>
+ <%= submit_tag t(:button_update), class: 'button -highlight' %>
<%= link_to project_settings_repository_path(@project.id), class: 'button' do %>
<%= t(:button_cancel) %>
<% end %>
diff --git a/app/views/repositories/destroy_info.html.erb b/app/views/repositories/destroy_info.html.erb
index df9adc05c824..090f2db5812d 100644
--- a/app/views/repositories/destroy_info.html.erb
+++ b/app/views/repositories/destroy_info.html.erb
@@ -51,7 +51,7 @@ See COPYRIGHT and LICENSE files for more details.
method: :delete,
title: t(:button_delete),
disabled: true,
- class: '-primary' do %>
+ class: '-highlight' do %>
<%= op_icon('button--icon icon-delete') %>
<%= t(:button_delete) %>
<% end %>
@@ -93,3 +93,4 @@ See COPYRIGHT and LICENSE files for more details.
<% end %>
+
diff --git a/app/views/repositories/revisions.html.erb b/app/views/repositories/revisions.html.erb
index c3b608a0179b..f198ce94364e 100644
--- a/app/views/repositories/revisions.html.erb
+++ b/app/views/repositories/revisions.html.erb
@@ -33,7 +33,7 @@ See COPYRIGHT and LICENSE files for more details.
<%= text_field_tag :rev, @rev, size: 8, placeholder: t(:label_revision) %>
<% end %>
<% end %>
diff --git a/app/views/roles/index.html.erb b/app/views/roles/index.html.erb
index 26d4fe75c5a7..15b4b57c5ebe 100644
--- a/app/views/roles/index.html.erb
+++ b/app/views/roles/index.html.erb
@@ -30,7 +30,7 @@ See COPYRIGHT and LICENSE files for more details.
<%= toolbar title: Role.model_name.human(count: 2) do %>
<%= link_to({ action: 'new'},
- { class: 'button -primary',
+ { class: 'button -alt-highlight',
aria: {label: t(:label_role_new)},
title: t(:label_role_new)}) do %>
<%= op_icon('button--icon icon-add') %>
diff --git a/app/views/roles/report.html.erb b/app/views/roles/report.html.erb
index 0be64fbdca8a..1d74b0c708c5 100644
--- a/app/views/roles/report.html.erb
+++ b/app/views/roles/report.html.erb
@@ -118,5 +118,5 @@ See COPYRIGHT and LICENSE files for more details.
<% end %>
-
diff --git a/app/views/types/form/_projects.html.erb b/app/views/types/form/_projects.html.erb
index db8349d0431b..1758232e7a57 100644
--- a/app/views/types/form/_projects.html.erb
+++ b/app/views/types/form/_projects.html.erb
@@ -55,6 +55,6 @@ See COPYRIGHT and LICENSE files for more details.
diff --git a/app/views/types/form/_settings.html.erb b/app/views/types/form/_settings.html.erb
index 1e170049953c..8a784ab50e3b 100644
--- a/app/views/types/form/_settings.html.erb
+++ b/app/views/types/form/_settings.html.erb
@@ -70,6 +70,6 @@ See COPYRIGHT and LICENSE files for more details.
diff --git a/app/views/types/index.html.erb b/app/views/types/index.html.erb
index d54eef893a95..b0db4a085f39 100644
--- a/app/views/types/index.html.erb
+++ b/app/views/types/index.html.erb
@@ -31,7 +31,7 @@ See COPYRIGHT and LICENSE files for more details.
<%= toolbar title: t(:label_work_package_types) do %>
<%= link_to new_type_path,
- { class: 'button -primary',
+ { class: 'button -alt-highlight',
aria: { label: t(:label_type_new) },
title: t(:label_type_new)} do %>
<%= op_icon('button--icon icon-add') %>
diff --git a/app/views/users/_general.html.erb b/app/views/users/_general.html.erb
index b818d5a8fb1e..f80127338136 100644
--- a/app/views/users/_general.html.erb
+++ b/app/views/users/_general.html.erb
@@ -54,5 +54,5 @@ See COPYRIGHT and LICENSE files for more details.
as: :user do |f| %>
<%= render partial: 'form', locals: { f: f } %>
- <%= styled_button_tag t(:button_save), class: '-primary -with-icon icon-checkmark' %>
+ <%= styled_button_tag t(:button_save), class: '-highlight -with-icon icon-checkmark' %>
<% end %>
diff --git a/app/views/users/_toolbar.html.erb b/app/views/users/_toolbar.html.erb
index 1dae67593a6d..a7c07cd796e1 100644
--- a/app/views/users/_toolbar.html.erb
+++ b/app/views/users/_toolbar.html.erb
@@ -35,9 +35,9 @@ See COPYRIGHT and LICENSE files for more details.
<% if current_user.allowed_globally?(:create_user) %>
- <%= form_for(@user,
- url: { action: :resend_invitation },
- method: :post) do |_form| %>
+ <%= form_for(@user, html: { class: 'toolbar-item' },
+ url: { action: :resend_invitation },
+ method: :post) do |_form| %>
<%= op_icon('button--icon icon-mail1') %>
<%= t(:label_send_invitation) %>
@@ -47,13 +47,12 @@ See COPYRIGHT and LICENSE files for more details.
<% end %>
<% if current_user.admin? %>
<% unless current_user.id == @user.id %>
-
<%= pagination_links_full @versions %>
<% end %>
diff --git a/app/views/wiki/rename.html.erb b/app/views/wiki/rename.html.erb
index 617f5e98e2c9..674597a208df 100644
--- a/app/views/wiki/rename.html.erb
+++ b/app/views/wiki/rename.html.erb
@@ -39,5 +39,5 @@ See COPYRIGHT and LICENSE files for more details.
<%= f.check_box :redirect_existing_links %>
- <%= submit_tag t(:button_rename), class: 'button -primary' %>
+ <%= submit_tag t(:button_rename), class: 'button -highlight' %>
<% end %>
diff --git a/app/views/wiki/show.html.erb b/app/views/wiki/show.html.erb
index 413d66c847cb..e6fc7a40cf9c 100644
--- a/app/views/wiki/show.html.erb
+++ b/app/views/wiki/show.html.erb
@@ -44,7 +44,7 @@ See COPYRIGHT and LICENSE files for more details.
<% if @page && User.current.allowed_in_project?(:edit_wiki_pages, @project) %>
<%= link_to({controller: '/wiki', action: 'new_child', project_id: @project.identifier, id: @page},
- { class: 'button -primary',
+ { class: 'button -alt-highlight',
aria: {label: t('wiki.index.no_results_content_text')},
title: t('wiki.index.no_results_content_text')}) do %>
<%= op_icon('button--icon icon-add') %>
diff --git a/app/views/wiki_menu_items/edit.html.erb b/app/views/wiki_menu_items/edit.html.erb
index 8be0870396af..ee74b41bd285 100644
--- a/app/views/wiki_menu_items/edit.html.erb
+++ b/app/views/wiki_menu_items/edit.html.erb
@@ -61,7 +61,7 @@ See COPYRIGHT and LICENSE files for more details.
@@ -79,7 +79,7 @@ See COPYRIGHT and LICENSE files for more details.
<%= render partial: 'form', locals: { name: 'assignee', workflows: @workflows['assignee'] } %>
<% end %>
- <%= styled_button_tag t(:button_save), class: '-primary -with-icon icon-checkmark' %>
+ <%= styled_button_tag t(:button_save), class: '-highlight -with-icon icon-checkmark' %>
<% end %>
<% end %>
diff --git a/app/workers/application_job.rb b/app/workers/application_job.rb
index 44643a51945d..de6bccc0067e 100644
--- a/app/workers/application_job.rb
+++ b/app/workers/application_job.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require "active_job"
+require 'active_job'
class ApplicationJob < ActiveJob::Base
include ::JobStatus::ApplicationJobWithStatus
@@ -92,10 +92,6 @@ def reload_mailer_settings!
Setting.reload_mailer_settings!
end
- def job_scheduled_at
- GoodJob::Job.where(id: job_id).pick(:scheduled_at)
- end
-
private
def prepare_job_context
diff --git a/app/workers/attachments/cleanup_uncontainered_job.rb b/app/workers/attachments/cleanup_uncontainered_job.rb
index 5b0dc599ef53..729fd37231be 100644
--- a/app/workers/attachments/cleanup_uncontainered_job.rb
+++ b/app/workers/attachments/cleanup_uncontainered_job.rb
@@ -26,9 +26,12 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-class Attachments::CleanupUncontaineredJob < ApplicationJob
+class Attachments::CleanupUncontaineredJob < Cron::CronJob
queue_with_priority :low
+ # runs at 10:03 pm
+ self.cron_expression = '03 22 * * *'
+
def perform
Attachment
.where(container: nil)
@@ -47,7 +50,7 @@ def too_old
attachment_table = Attachment.arel_table
attachment_table[:created_at]
- .lteq(Time.zone.now - OpenProject::Configuration.attachments_grace_period.minutes)
+ .lteq(Time.now - OpenProject::Configuration.attachments_grace_period.minutes)
.to_sql
end
end
diff --git a/app/workers/attachments/extract_fulltext_job.rb b/app/workers/attachments/extract_fulltext_job.rb
index a9379778bd87..b00d13c4bb46 100644
--- a/app/workers/attachments/extract_fulltext_job.rb
+++ b/app/workers/attachments/extract_fulltext_job.rb
@@ -67,7 +67,7 @@ def init
def update
Attachment
.where(id: @attachment_id)
- .update_all(["fulltext = ?, fulltext_tsv = to_tsvector(?, ?), file_tsv = to_tsvector(?, ?)",
+ .update_all(['fulltext = ?, fulltext_tsv = to_tsvector(?, ?), file_tsv = to_tsvector(?, ?)',
@text,
@language,
OpenProject::FullTextSearch.normalize_text(@text),
diff --git a/app/workers/attachments/virus_rescan_job.rb b/app/workers/attachments/virus_rescan_job.rb
index 7b568eb0416a..76a5400a4ff8 100644
--- a/app/workers/attachments/virus_rescan_job.rb
+++ b/app/workers/attachments/virus_rescan_job.rb
@@ -34,7 +34,7 @@ def perform
return unless Setting::VirusScanning.enabled?
User.execute_as(User.system) do
- OpenProject::Mutex.with_advisory_lock(Attachment, "virus_rescan") do
+ OpenProject::Mutex.with_advisory_lock(Attachment, 'virus_rescan') do
Attachment.status_rescan.find_each do |attachment|
scan_attachment(attachment)
rescue StandardError => e
@@ -48,7 +48,7 @@ def perform
def redirect_status
path = ApplicationController.helpers.admin_quarantined_attachments_path
payload = redirect_payload(path)
- html = I18n.t("settings.antivirus.remaining_scan_complete_html",
+ html = I18n.t('settings.antivirus.remaining_scan_complete_html',
file_count: I18n.t(:label_x_files, count: Attachment.status_quarantined.count))
upsert_status(
diff --git a/app/workers/attachments/virus_scan_job.rb b/app/workers/attachments/virus_scan_job.rb
index bbcf757670c9..a6988b0ae503 100644
--- a/app/workers/attachments/virus_scan_job.rb
+++ b/app/workers/attachments/virus_scan_job.rb
@@ -40,7 +40,7 @@ def perform(attachment)
return unless attachment.status_uploaded?
User.execute_as(User.system) do
- OpenProject::Mutex.with_advisory_lock_transaction(attachment, "virus_scan") do
+ OpenProject::Mutex.with_advisory_lock_transaction(attachment, 'virus_scan') do
scan_attachment(attachment)
end
end
@@ -84,11 +84,11 @@ def handle_virus_response(attachment, virus_name)
def delete_attachment(attachment)
container = attachment.container
attachment.destroy!
- create_journal(container, I18n.t("antivirus_scan.deleted_message", filename: attachment.filename))
+ create_journal(container, I18n.t('antivirus_scan.deleted_message', filename: attachment.filename))
end
def quarantine_attachment(attachment)
- create_journal(attachment.container, I18n.t("antivirus_scan.quarantined_message", filename: attachment.filename))
+ create_journal(attachment.container, I18n.t('antivirus_scan.quarantined_message', filename: attachment.filename))
attachment.update!(status: :quarantined)
end
diff --git a/app/workers/concerns/scheduled_job.rb b/app/workers/concerns/scheduled_job.rb
new file mode 100644
index 000000000000..8c7516a31ec5
--- /dev/null
+++ b/app/workers/concerns/scheduled_job.rb
@@ -0,0 +1,41 @@
+# OpenProject is an open source project management software.
+# Copyright (C) 2010-2022 the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+
+module ScheduledJob
+ extend ActiveSupport::Concern
+
+ class_methods do
+ ##
+ # Is there a job scheduled?
+ def scheduled?
+ delayed_job_query.exists?
+ end
+
+ def delayed_job_query
+ Delayed::Job.where('handler LIKE ?', "%job_class: #{name}%")
+ end
+ end
+end
diff --git a/app/workers/copy_project_job.rb b/app/workers/copy_project_job.rb
index b983393537dc..27b2018b7bfd 100644
--- a/app/workers/copy_project_job.rb
+++ b/app/workers/copy_project_job.rb
@@ -68,7 +68,7 @@ def perform(user_id:,
end
rescue StandardError => e
logger.error { "Failed to finish copy project job: #{e} #{e.message}" }
- errors = [I18n.t("copy_project.failed_internal")]
+ errors = [I18n.t('copy_project.failed_internal')]
failure_status_update
ProjectMailer.copy_project_failed(user, source_project, target_project_name, errors).deliver_later
end
@@ -98,12 +98,12 @@ def successful_status_update
end
upsert_status status: :success,
- message: I18n.t("copy_project.succeeded", target_project_name: target_project.name),
+ message: I18n.t('copy_project.succeeded', target_project_name: target_project.name),
payload:
end
def failure_status_update
- message = I18n.t("copy_project.failed", source_project_name: source_project.name)
+ message = I18n.t('copy_project.failed', source_project_name: source_project.name)
if errors
message << ": #{errors.join("\n")}"
@@ -150,11 +150,11 @@ def create_project_copy
rescue ActiveRecord::RecordNotFound => e
logger.error("Entity missing: #{e.message} #{e.backtrace.join("\n")}")
rescue StandardError => e
- logger.error("Encountered an error when trying to copy project " \
+ logger.error('Encountered an error when trying to copy project ' \
"'#{source_project_id}' : #{e.message} #{e.backtrace.join("\n")}")
ensure
unless errors.empty?
- logger.error("Encountered an errors while trying to copy related objects for " \
+ logger.error('Encountered an errors while trying to copy related objects for ' \
"project '#{source_project_id}': #{errors.inspect}")
end
end
diff --git a/app/workers/cron/clear_old_sessions_job.rb b/app/workers/cron/clear_old_sessions_job.rb
index 8c50a5b8e531..e53494d626d3 100644
--- a/app/workers/cron/clear_old_sessions_job.rb
+++ b/app/workers/cron/clear_old_sessions_job.rb
@@ -27,11 +27,14 @@
#++
module Cron
- class ClearOldSessionsJob < ApplicationJob
+ class ClearOldSessionsJob < CronJob
include ::RakeJob
+ # runs at 1:15 nightly
+ self.cron_expression = '15 1 * * *'
+
def perform
- super("db:sessions:expire", 7)
+ super('db:sessions:expire', 7)
end
end
end
diff --git a/app/workers/cron/clear_tmp_cache_job.rb b/app/workers/cron/clear_tmp_cache_job.rb
index 17d78e6cfd2d..8ac9a6c21016 100644
--- a/app/workers/cron/clear_tmp_cache_job.rb
+++ b/app/workers/cron/clear_tmp_cache_job.rb
@@ -27,11 +27,14 @@
#++
module Cron
- class ClearTmpCacheJob < ApplicationJob
+ class ClearTmpCacheJob < CronJob
include ::RakeJob
+ # runs at 02:45 sundays
+ self.cron_expression = '45 2 * * 7'
+
def perform
- super("tmp:cache:clear")
+ super('tmp:cache:clear')
end
end
end
diff --git a/app/workers/cron/clear_uploaded_files_job.rb b/app/workers/cron/clear_uploaded_files_job.rb
index 5086ea9dc3e9..458615f98b07 100644
--- a/app/workers/cron/clear_uploaded_files_job.rb
+++ b/app/workers/cron/clear_uploaded_files_job.rb
@@ -27,11 +27,14 @@
#++
module Cron
- class ClearUploadedFilesJob < ApplicationJob
+ class ClearUploadedFilesJob < CronJob
include ::RakeJob
+ # Runs 23pm fridays
+ self.cron_expression = '0 23 * * 5'
+
def perform
- super("attachments:clear")
+ super('attachments:clear')
end
end
end
diff --git a/spec/services/projects/create_service_integration_spec.rb b/app/workers/cron/cron_job.rb
similarity index 53%
rename from spec/services/projects/create_service_integration_spec.rb
rename to app/workers/cron/cron_job.rb
index d1b13119ed5d..a2afe9f260d6 100644
--- a/spec/services/projects/create_service_integration_spec.rb
+++ b/app/workers/cron/cron_job.rb
@@ -26,46 +26,50 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require "spec_helper"
+module Cron
+ class CronJob < ApplicationJob
+ class_attribute :cron_expression
-RSpec.describe Projects::CreateService, "integration", type: :model do
- let(:instance) { described_class.new(user:) }
- let(:new_project) { service_result.result }
- let(:service_result) { instance.call(**attributes) }
+ # List of registered jobs, requires eager load in dev(!)
+ class_attribute :registered_jobs, default: []
- before do
- login_as(user)
- end
+ include ScheduledJob
- describe "writing created_at timestamp" do
- shared_let(:user) { create(:admin) }
+ class << self
+ ##
+ # Register new job class(es)
+ def register!(*job_classes)
+ Array(job_classes).each do |clz|
+ raise ArgumentError, "Needs to be subclass of ::Cron::CronJob" unless clz.ancestors.include?(self)
- let(:created_at) { 11.days.ago }
+ registered_jobs << clz
+ end
+ end
- let(:attributes) do
- {
- name: "test",
- created_at:,
- }
- end
+ def schedule_registered_jobs!
+ registered_jobs.each do |job_class|
+ job_class.ensure_scheduled!
+ end
+ end
- context "when enabled", with_settings: { apiv3_write_readonly_attributes: true } do
- it "updates the timestamps correctly" do
- expect(service_result)
- .to be_success
+ ##
+ # Ensure the job is scheduled unless it is already
+ def ensure_scheduled!
+ # Ensure scheduled only once
+ return if scheduled?
- new_project.reload
- expect(new_project.created_at).to be_within(1.second).of created_at
+ Rails.logger.info { "Scheduling #{name} recurrent background job." }
+ set(cron: cron_expression).perform_later
end
- end
- context "when disabled", with_settings: { apiv3_write_readonly_attributes: false } do
- it "rejects the creation" do
- expect(service_result)
- .not_to be_success
+ ##
+ # Remove the scheduled job, if any
+ def remove
+ delayed_job&.destroy
+ end
- expect(new_project.errors.symbols_for(:created_at))
- .to contain_exactly(:error_readonly)
+ def delayed_job
+ delayed_job_query.first
end
end
end
diff --git a/app/workers/exports/cleanup_outdated_job.rb b/app/workers/exports/cleanup_outdated_job.rb
index ad081368538a..cc0d4c598b8b 100644
--- a/app/workers/exports/cleanup_outdated_job.rb
+++ b/app/workers/exports/cleanup_outdated_job.rb
@@ -35,7 +35,7 @@ def self.perform_after_grace
def perform
Export
- .where("created_at <= ?", Time.current - OpenProject::Configuration.attachments_grace_period.minutes)
+ .where('created_at <= ?', Time.current - OpenProject::Configuration.attachments_grace_period.minutes)
.destroy_all
end
end
diff --git a/app/workers/exports/export_job.rb b/app/workers/exports/export_job.rb
index 7b805fc15e66..c3c5165535ef 100644
--- a/app/workers/exports/export_job.rb
+++ b/app/workers/exports/export_job.rb
@@ -1,4 +1,4 @@
-require "active_storage/filename"
+require 'active_storage/filename'
module Exports
class ExportJob < ::ApplicationJob
@@ -90,7 +90,7 @@ def store_from_string(export, export_result)
end
def with_tempfile(title, content)
- name_parts = [title[0..title.rindex(".") - 1], title[title.rindex(".")..]]
+ name_parts = [title[0..title.rindex('.') - 1], title[title.rindex('.')..]]
Tempfile.create(name_parts, encoding: content.encoding) do |file|
file.write content
@@ -104,19 +104,19 @@ def store_attachment(container, file, export_result)
call = Attachments::CreateService
.bypass_whitelist(user: User.current)
- .call(container:, file:, filename:, description: "")
+ .call(container:, file:, filename:, description: '')
call.on_success do
download_url = ::API::V3::Utilities::PathHelper::ApiV3Path.attachment_content(call.result.id)
upsert_status status: :success,
- message: I18n.t("export.succeeded"),
+ message: I18n.t('export.succeeded'),
payload: download_payload(download_url)
end
call.on_failure do
upsert_status status: :failure,
- message: I18n.t("export.failed", message: call.message)
+ message: I18n.t('export.failed', message: call.message)
end
end
end
diff --git a/app/workers/ldap/synchronization_job.rb b/app/workers/ldap/synchronization_job.rb
index a100d5b87898..e584179d931e 100644
--- a/app/workers/ldap/synchronization_job.rb
+++ b/app/workers/ldap/synchronization_job.rb
@@ -27,7 +27,10 @@
#++
module Ldap
- class SynchronizationJob < ApplicationJob
+ class SynchronizationJob < ::Cron::CronJob
+ # Run once per night at 11:30pm
+ self.cron_expression = '30 23 * * *'
+
def perform
run_user_sync
end
diff --git a/app/workers/mails/deliver_job.rb b/app/workers/mails/deliver_job.rb
index 5520973a911b..638fa27bad84 100644
--- a/app/workers/mails/deliver_job.rb
+++ b/app/workers/mails/deliver_job.rb
@@ -55,7 +55,7 @@ def deliver_mail
# To be implemented by subclasses.
# Returns a Mail::Message, or nil if no message should be sent.
def render_mail
- raise NotImplementedError, "SubclassResponsibility"
+ raise NotImplementedError, 'SubclassResponsibility'
end
def build_mail
diff --git a/app/workers/mails/watcher_added_job.rb b/app/workers/mails/watcher_added_job.rb
index 75039dc846d8..d3f53260398d 100644
--- a/app/workers/mails/watcher_added_job.rb
+++ b/app/workers/mails/watcher_added_job.rb
@@ -30,6 +30,6 @@ class Mails::WatcherAddedJob < Mails::WatcherJob
private
def action
- "added"
+ 'added'
end
end
diff --git a/app/workers/mails/watcher_job.rb b/app/workers/mails/watcher_job.rb
index 719157488e9c..6eee3ae40797 100644
--- a/app/workers/mails/watcher_job.rb
+++ b/app/workers/mails/watcher_job.rb
@@ -71,6 +71,6 @@ def self_watching?
end
def action
- raise NotImplementedError, "subclass responsibility"
+ raise NotImplementedError, 'subclass responsibility'
end
end
diff --git a/app/workers/mails/watcher_removed_job.rb b/app/workers/mails/watcher_removed_job.rb
index a1be42f12faa..6148551762f2 100644
--- a/app/workers/mails/watcher_removed_job.rb
+++ b/app/workers/mails/watcher_removed_job.rb
@@ -36,6 +36,6 @@ def perform(watcher_attributes, watcher_changer)
private
def action
- "removed"
+ 'removed'
end
end
diff --git a/app/workers/mails/work_package_shared_job.rb b/app/workers/mails/work_package_shared_job.rb
index eebae90c37e8..2fa52f3a4802 100644
--- a/app/workers/mails/work_package_shared_job.rb
+++ b/app/workers/mails/work_package_shared_job.rb
@@ -67,8 +67,8 @@ def newly_invited_group_user_member_ids(work_package_member:)
.joins(:member_roles)
.references(:member_roles)
.where(principal: work_package_member.principal.users)
- .group("members.id")
+ .group('members.id')
.having("COUNT(*) = 1")
- .select("members.id")
+ .select('members.id')
end
end
diff --git a/app/workers/notifications/schedule_date_alerts_notifications_job.rb b/app/workers/notifications/schedule_date_alerts_notifications_job.rb
index 525a0473bddf..43c5bd810bd4 100644
--- a/app/workers/notifications/schedule_date_alerts_notifications_job.rb
+++ b/app/workers/notifications/schedule_date_alerts_notifications_job.rb
@@ -28,11 +28,15 @@
module Notifications
# Creates date alert jobs for users whose local time is 1:00 am.
- class ScheduleDateAlertsNotificationsJob < ApplicationJob
+ class ScheduleDateAlertsNotificationsJob < Cron::CronJob
+ # runs every quarter of an hour, so 00:00, 00:15,..., 15:30, 15:45, 16:00, ...
+ self.cron_expression = '*/15 * * * *'
+
def perform
return unless EnterpriseToken.allows_to?(:date_alerts)
- Service.new(times_from_scheduled_to_execution).call
+ service = Service.new(times_from_scheduled_to_execution)
+ service.call
end
# Returns times from scheduled execution time to current time in 15 minutes
@@ -53,7 +57,7 @@ def times_from_scheduled_to_execution
end
def scheduled_time
- job_scheduled_at.then { |t| t.change(min: t.min / 15 * 15) }
+ self.class.delayed_job.run_at.then { |t| t.change(min: t.min / 15 * 15) }
end
end
end
diff --git a/app/workers/notifications/schedule_date_alerts_notifications_job/service.rb b/app/workers/notifications/schedule_date_alerts_notifications_job/service.rb
index fb11bc3cea52..b52ebe0650f3 100644
--- a/app/workers/notifications/schedule_date_alerts_notifications_job/service.rb
+++ b/app/workers/notifications/schedule_date_alerts_notifications_job/service.rb
@@ -61,7 +61,7 @@ def executing_at_1am_for_timezone?(time_zone)
def is_1am?(time, time_zone)
local_time = time.in_time_zone(time_zone)
- local_time.strftime("%H:%M") == "01:00"
+ local_time.strftime('%H:%M') == '01:00'
end
def users_at_1am_with_notification_settings
diff --git a/app/workers/notifications/schedule_reminder_mails_job.rb b/app/workers/notifications/schedule_reminder_mails_job.rb
index 0c17199d1c79..0932594fbda0 100644
--- a/app/workers/notifications/schedule_reminder_mails_job.rb
+++ b/app/workers/notifications/schedule_reminder_mails_job.rb
@@ -27,13 +27,18 @@
#++
module Notifications
- class ScheduleReminderMailsJob < ApplicationJob
+ class ScheduleReminderMailsJob < Cron::CronJob
+ # runs every quarter of an hour, so 00:00, 00:15...
+ self.cron_expression = '*/15 * * * *'
+
def perform
- User.having_reminder_mail_to_send(job_scheduled_at)
- .pluck(:id)
- .each do |user_id|
+ User.having_reminder_mail_to_send(run_at).pluck(:id).each do |user_id|
Mails::ReminderJob.perform_later(user_id)
end
end
+
+ def run_at
+ self.class.delayed_job.run_at
+ end
end
end
diff --git a/app/workers/oauth/cleanup_job.rb b/app/workers/oauth/cleanup_job.rb
index f08ea238262a..3295cb0e82b4 100644
--- a/app/workers/oauth/cleanup_job.rb
+++ b/app/workers/oauth/cleanup_job.rb
@@ -27,13 +27,16 @@
#++
module OAuth
- class CleanupJob < ApplicationJob
+ class CleanupJob < ::Cron::CronJob
include ::RakeJob
+ # runs at 1:52 nightly
+ self.cron_expression = '52 1 * * *'
+
queue_with_priority :low
def perform
- super("doorkeeper:db:cleanup")
+ super('doorkeeper:db:cleanup')
end
end
end
diff --git a/app/workers/paper_trail_audits/cleanup_job.rb b/app/workers/paper_trail_audits/cleanup_job.rb
index c593ab4c93e4..634f240c7641 100644
--- a/app/workers/paper_trail_audits/cleanup_job.rb
+++ b/app/workers/paper_trail_audits/cleanup_job.rb
@@ -27,11 +27,14 @@
#++
module PaperTrailAudits
- class CleanupJob < ApplicationJob
+ class CleanupJob < ::Cron::CronJob
+ # runs at 4:03 on Saturday
+ self.cron_expression = '3 4 * * 6'
+
# Clean any paper trails older than 60 days
def perform
::PaperTrailAudit
- .where("created_at < ?", 60.days.ago)
+ .where('created_at < ?', 60.days.ago)
.delete_all
end
end
diff --git a/app/workers/projects/delete_project_job.rb b/app/workers/projects/delete_project_job.rb
index 305134c61b14..34787de4db4c 100644
--- a/app/workers/projects/delete_project_job.rb
+++ b/app/workers/projects/delete_project_job.rb
@@ -43,7 +43,7 @@ def execute(project:)
"#{service_call.message}")
end
rescue StandardError => e
- OpenProject.logger.error("Encountered an error when trying to delete project " \
+ OpenProject.logger.error('Encountered an error when trying to delete project ' \
"'#{project}' : #{e.message} #{e.backtrace.join("\n")}")
end
end
diff --git a/app/workers/projects/export_job.rb b/app/workers/projects/export_job.rb
index 08d649580fce..28d4ebb012c2 100644
--- a/app/workers/projects/export_job.rb
+++ b/app/workers/projects/export_job.rb
@@ -1,4 +1,4 @@
-require "active_storage/filename"
+require 'active_storage/filename'
module Projects
class ExportJob < ::Exports::ExportJob
diff --git a/db/migrate/20240306154735_create_good_job_labels_index.rb b/app/workers/projects/reorder_hierarchy_job.rb
similarity index 54%
rename from db/migrate/20240306154735_create_good_job_labels_index.rb
rename to app/workers/projects/reorder_hierarchy_job.rb
index cbfc68793565..eafa3ed0efd5 100644
--- a/db/migrate/20240306154735_create_good_job_labels_index.rb
+++ b/app/workers/projects/reorder_hierarchy_job.rb
@@ -1,5 +1,3 @@
-# frozen_string_literal: true
-
#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) 2012-2024 the OpenProject GmbH
@@ -28,21 +26,46 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-class CreateGoodJobLabelsIndex < ActiveRecord::Migration[7.1]
- disable_ddl_transaction!
+module Projects
+ class ReorderHierarchyJob < ApplicationJob
+ def perform
+ Rails.logger.info { "Resorting siblings by name in the project's nested set." }
+ Project.transaction { reorder! }
+ end
- def change
- reversible do |dir|
- dir.up do
- unless connection.index_name_exists?(:good_jobs, :index_good_jobs_on_labels)
- add_index :good_jobs, :labels, using: :gin, where: "(labels IS NOT NULL)",
- name: :index_good_jobs_on_labels, algorithm: :concurrently
- end
- end
+ private
+
+ def reorder!
+ # Reorder the project roots
+ reorder_siblings Project.roots
+
+ # Reorder every project hierarchy
+ Project
+ .where(id: unique_parent_ids)
+ .find_each { |project| reorder_siblings(project.children) }
+ end
+
+ def unique_parent_ids
+ Project
+ .where.not(parent_id: nil)
+ .select(:parent_id)
+ .distinct
+ end
+
+ def reorder_siblings(siblings)
+ return unless siblings.many?
+
+ # Resort children manually
+ sorted = siblings.sort_by { |project| project.name.downcase }
+
+ # Get the current first child
+ first = siblings.first
- dir.down do
- if connection.index_name_exists?(:good_jobs, :index_good_jobs_on_labels)
- remove_index :good_jobs, name: :index_good_jobs_on_labels
+ sorted.each_with_index do |child, i|
+ if i == 0
+ child.move_to_left_of(first) unless child == first
+ else
+ child.move_to_right_of(sorted[i - 1])
end
end
end
diff --git a/app/workers/rake_job.rb b/app/workers/rake_job.rb
index a86cf73635a7..dfeb57477aa8 100644
--- a/app/workers/rake_job.rb
+++ b/app/workers/rake_job.rb
@@ -25,7 +25,7 @@
#
# See COPYRIGHT and LICENSE files for more details.
#++
-require "rake"
+require 'rake'
##
# Invoke a rake task while safely loading the tasks only once
diff --git a/app/workers/scm/create_local_repository_job.rb b/app/workers/scm/create_local_repository_job.rb
index 109799ef4a77..3ccdb62a9a34 100644
--- a/app/workers/scm/create_local_repository_job.rb
+++ b/app/workers/scm/create_local_repository_job.rb
@@ -38,7 +38,7 @@ def self.ensure_not_existing!(repository)
# Cowardly refusing to override existing local repository
if File.directory?(repository.root_url)
raise OpenProject::SCM::Exceptions::SCMError.new(
- I18n.t("repositories.errors.exists_on_filesystem")
+ I18n.t('repositories.errors.exists_on_filesystem')
)
end
end
diff --git a/app/workers/scm/create_remote_repository_job.rb b/app/workers/scm/create_remote_repository_job.rb
index d72aff9ce9de..17e85b8d86c7 100644
--- a/app/workers/scm/create_remote_repository_job.rb
+++ b/app/workers/scm/create_remote_repository_job.rb
@@ -39,12 +39,12 @@ def perform(repository)
super(repository)
response = send_request(repository_request.merge(action: :create))
- repository.root_url = response["path"]
- repository.url = response["url"]
+ repository.root_url = response['path']
+ repository.url = response['url']
unless repository.save
raise OpenProject::SCM::Exceptions::SCMError.new(
- I18n.t("repositories.errors.remote_save_failed")
+ I18n.t('repositories.errors.remote_save_failed')
)
end
end
diff --git a/app/workers/scm/relocate_repository_job.rb b/app/workers/scm/relocate_repository_job.rb
index c00fbc238327..f60627962936 100644
--- a/app/workers/scm/relocate_repository_job.rb
+++ b/app/workers/scm/relocate_repository_job.rb
@@ -50,8 +50,8 @@ def relocate_remote
action: :relocate,
old_identifier: File.basename(repository.root_url)
))
- repository.root_url = response["path"]
- repository.url = response["url"]
+ repository.root_url = response['path']
+ repository.url = response['url']
unless repository.save
Rails.logger.error("Could not relocate the remote repository " \
diff --git a/app/workers/scm/remote_repository_job.rb b/app/workers/scm/remote_repository_job.rb
index 25fddd5891d8..8f7360f2460f 100644
--- a/app/workers/scm/remote_repository_job.rb
+++ b/app/workers/scm/remote_repository_job.rb
@@ -34,7 +34,7 @@
# creation and deletion of repositories BOTH on the database and filesystem.
# Until then, a synchronous process is more failsafe.
-require "net/http"
+require 'net/http'
class SCM::RemoteRepositoryJob < ApplicationJob
attr_reader :repository
@@ -49,11 +49,11 @@ def perform(repository)
# Submits the request to the configured managed remote as JSON.
def send_request(request)
uri = repository.class.managed_remote
- req = ::Net::HTTP::Post.new(uri, "Content-Type" => "application/json")
+ req = ::Net::HTTP::Post.new(uri, 'Content-Type' => 'application/json')
req.body = request.to_json
http = Net::HTTP.new(uri.host, uri.port)
- http.use_ssl = uri.scheme == "https"
+ http.use_ssl = uri.scheme == 'https'
http.verify_mode = configured_verification
response = http.request(req)
@@ -61,9 +61,9 @@ def send_request(request)
unless response.is_a? ::Net::HTTPSuccess
raise OpenProject::SCM::Exceptions::SCMError.new(
- I18n.t("repositories.errors.remote_call_failed",
+ I18n.t('repositories.errors.remote_call_failed',
code: response.code,
- message: info["message"])
+ message: info['message'])
)
end
@@ -74,7 +74,7 @@ def try_to_parse_response(body)
JSON.parse(body)
rescue JSON::JSONError => e
raise OpenProject::SCM::Exceptions::SCMError.new(
- I18n.t("repositories.errors.remote_invalid_response")
+ I18n.t('repositories.errors.remote_invalid_response')
)
end
diff --git a/app/workers/work_packages/apply_working_days_change_job.rb b/app/workers/work_packages/apply_working_days_change_job.rb
index feff945dc083..db79c3c43019 100644
--- a/app/workers/work_packages/apply_working_days_change_job.rb
+++ b/app/workers/work_packages/apply_working_days_change_job.rb
@@ -27,12 +27,8 @@
#++
class WorkPackages::ApplyWorkingDaysChangeJob < ApplicationJob
- include JobConcurrency
queue_with_priority :above_normal
-
- good_job_control_concurrency_with(
- total_limit: 1
- )
+ include ::ScheduledJob
def perform(user_id:, previous_working_days:, previous_non_working_days:)
user = User.find(user_id)
diff --git a/app/workers/work_packages/bulk_copy_job.rb b/app/workers/work_packages/bulk_copy_job.rb
index 7ad99e4328ca..cee69afb9bd7 100644
--- a/app/workers/work_packages/bulk_copy_job.rb
+++ b/app/workers/work_packages/bulk_copy_job.rb
@@ -39,7 +39,7 @@ def success_message
end
def failure_message
- I18n.t("work_packages.bulk.copy_failed")
+ I18n.t('work_packages.bulk.copy_failed')
end
end
end
diff --git a/app/workers/work_packages/bulk_move_job.rb b/app/workers/work_packages/bulk_move_job.rb
index 5929f47adca1..abeb0897162b 100644
--- a/app/workers/work_packages/bulk_move_job.rb
+++ b/app/workers/work_packages/bulk_move_job.rb
@@ -39,7 +39,7 @@ def success_message
end
def failure_message
- I18n.t("work_packages.bulk.move_failed")
+ I18n.t('work_packages.bulk.move_failed')
end
end
end
diff --git a/app/workers/work_packages/export_job.rb b/app/workers/work_packages/export_job.rb
index 1653ba317b9a..9480accda02d 100644
--- a/app/workers/work_packages/export_job.rb
+++ b/app/workers/work_packages/export_job.rb
@@ -1,11 +1,11 @@
-require "active_storage/filename"
+require 'active_storage/filename'
module WorkPackages
class ExportJob < ::Exports::ExportJob
self.model = WorkPackage
def title
- I18n.t("export.your_work_packages_export")
+ I18n.t('export.your_work_packages_export')
end
private
@@ -15,7 +15,7 @@ def prepare!
end
def set_query_props(query, query_attributes)
- filters = query_attributes.delete("filters")
+ filters = query_attributes.delete('filters')
filters = Queries::WorkPackages::FilterSerializer.load(filters)
query.tap do |q|
diff --git a/bin/check-worker-liveness b/bin/check-worker-liveness
index 7d02aff9ff47..fe248d9dfb66 100755
--- a/bin/check-worker-liveness
+++ b/bin/check-worker-liveness
@@ -13,7 +13,7 @@ FAIL_COUNT_FILE=/tmp/.liveness-check-fail-count.op
#
# This checks across all workers and can't tell if it's only this worker in particular
# that doesn't seem to be doing anything.
-UNPROCESSED_COUNT=`psql -d ${DATABASE_URL%%\?*} -c "select count(*) from good_jobs where finished_at is null and scheduled_at < (now() - interval '15 minutes');" | tail -n +3 | head -n1 | tr -d ' '`
+UNPROCESSED_COUNT=`psql -d ${DATABASE_URL%%\?*} -c "select count(*) from delayed_jobs where locked_by is null and run_at < (now() - interval '15 minutes');" | tail -n +3 | head -n1 | tr -d ' '`
echo "unprocessed: $UNPROCESSED_COUNT"
@@ -25,7 +25,7 @@ if [ "$UNPROCESSED_COUNT" = "0" ]; then
exit 0
else
- MIN_RUN_AT=`psql -d ${DATABASE_URL%%\?*} -c "select scheduled_at from good_jobs where finished_at is null and cron_key is null and scheduled_at is not null and scheduled_at < (now() - interval '1 minutes') order by scheduled_at asc limit 1;" | tail -n +3 | head -n1`
+ MIN_RUN_AT=`psql -d ${DATABASE_URL%%\?*} -c "select run_at from delayed_jobs where locked_by is null and cron is null and run_at is not null and run_at < (now() - interval '1 minutes') order by run_at asc limit 1;" | tail -n +3 | head -n1`
LAST_MIN_RUN_AT=`cat $MIN_RUN_AT_FILE 2>/dev/null || echo 0`
NUM_FAILS=`cat $FAIL_COUNT_FILE 2>/dev/null || echo 0`
diff --git a/bin/check-worker-readiness b/bin/check-worker-readiness
index 1f9beb41ac30..84fbd973fe48 100755
--- a/bin/check-worker-readiness
+++ b/bin/check-worker-readiness
@@ -1,6 +1,6 @@
#!/bin/bash
-if ps aux | grep 'good_job start' | grep -v grep; then
+if ps aux | grep 'rake jobs:work' | grep -v grep; then
echo "background worker running"
exit 0
fi
diff --git a/bin/delayed_job b/bin/delayed_job
new file mode 100755
index 000000000000..edf195985f69
--- /dev/null
+++ b/bin/delayed_job
@@ -0,0 +1,5 @@
+#!/usr/bin/env ruby
+
+require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment'))
+require 'delayed/command'
+Delayed::Command.new(ARGV).daemonize
diff --git a/bin/setup_dev b/bin/setup_dev
index 7236581a7fc5..b69721264a9c 100755
--- a/bin/setup_dev
+++ b/bin/setup_dev
@@ -30,7 +30,7 @@ echo "---------------------------------------"
echo "Done. Now start the following services"
echo '- Rails server `RAILS_ENV=development bin/rails server`'
echo '- Angular CLI: `npm run serve`'
-echo '- Good Job worker: `RAILS_ENV=development bundle exec good_job start`'
+echo '- Delayed Job worker: `RAILS_ENV=development bin/rails jobs:work`'
echo ""
echo 'You can also run `bin/dev` to run all the above on a single terminal.'
echo ""
diff --git a/config.ru b/config.ru
index 2f1cc5f2e89b..3f4f6b1679bd 100644
--- a/config.ru
+++ b/config.ru
@@ -28,11 +28,11 @@
# This file is used by Rack-based servers to start the application.
-require File.expand_path("config/environment", __dir__)
+require File.expand_path('config/environment', __dir__)
subdir = OpenProject::Configuration.rails_relative_url_root.presence
-map (subdir || "/") do
+map (subdir || '/') do
use Rack::Protection::JsonCsrf
use Rack::Protection::FrameOptions
diff --git a/config/application.rb b/config/application.rb
index abcf69011f0b..3c92d6857a32 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -212,20 +212,7 @@ class Application < Rails::Application
# This allows for setting the root either via config file or via environment variable.
config.action_controller.relative_url_root = OpenProject::Configuration['rails_relative_url_root']
- config.active_job.queue_adapter = :good_job
-
- config.good_job.retry_on_unhandled_error = false
- # It has been commented out because AppSignal gem modifies ActiveJob::Base to report exceptions already.
- # config.good_job.on_thread_error = -> (exception) { OpenProject.logger.error(exception) }
- config.good_job.execution_mode = :external
- config.good_job.preserve_job_records = true
- config.good_job.cleanup_preserved_jobs_before_seconds_ago = OpenProject::Configuration[:good_job_cleanup_preserved_jobs_before_seconds_ago]
- config.good_job.queues = OpenProject::Configuration[:good_job_queues]
- config.good_job.max_threads = OpenProject::Configuration[:good_job_max_threads]
- config.good_job.max_cache = OpenProject::Configuration[:good_job_max_cache]
- config.good_job.enable_cron = OpenProject::Configuration[:good_job_enable_cron]
- config.good_job.shutdown_timeout = 30
- config.good_job.smaller_number_is_higher_priority = false
+ config.active_job.queue_adapter = :delayed_job
config.action_controller.asset_host = OpenProject::Configuration::AssetHost.value
diff --git a/config/boot.rb b/config/boot.rb
index 64fdb9879e5b..6067c79b2758 100644
--- a/config/boot.rb
+++ b/config/boot.rb
@@ -26,28 +26,28 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)
+ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
# Load any local boot extras that is kept out of source control
# (e.g., silencing of deprecations)
-if File.exist?(File.join(File.dirname(__FILE__), "additional_boot.rb"))
- instance_eval File.read(File.join(File.dirname(__FILE__), "additional_boot.rb"))
+if File.exist?(File.join(File.dirname(__FILE__), 'additional_boot.rb'))
+ instance_eval File.read(File.join(File.dirname(__FILE__), 'additional_boot.rb'))
end
-require "bundler/setup" # Set up gems listed in the Gemfile.
+require 'bundler/setup' # Set up gems listed in the Gemfile.
-env = ENV.fetch("RAILS_ENV", nil)
+env = ENV.fetch('RAILS_ENV', nil)
# Disable deprecation warnings early on (before loading gems), which behaves as RUBYOPT="-w0"
# to disable the Ruby warnings in production.
# Set OPENPROJECT_PROD_DEPRECATIONS=true if you want to see them for debugging purposes
-if env == "production" && ENV["OPENPROJECT_PROD_DEPRECATIONS"] != "true"
- require "structured_warnings"
+if env == 'production' && ENV['OPENPROJECT_PROD_DEPRECATIONS'] != 'true'
+ require 'structured_warnings'
Warning[:deprecated] = false
StructuredWarnings::BuiltInWarning.disable
StructuredWarnings::DeprecationWarning.disable
end
-if env == "development"
+if env == 'development'
warn "Starting with bootsnap."
- require "bootsnap/setup" # Speed up boot time by caching expensive operations.
+ require 'bootsnap/setup' # Speed up boot time by caching expensive operations.
end
diff --git a/config/constants/ar_to_api_conversions.rb b/config/constants/ar_to_api_conversions.rb
index 1f87be6c494e..d7ba1b77a60b 100644
--- a/config/constants/ar_to_api_conversions.rb
+++ b/config/constants/ar_to_api_conversions.rb
@@ -32,29 +32,29 @@ class ARToAPIConversions
# * from the API to AR
# * from AR to the API
WELL_KNOWN_CONVERSIONS = {
- assigned_to: "assignee",
- version: "version",
- done_ratio: "percentageDone",
- derived_done_ratio: "derivedPercentageDone",
- estimated_hours: "estimatedTime",
- remaining_hours: "remainingTime",
- spent_hours: "spentTime",
- subproject: "subprojectId",
- relation_type: "type",
- mail: "email",
- column_names: "columns",
- sort_criteria: "sortBy",
- message: "post",
- firstname: "firstName",
- lastname: "lastName",
- member: "membership"
+ assigned_to: 'assignee',
+ version: 'version',
+ done_ratio: 'percentageDone',
+ derived_done_ratio: 'derivedPercentageDone',
+ estimated_hours: 'estimatedTime',
+ remaining_hours: 'remainingTime',
+ spent_hours: 'spentTime',
+ subproject: 'subprojectId',
+ relation_type: 'type',
+ mail: 'email',
+ column_names: 'columns',
+ sort_criteria: 'sortBy',
+ message: 'post',
+ firstname: 'firstName',
+ lastname: 'lastName',
+ member: 'membership'
}.freeze
# Conversions that are unidirectional (from the API to AR)
# This can be used to still support renamed filters/sort_by, like for created/updatedOn.
WELL_KNOWN_API_TO_AR_CONVERSIONS = {
- created_on: "created_at",
- updated_on: "updated_at"
+ created_on: 'created_at',
+ updated_on: 'updated_at'
}.freeze
class << self
diff --git a/config/constants/settings/definition.rb b/config/constants/settings/definition.rb
index 28df4a724e10..5fce328a34e9 100644
--- a/config/constants/settings/definition.rb
+++ b/config/constants/settings/definition.rb
@@ -28,7 +28,7 @@
module Settings
class Definition
- ENV_PREFIX = "OPENPROJECT_".freeze
+ ENV_PREFIX = 'OPENPROJECT_'.freeze
AR_BOOLEAN_TYPE = ActiveRecord::Type::Boolean.new
DEFINITIONS = {
activity_days_default: {
@@ -36,38 +36,34 @@ class Definition
},
after_first_login_redirect_url: {
format: :string,
- description: "URL users logging in for the first time will be redirected to (e.g., a help screen)",
+ description: 'URL users logging in for the first time will be redirected to (e.g., a help screen)',
default: nil
},
after_login_default_redirect_url: {
- description: "Override URL to which logged in users are redirected instead of the My page",
+ description: 'Override URL to which logged in users are redirected instead of the My page',
format: :string,
default: nil
},
apiv3_cors_enabled: {
- description: "Enable CORS headers for APIv3 server responses",
+ description: 'Enable CORS headers for APIv3 server responses',
default: false
},
apiv3_cors_origins: {
default: []
},
apiv3_docs_enabled: {
- description: "Enable interactive APIv3 documentation as part of the application",
+ description: 'Enable interactive APIv3 documentation as part of the application',
default: true
},
apiv3_enable_basic_auth: {
- description: "Enable API token or global basic authentication for APIv3 requests",
+ description: 'Enable API token or global basic authentication for APIv3 requests',
default: true
},
apiv3_max_page_size: {
default: 1000
},
- apiv3_write_readonly_attributes: {
- description: "Allow overriding readonly attributes (e.g. createdAt, updatedAt, author) during the creation of resources via the REST API",
- default: false
- },
app_title: {
- default: "OpenProject"
+ default: 'OpenProject'
},
attachment_max_size: {
default: 5120
@@ -80,41 +76,41 @@ class Definition
# Carrierwave storage type. Possible values are, among others, :file and :fog.
# The latter requires further configuration.
attachments_storage: {
- description: "File storage configuration",
+ description: 'File storage configuration',
default: :file,
format: :symbol,
allowed: %i[file fog],
writable: false
},
attachments_storage_path: {
- description: "File storage disk location (only applicable for local file storage)",
+ description: 'File storage disk location (only applicable for local file storage)',
format: :string,
default: nil,
writable: false
},
attachments_grace_period: {
- description: "Time in minutes to wait before uploaded files not attached to any container are removed",
+ description: 'Time in minutes to wait before uploaded files not attached to any container are removed',
default: 180
},
antivirus_scan_mode: {
- description: "Virus scanning option for files uploaded to OpenProject",
+ description: 'Virus scanning option for files uploaded to OpenProject',
format: :symbol,
default: :disabled,
allowed: %i[disabled clamav_socket clamav_host]
},
antivirus_scan_target: {
- description: "The socket or hostname to connect to ClamAV",
+ description: 'The socket or hostname to connect to ClamAV',
format: :string,
default: nil
},
antivirus_scan_action: {
- description: "Virus scanning action for found infected files",
+ description: 'Virus scanning action for found infected files',
format: :symbol,
default: :quarantine,
allowed: %i[quarantine delete]
},
auth_source_sso: {
- description: "Configuration for Header-based Single Sign-On",
+ description: 'Configuration for Header-based Single Sign-On',
format: :hash,
default: nil,
writable: false # config is cached globally so let's make it not writable
@@ -127,7 +123,7 @@ class Definition
# user: admin
# password: 123456
authentication: {
- description: "Configuration options for global basic auth",
+ description: 'Configuration options for global basic auth',
format: :hash,
default: nil
},
@@ -142,12 +138,12 @@ class Definition
allowed: [1, 7, 14, 30, 60, 90, 365]
},
autologin_cookie_name: {
- description: "Cookie name for autologin cookie",
- default: "autologin"
+ description: 'Cookie name for autologin cookie',
+ default: 'autologin'
},
autologin_cookie_path: {
- description: "Cookie path for autologin cookie",
- default: "/"
+ description: 'Cookie path for autologin cookie',
+ default: '/'
},
available_languages: {
format: :array,
@@ -157,33 +153,33 @@ class Definition
allowed: -> { Redmine::I18n.all_languages }
},
avatar_link_expiry_seconds: {
- description: "Cache duration for avatar image API responses",
+ description: 'Cache duration for avatar image API responses',
default: 24.hours.to_i
},
# Allow users with the required permissions to create backups via the web interface or API.
backup_enabled: {
- description: "Enable application backups through the UI",
+ description: 'Enable application backups through the UI',
default: true
},
backup_daily_limit: {
- description: "Maximum number of application backups allowed per day",
+ description: 'Maximum number of application backups allowed per day',
default: 3
},
backup_initial_waiting_period: {
- description: "Wait time before newly created backup tokens are usable",
+ description: 'Wait time before newly created backup tokens are usable',
default: 24.hours,
format: :integer
},
backup_include_attachments: {
- description: "Allow inclusion of attachments in application backups",
+ description: 'Allow inclusion of attachments in application backups',
default: true
},
backup_attachment_size_max_sum_mb: {
- description: "Maximum limit of attachment size to include into application backups",
+ description: 'Maximum limit of attachment size to include into application backups',
default: 1024
},
blacklisted_routes: {
- description: "Blocked routes to prevent access to certain modules or pages",
+ description: 'Blocked routes to prevent access to certain modules or pages',
default: [],
writable: false # used in initializer
},
@@ -191,19 +187,19 @@ class Definition
default: true
},
boards_demo_data_available: {
- description: "Internal setting determining availability of demo seed data",
+ description: 'Internal setting determining availability of demo seed data',
default: false
},
brute_force_block_minutes: {
- description: "Number of minutes to block users after presumed brute force attack",
+ description: 'Number of minutes to block users after presumed brute force attack',
default: 30
},
brute_force_block_after_failed_logins: {
- description: "Number of login attempts per user before assuming brute force attack",
+ description: 'Number of login attempts per user before assuming brute force attack',
default: 20
},
cache_expires_in_seconds: {
- description: "Expiration time for memcache entries, empty for no expiry be default",
+ description: 'Expiration time for memcache entries, empty for no expiry be default',
format: :integer,
default: nil,
writable: false
@@ -213,40 +209,40 @@ class Definition
},
# use dalli defaults for memcache
cache_memcache_server: {
- description: "The memcache server host and IP",
+ description: 'The memcache server host and IP',
format: :string,
default: nil,
writable: false
},
cache_redis_url: {
- description: "URL to the redis cache server",
+ description: 'URL to the redis cache server',
format: :string,
default: nil,
writable: false
},
cache_namespace: {
format: :string,
- description: "Namespace for cache keys, useful when multiple applications use a single memcache server",
+ description: 'Namespace for cache keys, useful when multiple applications use a single memcache server',
default: nil,
writable: false
},
commit_fix_done_ratio: {
- description: "Progress to apply when commit fixes work package",
+ description: 'Progress to apply when commit fixes work package',
default: 100
},
commit_fix_keywords: {
- description: "Keywords to look for in commit for fixing work packages",
- default: "fixes,closes"
+ description: 'Keywords to look for in commit for fixing work packages',
+ default: 'fixes,closes'
},
commit_fix_status_id: {
- description: "Assigned status when fixing keyword is found",
+ description: 'Assigned status when fixing keyword is found',
format: :integer,
default: nil,
allowed: -> { Status.pluck(:id) + [nil] }
},
commit_logs_encoding: {
description: "Encoding used to convert commit logs to UTF-8",
- default: "UTF-8"
+ default: 'UTF-8'
},
commit_logtime_activity_id: {
description: :setting_commit_logtime_activity_id,
@@ -260,7 +256,7 @@ class Definition
},
commit_ref_keywords: {
description: "Keywords used in commits for referencing work packages",
- default: "refs,references,IssueID"
+ default: 'refs,references,IssueID'
},
consent_decline_mail: {
format: :string,
@@ -287,7 +283,7 @@ class Definition
default: true
},
database_cipher_key: {
- description: "Encryption key for repository credentials",
+ description: 'Encryption key for repository credentials',
format: :string,
default: nil,
writable: false
@@ -296,28 +292,28 @@ class Definition
format: :string,
default: nil,
allowed: [
- "%Y-%m-%d",
- "%d/%m/%Y",
- "%d.%m.%Y",
- "%d-%m-%Y",
- "%m/%d/%Y",
- "%d %b %Y",
- "%d %B %Y",
- "%b %d, %Y",
- "%B %d, %Y"
+ '%Y-%m-%d',
+ '%d/%m/%Y',
+ '%d.%m.%Y',
+ '%d-%m-%Y',
+ '%m/%d/%Y',
+ '%d %b %Y',
+ '%d %B %Y',
+ '%b %d, %Y',
+ '%B %d, %Y'
].freeze
},
default_auto_hide_popups: {
- description: "Whether to automatically hide success notifications by default",
+ description: 'Whether to automatically hide success notifications by default',
default: true
},
# user configuration
default_comment_sort_order: {
- description: "Default sort order for activities",
- default: "asc"
+ description: 'Default sort order for activities',
+ default: 'asc'
},
default_language: {
- default: "en",
+ default: 'en',
allowed: -> { Redmine::I18n.all_languages }
},
default_projects_modules: {
@@ -337,7 +333,7 @@ class Definition
default: false
},
development_highlight_enabled: {
- description: "Enable highlighting of development environment",
+ description: 'Enable highlighting of development environment',
default: -> { Rails.env.development? },
format: :boolean
},
@@ -345,18 +341,18 @@ class Definition
default: 1500
},
direct_uploads: {
- description: "Enable direct uploads to AWS S3. Only applicable with enabled Fog / AWS S3 configuration",
+ description: 'Enable direct uploads to AWS S3. Only applicable with enabled Fog / AWS S3 configuration',
default: true,
writable: false
},
disable_browser_cache: {
- description: "Prevent browser from caching any logged-in responses for security reasons",
+ description: 'Prevent browser from caching any logged-in responses for security reasons',
default: true,
writable: false
},
# allow to disable default modules
disabled_modules: {
- description: "A list of module names to prevent access to in the application",
+ description: 'A list of module names to prevent access to in the application',
default: [],
allowed: -> { OpenProject::AccessControl.available_project_modules.map(&:to_s) },
writable: false # setting stored in global variable
@@ -366,48 +362,48 @@ class Definition
default: false
},
disable_password_login: {
- description: "Disable internal logins and instead only allow SSO through OmniAuth.",
+ description: 'Disable internal logins and instead only allow SSO through OmniAuth.',
default: false
},
display_subprojects_work_packages: {
default: true
},
drop_old_sessions_on_logout: {
- description: "Destroy all sessions for current_user on logout",
+ description: 'Destroy all sessions for current_user on logout',
default: true
},
drop_old_sessions_on_login: {
- description: "Destroy all sessions for current_user on login",
+ description: 'Destroy all sessions for current_user on login',
default: false
},
edition: {
format: :string,
- default: "standard",
- description: "OpenProject edition mode",
+ default: 'standard',
+ description: 'OpenProject edition mode',
writable: false,
allowed: %w[standard bim]
},
ee_manager_visible: {
- description: "Show or hide the Enterprise configuration page and enterprise banners",
+ description: 'Show or hide the Enterprise configuration page and enterprise banners',
default: true,
writable: false
},
enable_internal_assets_server: {
- description: "Serve assets through the Rails internal asset server",
+ description: 'Serve assets through the Rails internal asset server',
default: false,
writable: false
},
# email configuration
email_delivery_configuration: {
- default: "inapp",
+ default: 'inapp',
allowed: %w[inapp legacy],
writable: false,
- env_alias: "EMAIL_DELIVERY_CONFIGURATION"
+ env_alias: 'EMAIL_DELIVERY_CONFIGURATION'
},
email_delivery_method: {
format: :symbol,
default: nil,
- env_alias: "EMAIL_DELIVERY_METHOD"
+ env_alias: 'EMAIL_DELIVERY_METHOD'
},
emails_salutation: {
allowed: %w[firstname name],
@@ -415,12 +411,12 @@ class Definition
},
emails_footer: {
default: {
- "en" => ""
+ 'en' => ''
}
},
emails_header: {
default: {
- "en" => ""
+ 'en' => ''
}
},
# use email address as login, hide login in registration form
@@ -436,18 +432,18 @@ class Definition
},
# Allow connections for trial creation and booking
enterprise_trial_creation_host: {
- description: "Host for EE trial service",
- default: "https://start.openproject.com",
+ description: 'Host for EE trial service',
+ default: 'https://start.openproject.com',
writable: false
},
enterprise_chargebee_site: {
- description: "Site name for EE trial service",
- default: "openproject-enterprise",
+ description: 'Site name for EE trial service',
+ default: 'openproject-enterprise',
writable: false
},
enterprise_plan: {
- description: "Default EE selected plan",
- default: "enterprise-on-premises---euro---1-year",
+ description: 'Default EE selected plan',
+ default: 'enterprise-on-premises---euro---1-year',
writable: false
},
feeds_enabled: {
@@ -467,97 +463,74 @@ class Definition
allowed: [1, 4]
},
fog: {
- description: "Configure fog, e.g. when using an S3 uploader",
+ description: 'Configure fog, e.g. when using an S3 uploader',
default: {}
},
fog_download_url_expires_in: {
- description: "Expiration time in seconds of created shared presigned URLs",
+ description: 'Expiration time in seconds of created shared presigned URLs',
default: 21600 # 6h by default as 6 hours is max in S3 when using IAM roles
},
# Additional / overridden help links
force_help_link: {
- description: "You can set a custom URL for the help button in application header menu.",
+ description: 'You can set a custom URL for the help button in application header menu.',
format: :string,
default: nil
},
force_formatting_help_link: {
- description: "You can set a custom URL for the help button in the WYSIWYG editor.",
+ description: 'You can set a custom URL for the help button in the WYSIWYG editor.',
format: :string,
default: nil
},
forced_single_page_size: {
- description: "Forced page size for manually sorted work package views",
+ description: 'Forced page size for manually sorted work package views',
default: 250
},
- good_job_queues: {
- description: "",
- format: :string,
- writable: false,
- default: "*"
- },
- good_job_max_threads: {
- description: "",
- format: :integer,
- writable: false,
- default: 20
- },
- good_job_max_cache: {
- description: "",
- format: :integer,
- writable: false,
- default: 10_000
- },
- good_job_enable_cron: {
- description: "",
- format: :boolean,
- writable: false,
- default: true
- },
- good_job_cleanup_preserved_jobs_before_seconds_ago: {
- description: "",
- format: :integer,
- writable: false,
- default: 7.days
- },
host_name: {
default: "localhost:3000"
},
# Health check configuration
health_checks_authentication_password: {
- description: "Add an authentication challenge for the /health_check endpoint",
+ description: 'Add an authentication challenge for the /health_check endpoint',
format: :string,
default: nil
},
+ # Maximum number of backed up jobs (that are not yet executed)
+ # before health check fails
+ health_checks_jobs_queue_count_threshold: {
+ description: 'Set threshold of backed up background jobs to fail health check',
+ format: :integer,
+ default: 50
+ },
## Maximum number of minutes that jobs have not yet run after their designated 'run_at' time
health_checks_jobs_never_ran_minutes_ago: {
- description: "Set threshold of outstanding background jobs to fail health check",
+ description: 'Set threshold of outstanding background jobs to fail health check',
format: :integer,
default: 5
},
## Maximum number of unprocessed requests in puma's backlog.
health_checks_backlog_threshold: {
- description: "Set threshold of outstanding HTTP requests to fail health check",
+ description: 'Set threshold of outstanding HTTP requests to fail health check',
format: :integer,
default: 20
},
# Default gravatar image, set to something other than 404
# to ensure a default is returned
gravatar_fallback_image: {
- description: "Set default gravatar image fallback",
- default: "404"
+ description: 'Set default gravatar image fallback',
+ default: '404'
},
hidden_menu_items: {
- description: "Hide menu items in the menu sidebar for each main menu (such as Administration and Projects).",
+ description: 'Hide menu items in the menu sidebar for each main menu (such as Administration and Projects).',
default: {},
writable: false # cached in global variable
},
impressum_link: {
- description: "Impressum link to be set, hidden by default",
+ description: 'Impressum link to be set, hidden by default',
format: :string,
default: nil
},
installation_type: {
- default: "manual",
+ default: 'manual',
writable: false
},
installation_uuid: {
@@ -565,7 +538,7 @@ class Definition
default: nil
},
internal_password_confirmation: {
- description: "Require password confirmations for certain administrative actions",
+ description: 'Require password confirmations for certain administrative actions',
default: true
},
invitation_expiration_days: {
@@ -575,20 +548,20 @@ class Definition
default: 5
},
ldap_force_no_page: {
- description: "Force LDAP to respond as a single page, in case paged responses do not work with your server.",
+ description: 'Force LDAP to respond as a single page, in case paged responses do not work with your server.',
format: :string,
default: nil
},
ldap_groups_disable_sync_job: {
- description: "Deactivate regular synchronization job for groups in case scheduled as a separate cronjob",
+ description: 'Deactivate regular synchronization job for groups in case scheduled as a separate cronjob',
default: false
},
ldap_users_disable_sync_job: {
- description: "Deactivate user attributes synchronization from LDAP",
+ description: 'Deactivate user attributes synchronization from LDAP',
default: false
},
ldap_users_sync_status: {
- description: "Enable user status (locked/unlocked) synchronization from LDAP",
+ description: 'Enable user status (locked/unlocked) synchronization from LDAP',
format: :boolean,
default: false
},
@@ -598,8 +571,8 @@ class Definition
writable: true
},
log_level: {
- description: "Set the OpenProject logger level",
- default: Rails.env.development? ? "debug" : "info",
+ description: 'Set the OpenProject logger level',
+ default: Rails.env.development? ? 'debug' : 'info',
allowed: %w[debug info warn error fatal],
writable: false
},
@@ -607,14 +580,14 @@ class Definition
default: false
},
lograge_enabled: {
- description: "Use lograge formatter for outputting logs",
+ description: 'Use lograge formatter for outputting logs',
default: true,
format: :boolean,
writable: false
},
lograge_formatter: {
- description: "Lograge formatter to use for outputting logs",
- default: "key_value",
+ description: 'Lograge formatter to use for outputting logs',
+ default: 'key_value',
format: :string,
writable: false
},
@@ -622,42 +595,42 @@ class Definition
default: true
},
lookbook_enabled: {
- description: "Enable the Lookbook component documentation tool. Discouraged for production environments.",
+ description: 'Enable the Lookbook component documentation tool. Discouraged for production environments.',
default: -> { Rails.env.development? },
format: :boolean
},
lost_password: {
- description: "Activate or deactivate lost password form",
+ description: 'Activate or deactivate lost password form',
default: true
},
mail_from: {
- default: "openproject@example.net"
+ default: 'openproject@example.net'
},
mail_handler_api_key: {
format: :string,
default: nil
},
mail_handler_body_delimiters: {
- default: ""
+ default: ''
},
mail_handler_body_delimiter_regex: {
- default: ""
+ default: ''
},
mail_handler_ignore_filenames: {
- default: "signature.asc"
+ default: 'signature.asc'
},
mail_suffix_separators: {
- default: "+"
+ default: '+'
},
main_content_language: {
- default: "english",
- description: "Main content language for PostgreSQL full text features",
+ default: 'english',
+ description: 'Main content language for PostgreSQL full text features',
writable: false,
allowed: %w[danish dutch english finnish french german hungarian
italian norwegian portuguese romanian russian simple spanish swedish turkish]
},
migration_check_on_exceptions: {
- description: "Check for missing migrations in internal errors",
+ description: 'Check for missing migrations in internal errors',
default: true,
writable: false
},
@@ -675,12 +648,12 @@ class Definition
default: 60000
},
oauth_allow_remapping_of_existing_users: {
- description: "When set to false, prevent users from other identity providers to take over accounts connected " \
- "to another identity provider.",
+ description: 'When set to false, prevent users from other identity providers to take over accounts connected ' \
+ 'to another identity provider.',
default: true
},
omniauth_direct_login_provider: {
- description: "Clicking on login sends a login request to the specified OmniAuth provider.",
+ description: 'Clicking on login sends a login request to the specified OmniAuth provider.',
format: :string,
default: nil
},
@@ -691,11 +664,11 @@ class Definition
writable: false # this changes a global variable and must therefore not be writable at runtime
},
onboarding_video_url: {
- description: "Onboarding guide instructional video URL",
- default: "https://player.vimeo.com/video/163426858?autoplay=1"
+ description: 'Onboarding guide instructional video URL',
+ default: 'https://player.vimeo.com/video/163426858?autoplay=1'
},
onboarding_enabled: {
- description: "Enable or disable onboarding guided tour for new users",
+ description: 'Enable or disable onboarding guided tour for new users',
default: true
},
password_active_rules: {
@@ -718,7 +691,7 @@ class Definition
# Requires a migration to be written
# replace Setting#per_page_options_array
per_page_options: {
- default: "20, 100"
+ default: '20, 100'
},
plain_text_mail: {
default: false
@@ -728,63 +701,63 @@ class Definition
format: :string
},
rails_asset_host: {
- description: "Custom asset hostname for serving assets (e.g., Cloudfront)",
+ description: 'Custom asset hostname for serving assets (e.g., Cloudfront)',
format: :string,
default: nil,
writable: false
},
rails_cache_store: {
- description: "Set cache store implemenation to use with OpenProject",
+ description: 'Set cache store implemenation to use with OpenProject',
format: :symbol,
default: :file_store,
writable: false,
allowed: %i[file_store memcache redis]
},
rails_relative_url_root: {
- description: "Set a URL prefix / base path to run OpenProject under, e.g., host.tld/openproject",
- default: "",
+ description: 'Set a URL prefix / base path to run OpenProject under, e.g., host.tld/openproject',
+ default: '',
writable: false
},
https: {
- description: "Set assumed connection security for the Rails processes",
+ description: 'Set assumed connection security for the Rails processes',
format: :boolean,
default: -> { Rails.env.production? },
writable: false
},
hsts: {
- description: "Allow disabling of HSTS headers and http -> https redirects",
+ description: 'Allow disabling of HSTS headers and http -> https redirects',
format: :boolean,
default: true,
writable: false
},
home_url: {
- description: "Override default link when clicking on the top menu logo (Homescreen by default).",
+ description: 'Override default link when clicking on the top menu logo (Homescreen by default).',
format: :string,
default: nil
},
httpx_connect_timeout: {
- description: "",
+ description: '',
format: :float,
writable: false,
allowed: (0..),
default: 3
},
httpx_read_timeout: {
- description: "",
+ description: '',
format: :float,
writable: false,
allowed: (0..),
default: 3
},
httpx_write_timeout: {
- description: "",
+ description: '',
format: :float,
writable: false,
allowed: (0..),
default: 3
},
httpx_keep_alive_timeout: {
- description: "",
+ description: '',
format: :float,
writable: false,
allowed: (0..),
@@ -792,27 +765,27 @@ class Definition
},
rate_limiting: {
default: {},
- description: "Configure rate limiting for various endpoint rules. See configuration documentation for details."
+ description: 'Configure rate limiting for various endpoint rules. See configuration documentation for details.'
},
registration_footer: {
default: {
- "en" => ""
+ 'en' => ''
}
},
remote_storage_upload_host: {
format: :string,
default: nil,
writable: false,
- description: "Host the frontend uses to upload files to, which has to be added to the CSP."
+ description: 'Host the frontend uses to upload files to, which has to be added to the CSP.'
},
remote_storage_download_host: {
format: :string,
default: nil,
writable: false,
- description: "Host the frontend uses to download files, which has to be added to the CSP."
+ description: 'Host the frontend uses to download files, which has to be added to the CSP.'
},
report_incoming_email_errors: {
- description: "Respond to incoming mails with error details",
+ description: 'Respond to incoming mails with error details',
default: true
},
repositories_automatic_managed_vendor: {
@@ -858,7 +831,7 @@ class Definition
writable: false
},
scm_local_checkout_path: {
- default: "repositories", # relative to OpenProject directory
+ default: 'repositories', # relative to OpenProject directory
writable: false
},
scm_subversion_command: {
@@ -871,32 +844,32 @@ class Definition
default: true
},
security_badge_url: {
- description: "URL of the update check badge",
+ description: 'URL of the update check badge',
default: "https://releases.openproject.com/v1/check.svg",
writable: false
},
seed_admin_user_password: {
description: 'Password to set for the initially created admin user (Login remains "admin").',
- default: "admin",
+ default: 'admin',
writable: false
},
seed_admin_user_mail: {
- description: "E-mail to set for the initially created admin user.",
- default: "admin@example.net",
+ description: 'E-mail to set for the initially created admin user.',
+ default: 'admin@example.net',
writable: false
},
seed_admin_user_name: {
- description: "Name to set for the initially created admin user.",
- default: "OpenProject Admin",
+ description: 'Name to set for the initially created admin user.',
+ default: 'OpenProject Admin',
writable: false
},
seed_admin_user_password_reset: {
- description: "Whether to force a password reset for the initially created admin user.",
+ description: 'Whether to force a password reset for the initially created admin user.',
default: true,
writable: false
},
seed_ldap: {
- description: "Provide an LDAP connection and sync settings through ENV",
+ description: 'Provide an LDAP connection and sync settings through ENV',
writable: false,
default: nil,
format: :hash
@@ -905,12 +878,12 @@ class Definition
default: 2
},
sendmail_arguments: {
- description: "Arguments to call sendmail with in case it is configured as outgoing email setup",
+ description: 'Arguments to call sendmail with in case it is configured as outgoing email setup',
format: :string,
default: "-i"
},
sendmail_location: {
- description: "Location of sendmail to call if it is configured as outgoing email setup",
+ description: 'Location of sendmail to call if it is configured as outgoing email setup',
format: :string,
default: "/usr/sbin/sendmail"
},
@@ -918,11 +891,11 @@ class Definition
appsignal_frontend_key: {
format: :string,
default: nil,
- description: "Appsignal API key for JavaScript error reporting"
+ description: 'Appsignal API key for JavaScript error reporting'
},
session_cookie_name: {
- description: "Set session cookie name",
- default: "_open_project_session"
+ description: 'Set session cookie name',
+ default: '_open_project_session'
},
session_ttl_enabled: {
default: false
@@ -931,44 +904,44 @@ class Definition
default: 120
},
show_community_links: {
- description: "Enable or disable links to OpenProject community instances",
+ description: 'Enable or disable links to OpenProject community instances',
default: true
},
show_product_version: {
- description: "Show product version information in the administration section",
+ description: 'Show product version information in the administration section',
default: true
},
show_pending_migrations_warning: {
- description: "Enable or disable warning bar in case of pending migrations",
+ description: 'Enable or disable warning bar in case of pending migrations',
default: true,
writable: false
},
show_setting_mismatch_warning: {
- description: "Show mismatched protocol/hostname warning. In cases where they must differ this can be disabled",
+ description: 'Show mismatched protocol/hostname warning. In cases where they must differ this can be disabled',
default: true
},
# Render storage information
show_storage_information: {
- description: "Show available and taken storage information under administration / info",
+ description: 'Show available and taken storage information under administration / info',
default: true
},
show_warning_bars: {
- description: "Render warning bars (pending migrations, deprecation, unsupported browsers)",
+ description: 'Render warning bars (pending migrations, deprecation, unsupported browsers)',
# Hide warning bars by default in tests as they might overlay other elements
default: -> { !Rails.env.test? }
},
smtp_authentication: {
format: :string,
- default: "plain",
- env_alias: "SMTP_AUTHENTICATION"
+ default: 'plain',
+ env_alias: 'SMTP_AUTHENTICATION'
},
smtp_enable_starttls_auto: {
format: :boolean,
default: false,
- env_alias: "SMTP_ENABLE_STARTTLS_AUTO"
+ env_alias: 'SMTP_ENABLE_STARTTLS_AUTO'
},
smtp_openssl_verify_mode: {
- description: "Globally set verify mode for OpenSSL. Careful: Setting to none will disable any SSL verification!",
+ description: 'Globally set verify mode for OpenSSL. Careful: Setting to none will disable any SSL verification!',
format: :string,
default: "peer",
allowed: %w[none peer client_once fail_if_no_peer_cert],
@@ -977,43 +950,43 @@ class Definition
smtp_ssl: {
format: :boolean,
default: false,
- env_alias: "SMTP_SSL"
+ env_alias: 'SMTP_SSL'
},
smtp_address: {
format: :string,
- default: "",
- env_alias: "SMTP_ADDRESS"
+ default: '',
+ env_alias: 'SMTP_ADDRESS'
},
smtp_domain: {
format: :string,
- default: "your.domain.com",
- env_alias: "SMTP_DOMAIN"
+ default: 'your.domain.com',
+ env_alias: 'SMTP_DOMAIN'
},
smtp_user_name: {
format: :string,
- default: "",
- env_alias: "SMTP_USER_NAME"
+ default: '',
+ env_alias: 'SMTP_USER_NAME'
},
smtp_port: {
format: :integer,
default: 587,
- env_alias: "SMTP_PORT"
+ env_alias: 'SMTP_PORT'
},
smtp_password: {
format: :string,
- default: "",
- env_alias: "SMTP_PASSWORD"
+ default: '',
+ env_alias: 'SMTP_PASSWORD'
},
software_name: {
- description: "Override software application name",
- default: "OpenProject"
+ description: 'Override software application name',
+ default: 'OpenProject'
},
software_url: {
- description: "Override software application URL",
- default: "https://www.openproject.org/"
+ description: 'Override software application URL',
+ default: 'https://www.openproject.org/'
},
sql_slow_query_threshold: {
- description: "Time limit in ms after which queries will be logged as slow queries",
+ description: 'Time limit in ms after which queries will be logged as slow queries',
default: 2000,
writable: false
},
@@ -1023,19 +996,19 @@ class Definition
allowed: [1, 6, 7]
},
statsd: {
- description: "enable statsd metrics (currently puma only) by configuring host",
+ description: 'enable statsd metrics (currently puma only) by configuring host',
default: {
- "host" => nil,
- "port" => 8125
+ 'host' => nil,
+ 'port' => 8125
},
writable: false
},
sys_api_enabled: {
- description: "Enable internal system API for setting up managed repositories",
+ description: 'Enable internal system API for setting up managed repositories',
default: false
},
sys_api_key: {
- description: "Internal system API key for setting up managed repositories",
+ description: 'Internal system API key for setting up managed repositories',
default: nil,
format: :string
},
@@ -1043,8 +1016,8 @@ class Definition
format: :string,
default: nil,
allowed: [
- "%H:%M",
- "%I:%M %p"
+ '%H:%M',
+ '%I:%M %p'
].freeze
},
user_default_timezone: {
@@ -1056,10 +1029,10 @@ class Definition
default: false
},
user_default_theme: {
- default: "light",
+ default: 'light',
format: :string,
allowed: -> do
- UserPreferences::Schema.schema.dig("definitions", "UserPreferences", "properties", "theme", "enum")
+ UserPreferences::Schema.schema.dig('definitions', 'UserPreferences', 'properties', 'theme', 'enum')
end
},
users_deletable_by_self: {
@@ -1070,13 +1043,13 @@ class Definition
allowed: -> { User::USER_FORMATS_STRUCTURE.keys }
},
web: {
- description: "Web worker count and threads configuration",
+ description: 'Web worker count and threads configuration',
default: {
- "workers" => 2,
- "timeout" => 120,
- "wait_timeout" => 10,
- "min_threads" => 4,
- "max_threads" => 16
+ 'workers' => 2,
+ 'timeout' => 120,
+ 'wait_timeout' => 10,
+ 'min_threads' => 4,
+ 'max_threads' => 16
},
writable: false
},
@@ -1092,7 +1065,7 @@ class Definition
default: false
},
work_package_done_ratio: {
- default: "field",
+ default: 'field',
allowed: %w[field status disabled]
},
work_packages_projects_export_limit: {
@@ -1109,7 +1082,7 @@ class Definition
},
work_package_list_default_highlighting_mode: {
format: :string,
- default: -> { EnterpriseToken.allows_to?(:conditional_highlighting) ? "inline" : "none" },
+ default: -> { EnterpriseToken.allows_to?(:conditional_highlighting) ? 'inline' : 'none' },
allowed: -> { Query::QUERY_HIGHLIGHTING_MODES.map(&:to_s) },
writable: -> { EnterpriseToken.allows_to?(:conditional_highlighting) }
},
@@ -1121,14 +1094,14 @@ class Definition
default: false
},
working_days: {
- description: "Set working days of the week (Array of 1 to 7, where 1=Monday, 7=Sunday)",
+ description: 'Set working days of the week (Array of 1 to 7, where 1=Monday, 7=Sunday)',
format: :array,
allowed: Array(1..7),
default: Array(1..5) # Sat, Sun being non-working days,
},
youtube_channel: {
- description: "Link to YouTube channel in help menu",
- default: "https://www.youtube.com/c/OpenProjectCommunity"
+ description: 'Link to YouTube channel in help menu',
+ default: 'https://www.youtube.com/c/OpenProjectCommunity'
}
}.freeze
@@ -1293,7 +1266,7 @@ def all
def file_config
@file_config ||= begin
- filename = Rails.root.join("config/configuration.yml")
+ filename = Rails.root.join('config/configuration.yml')
file_config = {}
@@ -1318,8 +1291,8 @@ def override_value(definition)
end
def override_value_from_file(definition)
- envs = ["default", Rails.env]
- envs.delete("default") if Rails.env.test? # The test setup should govern the configuration
+ envs = ['default', Rails.env]
+ envs.delete('default') if Rails.env.test? # The test setup should govern the configuration
envs.each do |env|
next unless (env_config = file_config[env])
next unless env_config.has_key?(definition.name)
@@ -1383,7 +1356,7 @@ def path_to_hash(*path)
end
def unescape_underscores(path_segment)
- path_segment.gsub "__", "_"
+ path_segment.gsub '__', '_'
end
def find_env_var_override(definition)
@@ -1453,7 +1426,7 @@ def env_name_alias(definition)
def extract_value_from_env(env_var_name, env_var_value)
# YAML parses '' as false, but empty ENV variables will be passed as that.
# To specify specific values, one can use !!str (-> '') or !!null (-> nil)
- return env_var_value if env_var_value == ""
+ return env_var_value if env_var_value == ''
parsed = load_yaml(env_var_value)
diff --git a/config/credentials.yml b/config/credentials.yml
index 4c189e69fba1..3a96e7eedc81 100644
--- a/config/credentials.yml
+++ b/config/credentials.yml
@@ -33,7 +33,7 @@
# Make sure the secret is at least 30 characters and all random,
# no regular words or you'll be exposed to dictionary attacks.
-# You can use `rails credentials` to generate a secure secret key.
+# You can use `rails secret` to generate a secure secret key.
# Make sure the secrets in this file are kept private
# if you're sharing your code publicly.
diff --git a/config/environment.rb b/config/environment.rb
index df243e497597..d968dea66d97 100644
--- a/config/environment.rb
+++ b/config/environment.rb
@@ -27,7 +27,7 @@
#++
# Load the Rails application.
-require_relative "application"
+require_relative 'application'
# Initialize the Rails application.
Rails.application.initialize!
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 7a7ad94774d7..5c525fa135b1 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require "active_support/core_ext/integer/time"
+require 'active_support/core_ext/integer/time'
Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
@@ -53,7 +53,7 @@
# Enable Rails's static asset server when requested
# Disable serving static files from `public/`, relying on NGINX/Apache to do so instead.
- config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present?
+ config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
# Compress JavaScripts and CSS using a preprocessor.
config.assets.js_compressor = nil
@@ -69,7 +69,7 @@
config.assets.digest = true
# Version of your assets, change this if you want to expire all your assets.
- config.assets.version = "1.0"
+ config.assets.version = '1.0'
# Specifies the header that your server uses for sending files.
# config.action_dispatch.x_sendfile_header = "X-Sendfile" # for Apache
@@ -99,7 +99,7 @@
return true unless OpenProject::Configuration.hsts_enabled?
# Respect the relative URL
- relative_url = Regexp.escape(OpenProject::Configuration["rails_relative_url_root"])
+ relative_url = Regexp.escape(OpenProject::Configuration['rails_relative_url_root'])
# When we match SYS controller API, allow non-https access
return true if /#{relative_url}\/sys\//.match?(request.path)
@@ -119,7 +119,7 @@
# config.log_level = ENV.fetch("RAILS_LOG_LEVEL", "info")
# Set to :debug to see everything in the log.
- config.log_level = OpenProject::Configuration["log_level"].to_sym
+ config.log_level = OpenProject::Configuration['log_level'].to_sym
config.assets.quiet = true unless config.log_level == :debug
@@ -152,8 +152,8 @@
config.i18n.fallbacks = true
# Don't log any deprecations.
- config.active_support.report_deprecations = ENV.fetch("OPENPROJECT_SHOW_DEPRECATIONS", nil)
- deprecators.silenced = !ENV.fetch("OPENPROJECT_SHOW_DEPRECATIONS", nil)
+ config.active_support.report_deprecations = ENV.fetch('OPENPROJECT_SHOW_DEPRECATIONS', nil)
+ deprecators.silenced = !ENV.fetch('OPENPROJECT_SHOW_DEPRECATIONS', nil)
# Send deprecation notices to registered listeners.
config.active_support.deprecation = :notify
@@ -172,10 +172,10 @@
if OpenProject::Configuration.enable_internal_assets_server?
config.public_file_server.enabled = true
config.public_file_server.headers = {
- "Access-Control-Allow-Origin" => "*",
- "Access-Control-Allow-Methods" => "GET, OPTIONS, HEAD",
- "Cache-Control" => "public, s-maxage=31536000, max-age=15552000",
- "Expires" => 1.year.from_now.to_fs(:rfc822).to_s
+ 'Access-Control-Allow-Origin' => '*',
+ 'Access-Control-Allow-Methods' => 'GET, OPTIONS, HEAD',
+ 'Cache-Control' => 'public, s-maxage=31536000, max-age=15552000',
+ 'Expires' => 1.year.from_now.to_fs(:rfc822).to_s
}
end
diff --git a/config/environments/test_pgsql.rb b/config/environments/test_pgsql.rb
index f6bdbb51b3ee..574c5da8ea46 100644
--- a/config/environments/test_pgsql.rb
+++ b/config/environments/test_pgsql.rb
@@ -26,4 +26,4 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-instance_eval File.read(File.join(File.dirname(__FILE__), "test.rb"))
+instance_eval File.read(File.join(File.dirname(__FILE__), 'test.rb'))
diff --git a/config/initializers/00-load_plugins.rb b/config/initializers/00-load_plugins.rb
index aeae3a77db65..40566b60b628 100644
--- a/config/initializers/00-load_plugins.rb
+++ b/config/initializers/00-load_plugins.rb
@@ -29,14 +29,14 @@
# TODO: check if this can be postponed and if some plugins can make use of the ActiveSupport.on_load hooks
# Loads the core plugins located in lib_static/plugins
-Dir.glob(Rails.root.join("lib_static/plugins/*")).each do |directory|
+Dir.glob(Rails.root.join('lib_static/plugins/*')).each do |directory|
if File.directory?(directory)
- lib = File.join(directory, "lib")
+ lib = File.join(directory, 'lib')
$:.unshift lib
Rails.configuration.paths.add lib, eager_load: true, glob: "**[^test]/*"
- initializer = File.join(directory, "init.rb")
+ initializer = File.join(directory, 'init.rb')
if File.file?(initializer)
eval(File.read(initializer), binding, initializer)
end
diff --git a/config/initializers/03-db_check.rb b/config/initializers/03-db_check.rb
index 5f2906272719..e026eacd7333 100644
--- a/config/initializers/03-db_check.rb
+++ b/config/initializers/03-db_check.rb
@@ -26,10 +26,10 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-env = ENV["RAILS_ENV"] || "production"
+env = ENV['RAILS_ENV'] || 'production'
if (db_config = ActiveRecord::Base.configurations.configs_for(env_name: env)[0]) &&
- db_config.configuration_hash["adapter"]&.start_with?("mysql")
+ db_config.configuration_hash['adapter']&.start_with?('mysql')
warn <<~ERROR
======= INCOMPATIBLE DATABASE DETECTED =======
Your database is set up for use with a MySQL or MySQL-compatible variant.
diff --git a/config/initializers/05-null_db_fallback.rb b/config/initializers/05-null_db_fallback.rb
index b882f1e0deae..b5fb9cd3bffd 100644
--- a/config/initializers/05-null_db_fallback.rb
+++ b/config/initializers/05-null_db_fallback.rb
@@ -30,6 +30,6 @@
# As initializers and other parts of the boot sequence rely on calls accessing
# the DB, the null db gem is used to fake the existence of a database in cases where
# the db has not been created yet.
-require Rails.root.join("config/constants/open_project/null_db_fallback")
+require Rails.root.join('config/constants/open_project/null_db_fallback')
OpenProject::NullDbFallback.fallback
diff --git a/config/initializers/06-pending_migrations_check.rb b/config/initializers/06-pending_migrations_check.rb
index f564b2e33be8..869095e63b70 100644
--- a/config/initializers/06-pending_migrations_check.rb
+++ b/config/initializers/06-pending_migrations_check.rb
@@ -28,7 +28,7 @@
is_console = Rails.const_defined? :Console
no_rake_task = !(Rake.respond_to?(:application) && Rake.application.top_level_tasks.present?)
-no_override = ENV["OPENPROJECT_DISABLE__MIGRATIONS__CHECK"] != "true"
+no_override = ENV['OPENPROJECT_DISABLE__MIGRATIONS__CHECK'] != 'true'
if Rails.env.production? && !is_console && no_rake_task && no_override
ActiveRecord::Migration.check_pending! # will raise an exception and abort boot
diff --git a/config/initializers/10-load_patches.rb b/config/initializers/10-load_patches.rb
index a066aa06d6d8..05792c1c2504 100644
--- a/config/initializers/10-load_patches.rb
+++ b/config/initializers/10-load_patches.rb
@@ -28,10 +28,10 @@
Rails.application.reloader.to_prepare do
# Do not place any patches within this file. Add a file to lib/open_project/patches
- require "open_project/patches"
+ require 'open_project/patches'
# Whatever ruby file is placed in lib/open_project/patches is required
- Dir.glob(File.expand_path("../../lib/open_project/patches/*.rb", __dir__)).each do |path|
+ Dir.glob(File.expand_path('../../lib/open_project/patches/*.rb', __dir__)).each do |path|
require path
end
end
diff --git a/config/initializers/30-open_project_loading.rb b/config/initializers/30-open_project_loading.rb
index 43fdb1d470d9..0fea8c935977 100644
--- a/config/initializers/30-open_project_loading.rb
+++ b/config/initializers/30-open_project_loading.rb
@@ -26,4 +26,4 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require "open_project"
+require 'open_project'
diff --git a/config/initializers/activity.rb b/config/initializers/activity.rb
index f2e51ac1c49b..3c9f322f4f7b 100644
--- a/config/initializers/activity.rb
+++ b/config/initializers/activity.rb
@@ -26,36 +26,36 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "../constants/open_project/project_latest_activity"
+require_relative '../constants/open_project/project_latest_activity'
Rails.application.reloader.to_prepare do
OpenProject::Activity.map do |activity|
- activity.register :work_packages, class_name: "::Activities::WorkPackageActivityProvider"
- activity.register :project_attributes, class_name: "Activities::ProjectActivityProvider",
+ activity.register :work_packages, class_name: '::Activities::WorkPackageActivityProvider'
+ activity.register :project_attributes, class_name: 'Activities::ProjectActivityProvider',
default: false
- activity.register :changesets, class_name: "Activities::ChangesetActivityProvider"
- activity.register :news, class_name: "Activities::NewsActivityProvider",
+ activity.register :changesets, class_name: 'Activities::ChangesetActivityProvider'
+ activity.register :news, class_name: 'Activities::NewsActivityProvider',
default: false
- activity.register :wiki_edits, class_name: "Activities::WikiPageActivityProvider",
+ activity.register :wiki_edits, class_name: 'Activities::WikiPageActivityProvider',
default: false
- activity.register :messages, class_name: "Activities::MessageActivityProvider",
+ activity.register :messages, class_name: 'Activities::MessageActivityProvider',
default: false
end
- OpenProject::ProjectLatestActivity.register on: "WorkPackage"
+ OpenProject::ProjectLatestActivity.register on: 'WorkPackage'
- OpenProject::ProjectLatestActivity.register on: "Project",
+ OpenProject::ProjectLatestActivity.register on: 'Project',
project_id_attribute: :id
- OpenProject::ProjectLatestActivity.register on: "Changeset",
- chain: "Repository",
+ OpenProject::ProjectLatestActivity.register on: 'Changeset',
+ chain: 'Repository',
attribute: :committed_on
- OpenProject::ProjectLatestActivity.register on: "News"
+ OpenProject::ProjectLatestActivity.register on: 'News'
- OpenProject::ProjectLatestActivity.register on: "WikiPage",
+ OpenProject::ProjectLatestActivity.register on: 'WikiPage',
chain: %w(Wiki)
- OpenProject::ProjectLatestActivity.register on: "Message",
- chain: "Forum"
+ OpenProject::ProjectLatestActivity.register on: 'Message',
+ chain: 'Forum'
end
diff --git a/config/initializers/airbrake.rb b/config/initializers/airbrake.rb
index 453656c319d4..08c0268f7437 100644
--- a/config/initializers/airbrake.rb
+++ b/config/initializers/airbrake.rb
@@ -26,16 +26,16 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-airbrake = OpenProject::Configuration["airbrake"]
+airbrake = OpenProject::Configuration['airbrake']
-if airbrake && airbrake["api_key"]
+if airbrake && airbrake['api_key']
# airbrake isn't loaded by default, so let's do that now
- require "airbrake"
+ require 'airbrake'
Airbrake.configure do |config|
- config.api_key = airbrake["api_key"]
- config.host = airbrake["host"] if airbrake["host"]
- config.port = Integer(airbrake["port"] || 443)
+ config.api_key = airbrake['api_key']
+ config.host = airbrake['host'] if airbrake['host']
+ config.port = Integer(airbrake['port'] || 443)
config.secure = config.port == 443
Rails.logger.info "Successfully connected to Airbrake at #{config.host}:#{config.port}."
diff --git a/config/initializers/application_controller_renderer.rb b/config/initializers/application_controller_renderer.rb
index fd841a338439..933b963e841f 100644
--- a/config/initializers/application_controller_renderer.rb
+++ b/config/initializers/application_controller_renderer.rb
@@ -7,8 +7,8 @@
ActiveSupport::Reloader.to_prepare do
ApplicationController.renderer.instance_variable_set(:@env,
ApplicationController.renderer.instance_variable_get(:@env).merge(
- "HTTP_HOST" => Setting.host_name,
- "HTTPS" => Setting.https?,
- "SCRIPT_NAME" => OpenProject::Configuration.rails_relative_url_root
+ 'HTTP_HOST' => Setting.host_name,
+ 'HTTPS' => Setting.https?,
+ 'SCRIPT_NAME' => OpenProject::Configuration.rails_relative_url_root
))
end
diff --git a/config/initializers/appsignal.rb b/config/initializers/appsignal.rb
index 2b55b1951f69..4447db874e40 100644
--- a/config/initializers/appsignal.rb
+++ b/config/initializers/appsignal.rb
@@ -1,32 +1,32 @@
-require "open_project/version"
-require_relative "../../lib_static/open_project/appsignal"
+require 'open_project/version'
+require_relative '../../lib_static/open_project/appsignal'
if OpenProject::Appsignal.enabled?
- require "appsignal"
+ require 'appsignal'
Rails.application.configure do |app|
config = {
active: true,
- name: ENV.fetch("APPSIGNAL_NAME"),
- push_api_key: ENV.fetch("APPSIGNAL_KEY"),
+ name: ENV.fetch('APPSIGNAL_NAME'),
+ push_api_key: ENV.fetch('APPSIGNAL_KEY'),
revision: OpenProject::VERSION.to_s,
ignore_actions: [
- "OkComputer::OkComputerController#show",
- "OkComputer::OkComputerController#index",
- "GET::API::V3::Notifications::NotificationsAPI",
- "GET::API::V3::Notifications::NotificationsAPI#/notifications/"
+ 'OkComputer::OkComputerController#show',
+ 'OkComputer::OkComputerController#index',
+ 'GET::API::V3::Notifications::NotificationsAPI',
+ 'GET::API::V3::Notifications::NotificationsAPI#/notifications/'
],
ignore_errors: [
- "Grape::Exceptions::MethodNotAllowed",
- "ActionController::UnknownFormat",
- "ActiveJob::DeserializationError",
- "Net::SMTPServerBusy"
+ 'Grape::Exceptions::MethodNotAllowed',
+ 'ActionController::UnknownFormat',
+ 'ActiveJob::DeserializationError',
+ 'Net::SMTPServerBusy'
]
}
- if ENV["APPSIGNAL_DEBUG"] == "true"
- config[:log] = "stdout"
+ if ENV['APPSIGNAL_DEBUG'] == 'true'
+ config[:log] = 'stdout'
config[:debug] = true
- config[:log_level] = "debug"
+ config[:log_level] = 'debug'
end
Appsignal.config = Appsignal::Config.new(
diff --git a/config/initializers/bullet.rb b/config/initializers/bullet.rb
index 0b83d5bf1080..ac7a612a0e33 100644
--- a/config/initializers/bullet.rb
+++ b/config/initializers/bullet.rb
@@ -31,7 +31,7 @@
config.after_initialize do
Bullet.enable = true
# Bullet.alert = true
- Bullet.bullet_logger = true if File.directory?("log") # fails if run from an engine
+ Bullet.bullet_logger = true if File.directory?('log') # fails if run from an engine
Bullet.console = true
# Bullet.growl = true
Bullet.rails_logger = true
diff --git a/config/initializers/carrierwave.rb b/config/initializers/carrierwave.rb
index 9a7d8f909783..ebcb20e3cc4f 100644
--- a/config/initializers/carrierwave.rb
+++ b/config/initializers/carrierwave.rb
@@ -26,9 +26,9 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require "fog/aws"
-require "carrierwave"
-require "carrierwave/storage/fog"
+require 'fog/aws'
+require 'carrierwave'
+require 'carrierwave/storage/fog'
module CarrierWave
module Configuration
@@ -37,13 +37,13 @@ def self.configure_fog!(credentials: OpenProject::Configuration.fog_credentials,
public: false)
# Ensure that the provider AWS is uppercased
- provider = credentials[:provider] || "AWS"
- if [:aws, "aws"].include? provider
- credentials[:provider] = "AWS"
+ provider = credentials[:provider] || 'AWS'
+ if [:aws, 'aws'].include? provider
+ credentials[:provider] = 'AWS'
end
CarrierWave.configure do |config|
- config.fog_provider = "fog/aws"
+ config.fog_provider = 'fog/aws'
config.fog_credentials = credentials
config.fog_directory = directory
config.fog_public = public
diff --git a/config/initializers/cronjobs.rb b/config/initializers/cronjobs.rb
index af7c61e8d6f7..6dda0beb89ed 100644
--- a/config/initializers/cronjobs.rb
+++ b/config/initializers/cronjobs.rb
@@ -1,71 +1,15 @@
-#-- copyright
-# OpenProject is an open source project management software.
-# Copyright (C) 2012-2024 the OpenProject GmbH
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License version 3.
-#
-# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
-# Copyright (C) 2006-2013 Jean-Philippe Lang
-# Copyright (C) 2010-2013 the ChiliProject Team
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# See COPYRIGHT and LICENSE files for more details.
-#++
-
# Register "Cron-like jobs"
-Rails.application.config.after_initialize do
- Rails.application.config.good_job.cron.merge!(
- {
- "Cron::ClearOldSessionsJob": {
- cron: "15 1 * * *", # runs at 1:15 nightly
- class: Cron::ClearOldSessionsJob.name
- },
- "Cron::ClearTmpCacheJob": {
- cron: "45 2 * * 7", # runs at 02:45 sundays
- class: Cron::ClearTmpCacheJob.name
- },
- "Cron::ClearUploadedFilesJob": {
- cron: "0 23 * * 5", # runs 23:00 fridays
- class: Cron::ClearUploadedFilesJob.name
- },
- "OAuth::CleanupJob": {
- cron: "52 1 * * *",
- class: OAuth::CleanupJob.name
- },
- "PaperTrailAudits::CleanupJob": {
- cron: "3 4 * * 6",
- class: PaperTrailAudits::CleanupJob.name
- },
- "Attachments::CleanupUncontaineredJob": {
- cron: "03 22 * * *",
- class: Attachments::CleanupUncontaineredJob.name
- },
- "Notifications::ScheduleDateAlertsNotificationsJob": {
- cron: "*/15 * * * *",
- class: Notifications::ScheduleDateAlertsNotificationsJob.name
- },
- "Notifications::ScheduleReminderMailsJob": {
- cron: "*/15 * * * *",
- class: Notifications::ScheduleReminderMailsJob.name
- },
- "Ldap::SynchronizationJob": {
- cron: "30 23 * * *",
- class: Ldap::SynchronizationJob.name
- }
- }
- )
+
+Rails.application.configure do |application|
+ application.config.to_prepare do
+ Cron::CronJob.register! Cron::ClearOldSessionsJob,
+ Cron::ClearTmpCacheJob,
+ Cron::ClearUploadedFilesJob,
+ OAuth::CleanupJob,
+ PaperTrailAudits::CleanupJob,
+ Attachments::CleanupUncontaineredJob,
+ Notifications::ScheduleDateAlertsNotificationsJob,
+ Notifications::ScheduleReminderMailsJob,
+ Ldap::SynchronizationJob
+ end
end
diff --git a/config/initializers/custom_deprecators.rb b/config/initializers/custom_deprecators.rb
index a689d7784780..5a9c0d67d888 100644
--- a/config/initializers/custom_deprecators.rb
+++ b/config/initializers/custom_deprecators.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "../../lib/open_project/deprecation"
+require_relative '../../lib/open_project/deprecation'
Rails.application.configure do
# Register our custom deprecator to automatically take logging options
diff --git a/config/initializers/custom_field_format.rb b/config/initializers/custom_field_format.rb
index 7e67798075cc..00408d7e3d48 100644
--- a/config/initializers/custom_field_format.rb
+++ b/config/initializers/custom_field_format.rb
@@ -27,51 +27,51 @@
#++
OpenProject::CustomFieldFormat.map do |fields|
- fields.register OpenProject::CustomFieldFormat.new("string",
+ fields.register OpenProject::CustomFieldFormat.new('string',
label: :label_string,
order: 1)
- fields.register OpenProject::CustomFieldFormat.new("text",
+ fields.register OpenProject::CustomFieldFormat.new('text',
label: :label_text,
order: 2,
- formatter: "CustomValue::FormattableStrategy")
- fields.register OpenProject::CustomFieldFormat.new("int",
+ formatter: 'CustomValue::FormattableStrategy')
+ fields.register OpenProject::CustomFieldFormat.new('int',
label: :label_integer,
order: 3,
- formatter: "CustomValue::IntStrategy")
- fields.register OpenProject::CustomFieldFormat.new("float",
+ formatter: 'CustomValue::IntStrategy')
+ fields.register OpenProject::CustomFieldFormat.new('float',
label: :label_float,
order: 4,
- formatter: "CustomValue::FloatStrategy")
- fields.register OpenProject::CustomFieldFormat.new("list",
+ formatter: 'CustomValue::FloatStrategy')
+ fields.register OpenProject::CustomFieldFormat.new('list',
label: :label_list,
order: 5,
- formatter: "CustomValue::ListStrategy")
- fields.register OpenProject::CustomFieldFormat.new("date",
+ formatter: 'CustomValue::ListStrategy')
+ fields.register OpenProject::CustomFieldFormat.new('date',
label: :label_date,
order: 6,
- formatter: "CustomValue::DateStrategy")
- fields.register OpenProject::CustomFieldFormat.new("bool",
+ formatter: 'CustomValue::DateStrategy')
+ fields.register OpenProject::CustomFieldFormat.new('bool',
label: :label_boolean,
order: 7,
- formatter: "CustomValue::BoolStrategy")
- fields.register OpenProject::CustomFieldFormat.new("user",
+ formatter: 'CustomValue::BoolStrategy')
+ fields.register OpenProject::CustomFieldFormat.new('user',
label: Proc.new { User.model_name.human },
only: %w(WorkPackage TimeEntry
Version Project),
- edit_as: "list",
+ edit_as: 'list',
order: 8,
- formatter: "CustomValue::UserStrategy")
- fields.register OpenProject::CustomFieldFormat.new("version",
+ formatter: 'CustomValue::UserStrategy')
+ fields.register OpenProject::CustomFieldFormat.new('version',
label: Proc.new { Version.model_name.human },
only: %w(WorkPackage TimeEntry
Version Project),
- edit_as: "list",
+ edit_as: 'list',
order: 9,
- formatter: "CustomValue::VersionStrategy")
+ formatter: 'CustomValue::VersionStrategy')
# This is an internal formatter used as a fallback in case a value is not found.
# Setting the label to nil in order to avoid it becoming available for selection as a custom value format.
- fields.register OpenProject::CustomFieldFormat.new("empty",
+ fields.register OpenProject::CustomFieldFormat.new('empty',
label: nil,
order: 10,
- formatter: "CustomValue::EmptyStrategy")
+ formatter: 'CustomValue::EmptyStrategy')
end
diff --git a/config/initializers/database_pool_size.rb b/config/initializers/database_pool_size.rb
index f561765d1abb..8809f2439de9 100644
--- a/config/initializers/database_pool_size.rb
+++ b/config/initializers/database_pool_size.rb
@@ -1,33 +1,5 @@
-#-- copyright
-# OpenProject is an open source project management software.
-# Copyright (C) 2012-2023 the OpenProject GmbH
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License version 3.
-#
-# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
-# Copyright (C) 2006-2013 Jean-Philippe Lang
-# Copyright (C) 2010-2013 the ChiliProject Team
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# See COPYRIGHT and LICENSE files for more details.
-#++
-
config = Rails.env.production? && Rails.application.config.database_configuration[Rails.env]
-pool_size = config && [OpenProject::Configuration.web_max_threads + 1, config["pool"].to_i].max
+pool_size = config && [OpenProject::Configuration.web_max_threads + 1, config['pool'].to_i].max
# make sure we have enough connections in the pool for each thread and then some
if pool_size && pool_size > ActiveRecord::Base.connection_pool.size
diff --git a/modules/storages/app/common/storages/peripherals/storage_interaction/authentication_strategies/o_auth_configuration.rb b/config/initializers/delayed_job_config.rb
similarity index 57%
rename from modules/storages/app/common/storages/peripherals/storage_interaction/authentication_strategies/o_auth_configuration.rb
rename to config/initializers/delayed_job_config.rb
index 263bcd29189e..89c3af7505ce 100644
--- a/modules/storages/app/common/storages/peripherals/storage_interaction/authentication_strategies/o_auth_configuration.rb
+++ b/config/initializers/delayed_job_config.rb
@@ -1,5 +1,3 @@
-# frozen_string_literal:true
-
#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) 2012-2024 the OpenProject GmbH
@@ -28,28 +26,30 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-module Storages
- module Peripherals
- module StorageInteraction
- module AuthenticationStrategies
- class OAuthConfiguration
- include ActiveModel::Validations
+# Disable delayed_job's own logging as we have activejob
+Delayed::Worker.logger = nil
+
+# By default bypass worker queue and execute asynchronous tasks at once
+Delayed::Worker.delay_jobs = true
- attr_reader :scope, :issuer, :client_secret, :client_id
+# Prevent loading ApplicationJob during initialization
+Rails.application.reloader.to_prepare do
+ # Set default priority (lower = higher priority)
+ # Example ordering, see ApplicationJob.priority_number
+ Delayed::Worker.default_priority = ApplicationJob.priority_number(:default)
+end
- validates_presence_of :client_id, :client_secret, :issuer
+# Do not retry jobs from delayed_job
+# instead use 'retry_on' activejob functionality
+Delayed::Worker.max_attempts = 1
- def initialize(client_id: nil,
- client_secret: nil,
- issuer: nil,
- scope: nil)
- @client_id = client_id
- @client_secret = client_secret
- @issuer = issuer
- @scope = scope
- end
- end
- end
+# Remember DJ id in the payload object
+class Delayed::ProviderJobIdPlugin < Delayed::Plugin
+ callbacks do |lifecycle|
+ lifecycle.before(:invoke_job) do |job|
+ job.payload_object.job_data['provider_job_id'] = job.id if job.payload_object.respond_to?(:job_data)
end
end
end
+
+Delayed::Worker.plugins << Delayed::ProviderJobIdPlugin
diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb
index 46080077b757..1f20f2c6fb80 100644
--- a/config/initializers/doorkeeper.rb
+++ b/config/initializers/doorkeeper.rb
@@ -48,7 +48,7 @@
# Defaults to ActionController::Base.
# See https://github.com/doorkeeper-gem/doorkeeper#custom-base-controller
#
- base_controller "::OAuth::AuthBaseController"
+ base_controller '::OAuth::AuthBaseController'
# Enable hashing and bcrypt-hashing of token secrets
# and application secrets, respectively.
@@ -197,9 +197,9 @@
application.config.to_prepare do
# Requiring some classes of Doorkeeper ourselves which for whatever reasons are
# no longer loaded for us now that we use zeitwerk
- require "doorkeeper/application_metal_controller"
- require "doorkeeper/application_controller"
- require "doorkeeper/tokens_controller"
- require "doorkeeper/authorizations_controller"
+ require 'doorkeeper/application_metal_controller'
+ require 'doorkeeper/application_controller'
+ require 'doorkeeper/tokens_controller'
+ require 'doorkeeper/authorizations_controller'
end
end
diff --git a/config/initializers/feature_decisions.rb b/config/initializers/feature_decisions.rb
index e98381d9be1e..407769fe3cd4 100644
--- a/config/initializers/feature_decisions.rb
+++ b/config/initializers/feature_decisions.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
# ++
-require_relative "../../lib_static/open_project/feature_decisions"
+require_relative '../../lib_static/open_project/feature_decisions'
# Add feature flags here via e.g.
#
diff --git a/config/initializers/grape_logging.rb b/config/initializers/grape_logging.rb
index b232a282e3ae..015303792fe7 100644
--- a/config/initializers/grape_logging.rb
+++ b/config/initializers/grape_logging.rb
@@ -1,6 +1,6 @@
Rails.application.configure do
config.after_initialize do
- ActiveSupport::Notifications.subscribe("openproject_grape_logger") do |_, _, _, _, payload|
+ ActiveSupport::Notifications.subscribe('openproject_grape_logger') do |_, _, _, _, payload|
time = payload[:time]
attributes = {
duration: time[:total],
diff --git a/config/initializers/health_checks.rb b/config/initializers/health_checks.rb
index 7f23b0f09156..8905f2d73786 100644
--- a/config/initializers/health_checks.rb
+++ b/config/initializers/health_checks.rb
@@ -1,37 +1,107 @@
-require "ok_computer/ok_computer_controller"
+require 'ok_computer/ok_computer_controller'
-Rails.application.configure do
- config.after_initialize do
- OkComputer::Registry.register "worker", OpenProject::HealthChecks::GoodJobCheck.new
- OkComputer::Registry.register "worker_backed_up", OpenProject::HealthChecks::GoodJobBackedUpCheck.new
+class DelayedJobNeverRanCheck < OkComputer::Check
+ attr_reader :threshold
- OkComputer::Registry.register "puma", OpenProject::HealthChecks::PumaCheck.new
+ def initialize(minute_threshold)
+ @threshold = minute_threshold.to_i
+ end
- # Make dj backed up optional due to bursts
- OkComputer.make_optional %w(worker_backed_up puma)
+ def check
+ never_ran = Delayed::Job.where('run_at < ?', threshold.minutes.ago).count
- # Register web worker check for web + database
- OkComputer::CheckCollection.new("web").tap do |collection|
- collection.register :default, OkComputer::Registry.fetch("default")
- collection.register :database, OkComputer::Registry.fetch("database")
- OkComputer::Registry.default_collection.register "web", collection
+ if never_ran.zero?
+ mark_message "All previous jobs have completed within the past #{threshold} minutes."
+ else
+ mark_failure
+ mark_message "#{never_ran} jobs waiting to be executed for more than #{threshold} minutes"
end
+ end
+end
+
+class PumaCheck < OkComputer::Check
+ attr_reader :threshold
+
+ def initialize(backlog_threshold)
+ @threshold = backlog_threshold.to_i
+ end
+
+ def check
+ stats = self.stats
- # Register full check for web + database + dj worker
- OkComputer::CheckCollection.new("full").tap do |collection|
- collection.register :default, OkComputer::Registry.fetch("default")
- collection.register :database, OkComputer::Registry.fetch("database")
- collection.register :mail, OpenProject::HealthChecks::SmtpCheck.new
- collection.register :worker, OkComputer::Registry.fetch("worker")
- collection.register :worker_backed_up, OkComputer::Registry.fetch("worker_backed_up")
- collection.register :puma, OkComputer::Registry.fetch("puma")
- OkComputer::Registry.default_collection.register "full", collection
+ return mark_message "N/A as Puma is not used." if stats.nil?
+
+ if stats[:running] > 0
+ mark_message "Puma is running"
+ else
+ mark_failure
+ mark_message "Puma is not running"
end
- # Check if authentication required
- authentication_password = OpenProject::Configuration.health_checks_authentication_password
- if authentication_password.present?
- OkComputer.require_authentication("health_checks", authentication_password)
+ if stats[:backlog] < threshold
+ mark_message "Backlog ok"
+ else
+ mark_failure
+ mark_message "Backlog congested"
end
end
+
+ def stats
+ return nil unless applicable?
+
+ server = Puma::Server.current
+ return nil if server.nil?
+
+ {
+ backlog: server.backlog || 0,
+ running: server.running || 0,
+ pool_capacity: server.pool_capacity || 0,
+ max_threads: server.max_threads || 0
+ }
+ end
+
+ def applicable?
+ return @applicable unless @applicable.nil?
+
+ @applicable = Object.const_defined?("Puma::Server") && !Puma::Server.current.nil?
+ end
+end
+
+# Register delayed_job backed up test
+dj_max = OpenProject::Configuration.health_checks_jobs_queue_count_threshold
+OkComputer::Registry.register "delayed_jobs_backed_up",
+ OkComputer::DelayedJobBackedUpCheck.new(0, dj_max)
+
+dj_never_ran_max = OpenProject::Configuration.health_checks_jobs_never_ran_minutes_ago
+OkComputer::Registry.register "delayed_jobs_never_ran",
+ DelayedJobNeverRanCheck.new(dj_never_ran_max)
+
+backlog_threshold = OpenProject::Configuration.health_checks_backlog_threshold
+OkComputer::Registry.register "puma", PumaCheck.new(backlog_threshold)
+
+# Make dj backed up optional due to bursts
+OkComputer.make_optional %w(delayed_jobs_backed_up puma)
+
+# Register web worker check for web + database
+OkComputer::CheckCollection.new('web').tap do |collection|
+ collection.register :default, OkComputer::Registry.fetch('default')
+ collection.register :database, OkComputer::Registry.fetch('database')
+ OkComputer::Registry.default_collection.register 'web', collection
+end
+
+# Register full check for web + database + dj worker
+OkComputer::CheckCollection.new('full').tap do |collection|
+ collection.register :default, OkComputer::Registry.fetch('default')
+ collection.register :database, OkComputer::Registry.fetch('database')
+ collection.register :mail, OkComputer::ActionMailerCheck.new
+ collection.register :delayed_jobs_backed_up, OkComputer::Registry.fetch('delayed_jobs_backed_up')
+ collection.register :delayed_jobs_never_ran, OkComputer::Registry.fetch('delayed_jobs_never_ran')
+ collection.register :puma, OkComputer::Registry.fetch('puma')
+ OkComputer::Registry.default_collection.register 'full', collection
+end
+
+# Check if authentication required
+authentication_password = OpenProject::Configuration.health_checks_authentication_password
+if authentication_password.present?
+ OkComputer.require_authentication('health_checks', authentication_password)
end
diff --git a/config/initializers/homescreen.rb b/config/initializers/homescreen.rb
index 0dff7d9d0305..5f982831c543 100644
--- a/config/initializers/homescreen.rb
+++ b/config/initializers/homescreen.rb
@@ -26,44 +26,44 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require "open_project/static/homescreen"
-require "open_project/static/links"
+require 'open_project/static/homescreen'
+require 'open_project/static/links'
OpenProject::Static::Homescreen.manage :blocks do |blocks|
blocks.push(
{
- partial: "welcome",
+ partial: 'welcome',
if: Proc.new { Setting.welcome_on_homescreen? && Setting.welcome_text.present? }
},
{
- partial: "projects"
+ partial: 'projects'
},
{
- partial: "new_features",
+ partial: 'new_features',
if: Proc.new { OpenProject::Configuration.show_community_links? }
},
{
- partial: "users",
+ partial: 'users',
if: Proc.new { User.current.admin? }
},
{
- partial: "my_account",
+ partial: 'my_account',
if: Proc.new { User.current.logged? }
},
{
- partial: "news",
+ partial: 'news',
if: Proc.new { !@news.empty? }
},
{
- partial: "community",
+ partial: 'community',
if: Proc.new { EnterpriseToken.show_banners? || OpenProject::Configuration.show_community_links? }
},
{
- partial: "administration",
+ partial: 'administration',
if: Proc.new { User.current.admin? }
},
{
- partial: "upsale",
+ partial: 'upsale',
if: Proc.new { EnterpriseToken.show_banners? }
}
)
@@ -75,22 +75,22 @@
links.push(
{
label: :user_guides,
- icon: "icon-context icon-rename",
+ icon: 'icon-context icon-rename',
url: link_hash[:user_guides][:href]
},
{
label: :glossary,
- icon: "icon-context icon-glossar",
+ icon: 'icon-context icon-glossar',
url: link_hash[:glossary][:href]
},
{
label: :shortcuts,
- icon: "icon-context icon-shortcuts",
+ icon: 'icon-context icon-shortcuts',
url: link_hash[:shortcuts][:href]
},
{
label: :forums,
- icon: "icon-context icon-forums",
+ icon: 'icon-context icon-forums',
url: link_hash[:forums][:href]
}
)
@@ -99,7 +99,7 @@
links.push({
label: impressum_link[:label],
url: impressum_link[:href],
- icon: "icon-context icon-info1"
+ icon: 'icon-context icon-info1'
})
end
end
diff --git a/config/initializers/i18n.rb b/config/initializers/i18n.rb
index 721dbd247f8a..03cbf2356e8b 100644
--- a/config/initializers/i18n.rb
+++ b/config/initializers/i18n.rb
@@ -1,6 +1,6 @@
# load custom translation rules, as stored in config/locales/plurals.rb
# to be aware of e.g. Japanese not having a plural from for nouns
-require "open_project/translations/pluralization_backend"
+require 'open_project/translations/pluralization_backend'
I18n::Backend::Simple.include OpenProject::Translations::PluralizationBackend
# Adds fallback to default locale for untranslated strings
diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb
index 252893140147..70870b30fd8a 100644
--- a/config/initializers/inflections.rb
+++ b/config/initializers/inflections.rb
@@ -41,8 +41,8 @@
# These inflection rules are supported but not enabled by default:
ActiveSupport::Inflector.inflections(:en) do |inflect|
inflect.acronym "API"
- inflect.acronym "OAuth"
- inflect.acronym "OpenID"
- inflect.acronym "ICal"
- inflect.acronym "ClamAV"
+ inflect.acronym 'OAuth'
+ inflect.acronym 'OpenID'
+ inflect.acronym 'ICal'
+ inflect.acronym 'ClamAV'
end
diff --git a/config/initializers/lookbook.rb b/config/initializers/lookbook.rb
index bfd03771fe86..10f1c1874e66 100644
--- a/config/initializers/lookbook.rb
+++ b/config/initializers/lookbook.rb
@@ -1,20 +1,20 @@
Rails.application.configure do
next unless OpenProject::Configuration.lookbook_enabled?
- require "factory_bot"
- require "factory_bot_rails"
+ require 'factory_bot'
+ require 'factory_bot_rails'
# Re-define snapshot to avoid warnings
YARD::Tags::Library.define_tag("Snapshot preview (unused)", :snapshot)
config.lookbook.project_name = "OpenProject Lookbook"
- config.lookbook.project_logo = Rails.root.join("app/assets/images/icon_logo_white.svg").read
- config.lookbook.ui_favicon = Rails.root.join("app/assets/images/icon_logo.svg").read
+ config.lookbook.project_logo = Rails.root.join('app/assets/images/icon_logo_white.svg').read
+ config.lookbook.ui_favicon = Rails.root.join('app/assets/images/icon_logo.svg').read
config.lookbook.page_paths = [Rails.root.join("lookbook/docs").to_s]
- config.lookbook.component_paths << Primer::ViewComponents::Engine.root.join("app/components").to_s
+ config.lookbook.component_paths << Primer::ViewComponents::Engine.root.join('app/components').to_s
config.view_component.preview_paths += [
Rails.root.join("lookbook/previews").to_s,
- Primer::ViewComponents::Engine.root.join("previews").to_s
+ Primer::ViewComponents::Engine.root.join('previews').to_s
]
# Show pages first, then previews
diff --git a/config/initializers/mail_starttls_patch.rb b/config/initializers/mail_starttls_patch.rb
index 7c33fc0038a4..5bdf6f6b2fc4 100644
--- a/config/initializers/mail_starttls_patch.rb
+++ b/config/initializers/mail_starttls_patch.rb
@@ -1,6 +1,6 @@
# frozen_string_literal: true
-require "mail/network/delivery_methods/smtp"
+require 'mail/network/delivery_methods/smtp'
# Monkey patch mail 2.8.1 to make it possible to disable STARTTLS.
# without having to change existing settings.
diff --git a/config/initializers/menus.rb b/config/initializers/menus.rb
index ec7662bd4824..a5ce41ce3da2 100644
--- a/config/initializers/menus.rb
+++ b/config/initializers/menus.rb
@@ -26,39 +26,39 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require "redmine/menu_manager"
+require 'redmine/menu_manager'
Redmine::MenuManager.map :top_menu do |menu|
# projects menu will be added by
# Redmine::MenuManager::TopMenuHelper#render_projects_top_menu_node
menu.push :projects,
- { controller: "/projects", project_id: nil, action: "index" },
+ { controller: '/projects', project_id: nil, action: 'index' },
context: :modules,
- caption: I18n.t("label_projects_menu"),
- icon: "projects",
+ caption: I18n.t('label_projects_menu'),
+ icon: 'projects',
if: Proc.new {
User.current.logged? || !Setting.login_required?
}
menu.push :activity,
- { controller: "/activities", action: "index" },
+ { controller: '/activities', action: 'index' },
context: :modules,
- icon: "checkmark"
+ icon: 'checkmark'
menu.push :work_packages,
- { controller: "/work_packages", project_id: nil, state: nil, action: "index" },
+ { controller: '/work_packages', project_id: nil, state: nil, action: 'index' },
context: :modules,
- caption: I18n.t("label_work_package_plural"),
- icon: "work-packages",
+ caption: I18n.t('label_work_package_plural'),
+ icon: 'work-packages',
if: Proc.new {
(User.current.logged? || !Setting.login_required?) &&
User.current.allowed_in_any_work_package?(:view_work_packages)
}
menu.push :news,
- { controller: "/news", project_id: nil, action: "index" },
+ { controller: '/news', project_id: nil, action: 'index' },
context: :modules,
- caption: I18n.t("label_news_plural"),
- icon: "news",
+ caption: I18n.t('label_news_plural'),
+ icon: 'news',
if: Proc.new {
(User.current.logged? || !Setting.login_required?) &&
User.current.allowed_in_any_project?(:view_news)
@@ -67,17 +67,17 @@
menu.push :help,
OpenProject::Static::Links.help_link,
last: true,
- caption: "",
- icon: "help op-app-help--icon",
+ caption: '',
+ icon: 'help op-app-help--icon',
html: { accesskey: OpenProject::AccessKeys.key_for(:help),
- title: I18n.t("label_help"),
- target: "_blank" }
+ title: I18n.t('label_help'),
+ target: '_blank' }
end
Redmine::MenuManager.map :quick_add_menu do |menu|
menu.push :new_project,
Proc.new { |project|
- { controller: "/projects", action: :new, project_id: nil, parent_id: project&.id }
+ { controller: '/projects', action: :new, project_id: nil, parent_id: project&.id }
},
caption: ->(*) { Project.model_name.human },
icon: "add",
@@ -93,32 +93,32 @@
menu.push :invite_user,
nil,
caption: :label_invite_user,
- icon: "user-plus",
+ icon: 'user-plus',
html: {
- "invite-user-modal-augment": "invite-user-modal-augment"
+ 'invite-user-modal-augment': 'invite-user-modal-augment'
},
if: Proc.new { User.current.allowed_in_any_project?(:manage_members) }
end
Redmine::MenuManager.map :account_menu do |menu|
menu.push :timers,
- { controller: "/my/timer", action: "show" },
- partial: "/my/timer/menu"
+ { controller: '/my/timer', action: 'show' },
+ partial: '/my/timer/menu'
menu.push :my_page,
:my_page_path,
- caption: I18n.t("js.my_page.label"),
+ caption: I18n.t('js.my_page.label'),
if: Proc.new { User.current.logged? }
menu.push :my_profile,
- { controller: "/users", action: "show", id: "me" },
+ { controller: '/users', action: 'show', id: 'me' },
caption: :label_my_activity,
if: Proc.new { User.current.logged? }
menu.push :my_account,
- { controller: "/my", action: "account" },
+ { controller: '/my', action: 'account' },
if: Proc.new { User.current.logged? }
menu.push :administration,
- { controller: "/admin", action: "index" },
+ { controller: '/admin', action: 'index' },
if: Proc.new {
- User.current.allowed_globally?({ controller: "/admin", action: "index" })
+ User.current.allowed_globally?({ controller: '/admin', action: 'index' })
}
menu.push :logout,
:signout_path,
@@ -128,53 +128,53 @@
Redmine::MenuManager.map :global_menu do |menu|
# Homescreen
menu.push :home,
- { controller: "/homescreen", action: "index" },
- icon: "home",
+ { controller: '/homescreen', action: 'index' },
+ icon: 'home',
first: true
# Projects
menu.push :projects,
- { controller: "/projects", project_id: nil, action: "index" },
- caption: I18n.t("label_projects_menu"),
- icon: "projects",
+ { controller: '/projects', project_id: nil, action: 'index' },
+ caption: I18n.t('label_projects_menu'),
+ icon: 'projects',
after: :home,
if: Proc.new {
User.current.logged? || !Setting.login_required?
}
menu.push :projects_query_select,
- { controller: "/projects", project_id: nil, action: "index" },
+ { controller: '/projects', project_id: nil, action: 'index' },
parent: :projects,
- partial: "projects/menus/menu"
+ partial: 'projects/menus/menu'
# Activity
menu.push :activity,
- { controller: "/activities", action: "index" },
- icon: "checkmark",
+ { controller: '/activities', action: 'index' },
+ icon: 'checkmark',
after: :projects
menu.push :activity_filters,
- { controller: "/activities", action: "index" },
+ { controller: '/activities', action: 'index' },
parent: :activity,
- partial: "activities/filters_menu"
+ partial: 'activities/filters_menu'
# Work packages
menu.push :work_packages,
- { controller: "/work_packages", action: "index" },
+ { controller: '/work_packages', action: 'index' },
caption: :label_work_package_plural,
- icon: "view-list",
+ icon: 'view-list',
after: :activity
menu.push :work_packages_query_select,
- { controller: "/work_packages", action: "index" },
+ { controller: '/work_packages', action: 'index' },
parent: :work_packages,
- partial: "work_packages/menu_query_select"
+ partial: 'work_packages/menu_query_select'
# News
menu.push :news,
- { controller: "/news", project_id: nil, action: "index" },
- caption: I18n.t("label_news_plural"),
- icon: "news",
+ { controller: '/news', project_id: nil, action: 'index' },
+ caption: I18n.t('label_news_plural'),
+ icon: 'news',
after: :boards,
if: Proc.new {
(User.current.logged? || !Setting.login_required?) &&
@@ -184,194 +184,194 @@
Redmine::MenuManager.map :notifications_menu do |menu|
menu.push :notification_grouping_select,
- { controller: "/my", action: "notifications" },
- partial: "notifications/menu_notification_center"
+ { controller: '/my', action: 'notifications' },
+ partial: 'notifications/menu_notification_center'
end
Redmine::MenuManager.map :my_menu do |menu|
menu.push :account,
- { controller: "/my", action: "account" },
+ { controller: '/my', action: 'account' },
caption: :label_profile,
- icon: "user"
+ icon: 'user'
menu.push :settings,
- { controller: "/my", action: "settings" },
+ { controller: '/my', action: 'settings' },
caption: :label_setting_plural,
- icon: "settings2"
+ icon: 'settings2'
menu.push :password,
- { controller: "/my", action: "password" },
+ { controller: '/my', action: 'password' },
caption: :button_change_password,
if: Proc.new { User.current.change_password_allowed? },
- icon: "locked"
+ icon: 'locked'
menu.push :access_token,
- { controller: "/my", action: "access_token" },
- caption: I18n.t("my_account.access_tokens.access_tokens"),
- icon: "key"
+ { controller: '/my', action: 'access_token' },
+ caption: I18n.t('my_account.access_tokens.access_tokens'),
+ icon: 'key'
menu.push :sessions,
- { controller: "/my/sessions", action: :index },
- caption: :"users.sessions.title",
- icon: "installation-services"
+ { controller: '/my/sessions', action: :index },
+ caption: :'users.sessions.title',
+ icon: 'installation-services'
menu.push :notifications,
- { controller: "/my", action: "notifications" },
- caption: I18n.t("js.notifications.settings.title"),
- icon: "bell"
+ { controller: '/my', action: 'notifications' },
+ caption: I18n.t('js.notifications.settings.title'),
+ icon: 'bell'
menu.push :reminders,
- { controller: "/my", action: "reminders" },
- caption: I18n.t("js.reminders.settings.title"),
- icon: "email-alert"
+ { controller: '/my', action: 'reminders' },
+ caption: I18n.t('js.reminders.settings.title'),
+ icon: 'email-alert'
menu.push :delete_account, :delete_my_account_info_path,
- caption: I18n.t("account.delete"),
+ caption: I18n.t('account.delete'),
param: :user_id,
if: Proc.new { Setting.users_deletable_by_self? },
last: :delete_account,
- icon: "delete"
+ icon: 'delete'
end
Redmine::MenuManager.map :admin_menu do |menu|
menu.push :admin_overview,
- { controller: "/admin", action: :index },
+ { controller: '/admin', action: :index },
if: Proc.new { User.current.admin? },
caption: :label_overview,
- icon: "home",
+ icon: 'home',
first: true
menu.push :users,
- { controller: "/users" },
+ { controller: '/users' },
if: Proc.new {
!User.current.admin? &&
(User.current.allowed_globally?(:manage_user) || User.current.allowed_globally?(:create_user))
},
caption: :label_user_plural,
- icon: "group"
+ icon: 'group'
menu.push :placeholder_users,
- { controller: "/placeholder_users" },
+ { controller: '/placeholder_users' },
if: Proc.new { !User.current.admin? && User.current.allowed_globally?(:manage_placeholder_user) },
caption: :label_placeholder_user_plural,
- icon: "group"
+ icon: 'group'
menu.push :users_and_permissions,
- { controller: "/users" },
+ { controller: '/users' },
if: Proc.new { User.current.admin? },
caption: :label_user_and_permission,
- icon: "group"
+ icon: 'group'
menu.push :user_settings,
- { controller: "/admin/settings/users_settings", action: :show },
+ { controller: '/admin/settings/users_settings', action: :show },
if: Proc.new { User.current.admin? },
caption: :label_users_settings,
parent: :users_and_permissions
menu.push :users,
- { controller: "/users" },
+ { controller: '/users' },
if: Proc.new { User.current.admin? },
caption: :label_user_plural,
parent: :users_and_permissions
menu.push :placeholder_users,
- { controller: "/placeholder_users" },
+ { controller: '/placeholder_users' },
if: Proc.new { User.current.admin? },
caption: :label_placeholder_user_plural,
parent: :users_and_permissions,
- enterprise_feature: "placeholder_users"
+ enterprise_feature: 'placeholder_users'
menu.push :groups,
- { controller: "/groups" },
+ { controller: '/groups' },
if: Proc.new { User.current.admin? },
caption: :label_group_plural,
parent: :users_and_permissions
menu.push :roles,
- { controller: "/roles" },
+ { controller: '/roles' },
if: Proc.new { User.current.admin? },
caption: :label_role_and_permissions,
parent: :users_and_permissions
menu.push :permissions_report,
- { controller: "/roles", action: "report" },
+ { controller: '/roles', action: 'report' },
if: Proc.new { User.current.admin? },
caption: :label_permissions_report,
parent: :users_and_permissions
menu.push :user_avatars,
- { controller: "/admin/settings", action: "show_plugin", id: :openproject_avatars },
+ { controller: '/admin/settings', action: 'show_plugin', id: :openproject_avatars },
if: Proc.new { User.current.admin? },
caption: :label_avatar_plural,
parent: :users_and_permissions
menu.push :admin_work_packages,
- { controller: "/admin/settings/work_packages_settings", action: :show },
+ { controller: '/admin/settings/work_packages_settings', action: :show },
if: Proc.new { User.current.admin? },
caption: :label_work_package_plural,
- icon: "view-list"
+ icon: 'view-list'
menu.push :work_packages_setting,
- { controller: "/admin/settings/work_packages_settings", action: :show },
+ { controller: '/admin/settings/work_packages_settings', action: :show },
if: Proc.new { User.current.admin? },
caption: :label_setting_plural,
parent: :admin_work_packages
menu.push :types,
- { controller: "/types" },
+ { controller: '/types' },
if: Proc.new { User.current.admin? },
caption: :label_type_plural,
parent: :admin_work_packages
menu.push :statuses,
- { controller: "/statuses" },
+ { controller: '/statuses' },
if: Proc.new { User.current.admin? },
caption: :label_status,
parent: :admin_work_packages,
- html: { class: "statuses" }
+ html: { class: 'statuses' }
menu.push :workflows,
- { controller: "/workflows", action: "edit" },
+ { controller: '/workflows', action: 'edit' },
if: Proc.new { User.current.admin? },
caption: Proc.new { Workflow.model_name.human },
parent: :admin_work_packages
menu.push :custom_fields,
- { controller: "/custom_fields" },
+ { controller: '/custom_fields' },
if: Proc.new { User.current.admin? },
caption: :label_custom_field_plural,
- icon: "custom-fields",
- html: { class: "custom_fields" }
+ icon: 'custom-fields',
+ html: { class: 'custom_fields' }
menu.push :custom_actions,
- { controller: "/custom_actions" },
+ { controller: '/custom_actions' },
if: Proc.new { User.current.admin? },
- caption: :"custom_actions.plural",
+ caption: :'custom_actions.plural',
parent: :admin_work_packages,
- enterprise_feature: "custom_actions"
+ enterprise_feature: 'custom_actions'
menu.push :attribute_help_texts,
- { controller: "/attribute_help_texts" },
- caption: :"attribute_help_texts.label_plural",
- icon: "help2",
+ { controller: '/attribute_help_texts' },
+ caption: :'attribute_help_texts.label_plural',
+ icon: 'help2',
if: Proc.new { User.current.allowed_globally?(:edit_attribute_help_texts) }
menu.push :attachments,
- { controller: "/admin/settings/attachments_settings", action: :show },
- caption: :"attributes.attachments",
- icon: "attachment",
+ { controller: '/admin/settings/attachments_settings', action: :show },
+ caption: :'attributes.attachments',
+ icon: 'attachment',
if: Proc.new { User.current.admin? }
menu.push :attachments_settings,
- { controller: "/admin/settings/attachments_settings", action: :show },
+ { controller: '/admin/settings/attachments_settings', action: :show },
if: Proc.new { User.current.admin? },
caption: :label_setting_plural,
parent: :attachments
menu.push :virus_scanning_settings,
- { controller: "/admin/settings/virus_scanning_settings", action: :show },
- caption: :"settings.antivirus.title",
+ { controller: '/admin/settings/virus_scanning_settings', action: :show },
+ caption: :'settings.antivirus.title',
parent: :attachments,
- enterprise_feature: "virus_scanning",
+ enterprise_feature: 'virus_scanning',
if: Proc.new { User.current.admin? }
menu.push :attachment_quarantine,
- { controller: "/admin/attachments/quarantined_attachments", action: :index },
- caption: :"antivirus_scan.quarantined_attachments.title",
+ { controller: '/admin/attachments/quarantined_attachments', action: :index },
+ caption: :'antivirus_scan.quarantined_attachments.title',
parent: :attachments,
if: Proc.new {
User.current.admin? &&
@@ -379,176 +379,176 @@
}
menu.push :enumerations,
- { controller: "/enumerations" },
+ { controller: '/enumerations' },
if: Proc.new { User.current.admin? },
- icon: "enumerations"
+ icon: 'enumerations'
menu.push :calendars_and_dates,
- { controller: "/admin/settings/working_days_settings", action: :show },
+ { controller: '/admin/settings/working_days_settings', action: :show },
if: Proc.new { User.current.admin? },
caption: :label_calendars_and_dates,
- icon: "calendar"
+ icon: 'calendar'
menu.push :working_days,
- { controller: "/admin/settings/working_days_settings", action: :show },
+ { controller: '/admin/settings/working_days_settings', action: :show },
if: Proc.new { User.current.admin? },
caption: :label_working_days,
parent: :calendars_and_dates
menu.push :date_format,
- { controller: "/admin/settings/date_format_settings", action: :show },
+ { controller: '/admin/settings/date_format_settings', action: :show },
if: Proc.new { User.current.admin? },
caption: :label_date_format,
parent: :calendars_and_dates
menu.push :icalendar,
- { controller: "/admin/settings/icalendar_settings", action: :show },
+ { controller: '/admin/settings/icalendar_settings', action: :show },
if: Proc.new { User.current.admin? },
caption: :label_calendar_subscriptions,
parent: :calendars_and_dates
menu.push :settings,
- { controller: "/admin/settings/general_settings", action: :show },
+ { controller: '/admin/settings/general_settings', action: :show },
if: Proc.new { User.current.admin? },
caption: :label_system_settings,
- icon: "settings2"
+ icon: 'settings2'
SettingsHelper.system_settings_tabs.each do |node|
menu.push :"settings_#{node[:name]}",
{ controller: node[:controller], action: :show },
caption: node[:label],
- if: Proc.new { User.current.admin? && node[:name] != "experimental" },
+ if: Proc.new { User.current.admin? && node[:name] != 'experimental' },
parent: :settings
end
menu.push :mail_and_notifications,
- { controller: "/admin/settings/aggregation_settings", action: :show },
+ { controller: '/admin/settings/aggregation_settings', action: :show },
if: Proc.new { User.current.admin? },
- caption: :"menus.admin.mails_and_notifications",
- icon: "mail1"
+ caption: :'menus.admin.mails_and_notifications',
+ icon: 'mail1'
menu.push :notification_settings,
- { controller: "/admin/settings/aggregation_settings", action: :show },
+ { controller: '/admin/settings/aggregation_settings', action: :show },
if: Proc.new { User.current.admin? },
- caption: :"menus.admin.aggregation",
+ caption: :'menus.admin.aggregation',
parent: :mail_and_notifications
menu.push :mail_notifications,
- { controller: "/admin/settings/mail_notifications_settings", action: :show },
+ { controller: '/admin/settings/mail_notifications_settings', action: :show },
if: Proc.new { User.current.admin? },
- caption: :"menus.admin.mail_notification",
+ caption: :'menus.admin.mail_notification',
parent: :mail_and_notifications
menu.push :incoming_mails,
- { controller: "/admin/settings/incoming_mails_settings", action: :show },
+ { controller: '/admin/settings/incoming_mails_settings', action: :show },
if: Proc.new { User.current.admin? },
caption: :label_incoming_emails,
parent: :mail_and_notifications
menu.push :api_and_webhooks,
- { controller: "/admin/settings/api_settings", action: :show },
+ { controller: '/admin/settings/api_settings', action: :show },
if: Proc.new { User.current.admin? },
- caption: :"menus.admin.api_and_webhooks",
- icon: "relations"
+ caption: :'menus.admin.api_and_webhooks',
+ icon: 'relations'
menu.push :api,
- { controller: "/admin/settings/api_settings", action: :show },
+ { controller: '/admin/settings/api_settings', action: :show },
if: Proc.new { User.current.admin? },
caption: :label_api_access_key_type,
parent: :api_and_webhooks
menu.push :authentication,
- { controller: "/admin/settings/authentication_settings", action: :show },
+ { controller: '/admin/settings/authentication_settings', action: :show },
if: Proc.new { User.current.admin? },
caption: :label_authentication,
- icon: "two-factor-authentication"
+ icon: 'two-factor-authentication'
menu.push :authentication_settings,
- { controller: "/admin/settings/authentication_settings", action: :show },
+ { controller: '/admin/settings/authentication_settings', action: :show },
if: Proc.new { User.current.admin? },
caption: :label_setting_plural,
parent: :authentication
menu.push :ldap_authentication,
- { controller: "/ldap_auth_sources", action: "index" },
+ { controller: '/ldap_auth_sources', action: 'index' },
if: Proc.new { User.current.admin? && !OpenProject::Configuration.disable_password_login? },
parent: :authentication,
caption: :label_ldap_auth_source_plural,
- html: { class: "server_authentication" },
+ html: { class: 'server_authentication' },
last: true
menu.push :oauth_applications,
- { controller: "/oauth/applications", action: "index" },
+ { controller: '/oauth/applications', action: 'index' },
if: Proc.new { User.current.admin? },
parent: :authentication,
- caption: :"oauth.application.plural",
- html: { class: "oauth_applications" }
+ caption: :'oauth.application.plural',
+ html: { class: 'oauth_applications' }
menu.push :announcements,
- { controller: "/announcements", action: "edit" },
+ { controller: '/announcements', action: 'edit' },
if: Proc.new { User.current.admin? },
caption: :label_announcement,
- icon: "news"
+ icon: 'news'
menu.push :plugins,
- { controller: "/admin", action: "plugins" },
+ { controller: '/admin', action: 'plugins' },
if: Proc.new { User.current.admin? },
last: true,
- icon: "plugins"
+ icon: 'plugins'
menu.push :backups,
- { controller: "/admin/backups", action: "show" },
+ { controller: '/admin/backups', action: 'show' },
if: Proc.new { OpenProject::Configuration.backup_enabled? && User.current.allowed_globally?(Backup.permission) },
caption: :label_backup,
last: true,
- icon: "save"
+ icon: 'save'
menu.push :info,
- { controller: "/admin", action: "info" },
+ { controller: '/admin', action: 'info' },
if: Proc.new { User.current.admin? },
caption: :label_information_plural,
last: true,
- icon: "info1"
+ icon: 'info1'
menu.push :custom_style,
- { controller: "/custom_styles", action: :show },
+ { controller: '/custom_styles', action: :show },
if: Proc.new { User.current.admin? },
caption: :label_custom_style,
- icon: "design",
- enterprise_feature: "define_custom_style"
+ icon: 'design',
+ enterprise_feature: 'define_custom_style'
menu.push :colors,
- { controller: "/colors", action: "index" },
+ { controller: '/colors', action: 'index' },
if: Proc.new { User.current.admin? },
caption: :label_color_plural,
- icon: "status"
+ icon: 'status'
menu.push :enterprise,
- { controller: "/enterprises", action: :show },
+ { controller: '/enterprises', action: :show },
caption: :label_enterprise_edition,
- icon: "enterprise-addons",
+ icon: 'enterprise-addons',
if: proc { User.current.admin? && OpenProject::Configuration.ee_manager_visible? }
menu.push :admin_costs,
- { controller: "/admin/settings", action: "show_plugin", id: :costs },
+ { controller: '/admin/settings', action: 'show_plugin', id: :costs },
if: Proc.new { User.current.admin? },
caption: :project_module_costs,
- icon: "budget"
+ icon: 'budget'
menu.push :costs_setting,
- { controller: "/admin/settings", action: "show_plugin", id: :costs },
+ { controller: '/admin/settings', action: 'show_plugin', id: :costs },
if: Proc.new { User.current.admin? },
caption: :label_setting_plural,
parent: :admin_costs
menu.push :admin_backlogs,
- { controller: "/backlogs_settings", action: :show },
+ { controller: '/backlogs_settings', action: :show },
if: Proc.new { User.current.admin? },
caption: :label_backlogs,
- icon: "backlogs"
+ icon: 'backlogs'
menu.push :backlogs_settings,
- { controller: "/backlogs_settings", action: :show },
+ { controller: '/backlogs_settings', action: :show },
if: Proc.new { User.current.admin? },
caption: :label_setting_plural,
parent: :admin_backlogs
@@ -556,72 +556,72 @@
Redmine::MenuManager.map :project_menu do |menu|
menu.push :activity,
- { controller: "/activities", action: "index" },
- if: Proc.new { |p| p.module_enabled?("activity") },
- icon: "checkmark"
+ { controller: '/activities', action: 'index' },
+ if: Proc.new { |p| p.module_enabled?('activity') },
+ icon: 'checkmark'
menu.push :activity_filters,
- { controller: "/activities", action: "index" },
- if: Proc.new { |p| p.module_enabled?("activity") },
+ { controller: '/activities', action: 'index' },
+ if: Proc.new { |p| p.module_enabled?('activity') },
parent: :activity,
- partial: "activities/filters_menu"
+ partial: 'activities/filters_menu'
menu.push :roadmap,
- { controller: "/versions", action: "index" },
+ { controller: '/versions', action: 'index' },
if: Proc.new { |p| p.shared_versions.any? },
- icon: "roadmap"
+ icon: 'roadmap'
menu.push :work_packages,
- { controller: "/work_packages", action: "index" },
+ { controller: '/work_packages', action: 'index' },
caption: :label_work_package_plural,
- if: Proc.new { |p| p.module_enabled?("work_package_tracking") },
- icon: "view-list",
+ if: Proc.new { |p| p.module_enabled?('work_package_tracking') },
+ icon: 'view-list',
html: {
- id: "main-menu-work-packages",
- "wp-query-menu": "wp-query-menu"
+ id: 'main-menu-work-packages',
+ 'wp-query-menu': 'wp-query-menu'
}
menu.push :work_packages_query_select,
- { controller: "/work_packages", action: "index" },
+ { controller: '/work_packages', action: 'index' },
parent: :work_packages,
- partial: "work_packages/menu_query_select",
+ partial: 'work_packages/menu_query_select',
last: true,
caption: :label_all_open_wps
menu.push :news,
- { controller: "/news", action: "index" },
+ { controller: '/news', action: 'index' },
caption: :label_news_plural,
- icon: "news"
+ icon: 'news'
menu.push :forums,
- { controller: "/forums", action: "index", id: nil },
+ { controller: '/forums', action: 'index', id: nil },
caption: :label_forum_plural,
- icon: "ticket-note"
+ icon: 'ticket-note'
menu.push :repository,
- { controller: "/repositories", action: :show },
+ { controller: '/repositories', action: :show },
if: Proc.new { |p| p.repository && !p.repository.new_record? },
- icon: "folder-open"
+ icon: 'folder-open'
# Wiki menu items are added by WikiMenuItemHelper
menu.push :members,
- { controller: "/members", action: "index" },
+ { controller: '/members', action: 'index' },
caption: :label_member_plural,
before: :settings,
- icon: "group"
+ icon: 'group'
menu.push :members_menu,
- { controller: "/members", action: "index" },
+ { controller: '/members', action: 'index' },
parent: :members,
- partial: "members/menus/menu",
+ partial: 'members/menus/menu',
caption: :label_member_plural
menu.push :settings,
- { controller: "/projects/settings/general", action: :show },
+ { controller: '/projects/settings/general', action: :show },
caption: :label_project_settings,
last: true,
- icon: "settings2",
+ icon: 'settings2',
allow_deeplink: true
{
@@ -636,7 +636,7 @@
storage: :label_required_disk_storage
}.each do |key, caption|
menu.push :"settings_#{key}",
- { controller: "/projects/settings/#{key}", action: "show" },
+ { controller: "/projects/settings/#{key}", action: 'show' },
caption:,
parent: :settings
end
diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb
index 2fbfb6fb1c00..f058462b60eb 100644
--- a/config/initializers/mime_types.rb
+++ b/config/initializers/mime_types.rb
@@ -34,5 +34,5 @@
Mime::SET << Mime[:csv] unless Mime::SET.include?(Mime[:csv])
-Mime::Type.register "application/pdf", :pdf unless Mime::Type.lookup_by_extension(:pdf)
-Mime::Type.register "image/png", :png unless Mime::Type.lookup_by_extension(:png)
+Mime::Type.register 'application/pdf', :pdf unless Mime::Type.lookup_by_extension(:pdf)
+Mime::Type.register 'image/png', :png unless Mime::Type.lookup_by_extension(:png)
diff --git a/config/initializers/module_handler.rb b/config/initializers/module_handler.rb
index 486c0386398f..a1c888934aa7 100644
--- a/config/initializers/module_handler.rb
+++ b/config/initializers/module_handler.rb
@@ -31,7 +31,7 @@
to_disable = if Rails.env.test?
OpenProject::Configuration.disabled_modules
else
- ["dashboards"] + OpenProject::Configuration.disabled_modules
+ ['dashboards'] + OpenProject::Configuration.disabled_modules
end
if to_disable.any?
diff --git a/config/initializers/paper_trail.rb b/config/initializers/paper_trail.rb
index a60163d4354a..597210bcc1ad 100644
--- a/config/initializers/paper_trail.rb
+++ b/config/initializers/paper_trail.rb
@@ -1,7 +1,7 @@
PaperTrail.config.enabled = true # PT will be disabled by rspec
PaperTrail.config.has_paper_trail_defaults = {
versions: {
- class_name: "::PaperTrailAudit",
+ class_name: '::PaperTrailAudit',
name: :paper_trail_audits
},
version: :paper_trail_audit,
diff --git a/config/initializers/permissions.rb b/config/initializers/permissions.rb
index 4098e318acf5..d76e3c19f52e 100644
--- a/config/initializers/permissions.rb
+++ b/config/initializers/permissions.rb
@@ -37,7 +37,7 @@
map.permission :archive_project,
{
- "projects/archive": %i[create]
+ 'projects/archive': %i[create]
},
permissible_on: :project,
require: :member
@@ -45,7 +45,7 @@
map.permission :create_backup,
{
admin: %i[index],
- "admin/backups": %i[delete_token perform_token_reset reset_token show]
+ 'admin/backups': %i[delete_token perform_token_reset reset_token show]
},
permissible_on: :global,
require: :loggedin,
@@ -54,7 +54,7 @@
map.permission :create_user,
{
users: %i[index show new create resend_invitation],
- "users/memberships": %i[create],
+ 'users/memberships': %i[create],
admin: %i[index]
},
permissible_on: :global,
@@ -64,7 +64,7 @@
map.permission :manage_user,
{
users: %i[index show edit update change_status change_status_info],
- "users/memberships": %i[create update destroy],
+ 'users/memberships': %i[create update destroy],
admin: %i[index]
},
permissible_on: :global,
@@ -74,7 +74,7 @@
map.permission :manage_placeholder_user,
{
placeholder_users: %i[index show new create edit update deletion_info destroy],
- "placeholder_users/memberships": %i[create update destroy],
+ 'placeholder_users/memberships': %i[create update destroy],
admin: %i[index]
},
permissible_on: :global,
@@ -93,10 +93,10 @@
map.permission :edit_project,
{
- "projects/settings/general": %i[show],
- "projects/settings/storage": %i[show],
- "projects/templated": %i[create destroy],
- "projects/identifier": %i[show update]
+ 'projects/settings/general': %i[show],
+ 'projects/settings/storage': %i[show],
+ 'projects/templated': %i[create destroy],
+ 'projects/identifier': %i[show update]
},
permissible_on: :project,
require: :member,
@@ -104,7 +104,7 @@
map.permission :select_project_modules,
{
- "projects/settings/modules": %i[show update]
+ 'projects/settings/modules': %i[show update]
},
permissible_on: :project,
require: :member
@@ -112,7 +112,7 @@
map.permission :manage_members,
{
members: %i[index new create update destroy autocomplete_for_member menu],
- "members/menus": %i[show]
+ 'members/menus': %i[show]
},
permissible_on: :project,
require: :member,
@@ -122,14 +122,14 @@
map.permission :view_members,
{
members: %i[index menu],
- "members/menus": %i[show]
+ 'members/menus': %i[show]
},
permissible_on: :project,
contract_actions: { members: %i[read] }
map.permission :manage_versions,
{
- "projects/settings/versions": [:show],
+ 'projects/settings/versions': [:show],
versions: %i[new create edit update close_completed destroy]
},
permissible_on: :project,
@@ -137,14 +137,14 @@
map.permission :manage_types,
{
- "projects/settings/types": %i[show update]
+ 'projects/settings/types': %i[show update]
},
permissible_on: :project,
require: :member
map.permission :select_custom_fields,
{
- "projects/settings/custom_fields": %i[show update]
+ 'projects/settings/custom_fields': %i[show update]
},
permissible_on: :project,
require: :member
@@ -179,7 +179,7 @@
journals: %i[index],
work_packages: %i[show index],
work_packages_api: [:get],
- "work_packages/reports": %i[report report_details]
+ 'work_packages/reports': %i[report report_details]
},
permissible_on: %i[work_package project],
contract_actions: { work_packages: %i[read] }
@@ -192,7 +192,7 @@
wpt.permission :edit_work_packages,
{
- "work_packages/bulk": %i[edit update]
+ 'work_packages/bulk': %i[edit update]
},
permissible_on: %i[work_package project],
require: :member,
@@ -200,7 +200,7 @@
contract_actions: { work_packages: %i[update] }
wpt.permission :move_work_packages,
- { "work_packages/moves": %i[new create] },
+ { 'work_packages/moves': %i[new create] },
permissible_on: :project,
require: :loggedin,
dependencies: :view_work_packages,
@@ -242,7 +242,7 @@
# WorkPackage categories
wpt.permission :manage_categories,
{
- "projects/settings/categories": [:show],
+ 'projects/settings/categories': [:show],
categories: %i[new create edit update destroy]
},
permissible_on: :project,
@@ -258,7 +258,7 @@
wpt.permission :delete_work_packages,
{
work_packages: :destroy,
- "work_packages/bulk": :destroy
+ 'work_packages/bulk': :destroy
},
permissible_on: :project,
require: :member,
@@ -304,8 +304,8 @@
map.permission :share_work_packages,
{
- "work_packages/shares": %i[index create destroy update resend_invite],
- "work_packages/shares/bulk": %i[update destroy]
+ 'work_packages/shares': %i[index create destroy update resend_invite],
+ 'work_packages/shares/bulk': %i[update destroy]
},
permissible_on: :project,
dependencies: %i[edit_work_packages view_shared_work_packages],
@@ -313,7 +313,7 @@
map.permission :view_shared_work_packages,
{
- "work_packages/shares": %i[index]
+ 'work_packages/shares': %i[index]
},
permissible_on: :project,
require: :member,
@@ -350,13 +350,13 @@
news.permission :manage_news,
{
news: %i[new create edit update destroy preview],
- "news/comments": [:destroy]
+ 'news/comments': [:destroy]
},
permissible_on: :project,
require: :member
news.permission :comment_news,
- { "news/comments": :create },
+ { 'news/comments': :create },
permissible_on: :project
end
@@ -429,7 +429,7 @@
repo.permission :manage_repository,
{
repositories: %i[edit create update committers destroy_info destroy],
- "projects/settings/repository": :show
+ 'projects/settings/repository': :show
},
permissible_on: :project,
require: :member
diff --git a/config/initializers/rack-attack.rb b/config/initializers/rack-attack.rb
index 11e04a3c1d32..eefcbb61230e 100644
--- a/config/initializers/rack-attack.rb
+++ b/config/initializers/rack-attack.rb
@@ -33,14 +33,14 @@
if OpenProject::Configuration.blacklisted_routes.any?
# Block logins from a bad user agent
- Rack::Attack.blocklist("block forbidden routes") do |req|
+ Rack::Attack.blocklist('block forbidden routes') do |req|
regex = OpenProject::Configuration.blacklisted_routes.map! { |str| Regexp.new(str) }
regex.any? { |i| i =~ req.path }
end
Rack::Attack.blocklisted_responder = lambda do |_env|
# All blacklisted routes would return a 404.
- [404, {}, ["Not found"]]
+ [404, {}, ['Not found']]
end
end
end
diff --git a/config/initializers/rack-cors.rb b/config/initializers/rack-cors.rb
index 500b3cd3f3da..e657fcaa5a80 100644
--- a/config/initializers/rack-cors.rb
+++ b/config/initializers/rack-cors.rb
@@ -28,13 +28,13 @@
Rails.application.config.middleware.insert_after Rails::Rack::Logger, Rack::Cors do
allow do
origins { |source, _env| API::V3::CORS.allowed?(source) }
- resource "/api/v3*",
+ resource '/api/v3*',
headers: :any,
methods: :any,
credentials: true,
if: proc { API::V3::CORS.enabled? }
- resource "/oauth/*",
+ resource '/oauth/*',
headers: :any,
methods: :any,
credentials: true,
diff --git a/config/initializers/rack_profiler.rb b/config/initializers/rack_profiler.rb
index 47c9422f0fc1..3365b4d3e168 100644
--- a/config/initializers/rack_profiler.rb
+++ b/config/initializers/rack_profiler.rb
@@ -1,12 +1,12 @@
# frozen_string_literal: true
-if Rails.env.development? && ENV["OPENPROJECT_RACK_PROFILER_ENABLED"]
+if Rails.env.development? && ENV['OPENPROJECT_RACK_PROFILER_ENABLED']
require "rack-mini-profiler"
- require "flamegraph"
- require "stackprof"
+ require 'flamegraph'
+ require 'stackprof'
# initialization is skipped so trigger it
Rack::MiniProfilerRails.initialize!(Rails.application)
- Rack::MiniProfiler.config.position = "bottom-right"
+ Rack::MiniProfiler.config.position = 'bottom-right'
end
diff --git a/config/initializers/rack_timeout.rb b/config/initializers/rack_timeout.rb
index 3e48bb80db14..b6bd86e773ae 100644
--- a/config/initializers/rack_timeout.rb
+++ b/config/initializers/rack_timeout.rb
@@ -31,7 +31,7 @@
# report the generic internal server error too as it doesn't
# add any more information. Even worse, it's not immediately
# clear that the two reports are related.
- require "rack/timeout/suppress_internal_error_report_on_timeout"
+ require 'rack/timeout/suppress_internal_error_report_on_timeout'
OpenProjectErrorHelper.prepend Rack::Timeout::SuppressInternalErrorReportOnTimeout
end
diff --git a/config/initializers/register_renderer.rb b/config/initializers/register_renderer.rb
index c954392caf39..2d8267becf3e 100644
--- a/config/initializers/register_renderer.rb
+++ b/config/initializers/register_renderer.rb
@@ -27,7 +27,7 @@
#++
ActionController::Renderers.add :csv do |obj, options|
- filename = options[:filename] || "data"
+ filename = options[:filename] || 'data'
str = obj.respond_to?(:to_csv) ? obj.to_csv : obj.to_s
charset = "charset=#{I18n.t(:general_csv_encoding).downcase}"
@@ -38,7 +38,7 @@
# For some reasons, the content-type header
# does only contain the charset if the response
# is manipulated like this.
- response.content_type += ""
+ response.content_type += ''
data
end
diff --git a/config/initializers/register_views.rb b/config/initializers/register_views.rb
index 9467182249d4..a01cb748eaef 100644
--- a/config/initializers/register_views.rb
+++ b/config/initializers/register_views.rb
@@ -26,6 +26,6 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require Rails.root.join("config/constants/views")
+require Rails.root.join('config/constants/views')
Constants::Views.add :WorkPackagesTable
diff --git a/config/initializers/secure_headers.rb b/config/initializers/secure_headers.rb
index 4977a527bfbc..7cf131d43eeb 100644
--- a/config/initializers/secure_headers.rb
+++ b/config/initializers/secure_headers.rb
@@ -34,13 +34,13 @@
media_src = default_src
if OpenProject::Configuration.appsignal_frontend_key
- connect_src += ["https://appsignal-endpoint.net"]
+ connect_src += ['https://appsignal-endpoint.net']
end
# Add proxy configuration for Angular CLI to csp
if FrontendAssetHelper.assets_proxied?
proxied = ["ws://#{Setting.host_name}", "http://#{Setting.host_name}",
- FrontendAssetHelper.cli_proxy.sub("http", "ws"), FrontendAssetHelper.cli_proxy]
+ FrontendAssetHelper.cli_proxy.sub('http', 'ws'), FrontendAssetHelper.cli_proxy]
connect_src += proxied
assets_src += proxied
media_src += proxied
@@ -50,15 +50,15 @@
script_src = assets_src
# Allow unsafe-eval for rack-mini-profiler
- if Rails.env.development? && ENV.fetch("OPENPROJECT_RACK_PROFILER_ENABLED", false)
+ if Rails.env.development? && ENV.fetch('OPENPROJECT_RACK_PROFILER_ENABLED', false)
script_src += %w('unsafe-eval')
end
# Allow ANDI bookmarklet to run in development mode
# https://www.ssa.gov/accessibility/andi/help/install.html
if Rails.env.development?
- script_src += ["https://www.ssa.gov"]
- assets_src += ["https://www.ssa.gov"]
+ script_src += ['https://www.ssa.gov']
+ assets_src += ['https://www.ssa.gov']
end
config.csp = {
diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb
index e59b9eba3cfe..594349b46b9f 100644
--- a/config/initializers/session_store.rb
+++ b/config/initializers/session_store.rb
@@ -29,10 +29,10 @@
# Be sure to restart your server when you modify this file.
config = OpenProject::Configuration
-relative_url_root = config["rails_relative_url_root"].presence
+relative_url_root = config['rails_relative_url_root'].presence
session_options = {
- key: config["session_cookie_name"],
+ key: config['session_cookie_name'],
httponly: true,
secure: config.https?,
path: relative_url_root
diff --git a/db/migrate/20240229133250_rename_delayed_job_statuses.rb b/config/initializers/time_with_zone_as_json.rb
similarity index 90%
rename from db/migrate/20240229133250_rename_delayed_job_statuses.rb
rename to config/initializers/time_with_zone_as_json.rb
index 43ffd4dd4577..117f21ffaa4d 100644
--- a/db/migrate/20240229133250_rename_delayed_job_statuses.rb
+++ b/config/initializers/time_with_zone_as_json.rb
@@ -26,8 +26,8 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-class RenameDelayedJobStatuses < ActiveRecord::Migration[7.1]
- def change
- rename_table :delayed_job_statuses, :job_statuses
+class ActiveSupport::TimeWithZone
+ def as_json(_options = {})
+ time.strftime('%m/%d/%Y/ %H:%M %p').to_s
end
end
diff --git a/config/initializers/warden.rb b/config/initializers/warden.rb
index c94f72f62d5c..53762fad9c26 100644
--- a/config/initializers/warden.rb
+++ b/config/initializers/warden.rb
@@ -2,12 +2,12 @@
namespace = OpenProject::Authentication::Strategies::Warden
strategies = [
- [:basic_auth_failure, namespace::BasicAuthFailure, "Basic"],
- [:global_basic_auth, namespace::GlobalBasicAuth, "Basic"],
- [:user_basic_auth, namespace::UserBasicAuth, "Basic"],
- [:oauth, namespace::DoorkeeperOAuth, "OAuth"],
- [:anonymous_fallback, namespace::AnonymousFallback, "Basic"],
- [:session, namespace::Session, "Session"]
+ [:basic_auth_failure, namespace::BasicAuthFailure, 'Basic'],
+ [:global_basic_auth, namespace::GlobalBasicAuth, 'Basic'],
+ [:user_basic_auth, namespace::UserBasicAuth, 'Basic'],
+ [:oauth, namespace::DoorkeeperOAuth, 'OAuth'],
+ [:anonymous_fallback, namespace::AnonymousFallback, 'Basic'],
+ [:session, namespace::Session, 'Session']
]
strategies.each do |name, clazz, auth_scheme|
diff --git a/config/initializers/zeitwerk.rb b/config/initializers/zeitwerk.rb
index f346f581530a..2caf8b11a1ee 100644
--- a/config/initializers/zeitwerk.rb
+++ b/config/initializers/zeitwerk.rb
@@ -1,4 +1,4 @@
-require Rails.root.join("config/constants/open_project/inflector")
+require Rails.root.join('config/constants/open_project/inflector')
OpenProject::Inflector.rule do |_, abspath|
if abspath.match?(/open_project\/version(\.rb)?\z/) ||
@@ -18,24 +18,24 @@
"API#{default_inflect($1, abspath)}"
when /\A(.*)_api\z/
"#{default_inflect($1, abspath)}API"
- when "api"
- "API"
+ when 'api'
+ 'API'
when /(.*)_ical_(.*)/i
"#{default_inflect($1, abspath)}ICal#{default_inflect($2, abspath)}"
when /\Aical_(.*)\z/
"ICal#{default_inflect($1, abspath)}"
when /\A(.*)_ical\z/
"#{default_inflect($1, abspath)}ICal"
- when "ical"
- "ICal"
+ when 'ical'
+ 'ICal'
when /\Aar_(.*)\z/
"AR#{default_inflect($1, abspath)}"
when /\Aoauth_(.*)\z/
"OAuth#{default_inflect($1, abspath)}"
when /\A(.*)_oauth\z/
"#{default_inflect($1, abspath)}OAuth"
- when "oauth"
- "OAuth"
+ when 'oauth'
+ 'OAuth'
when /\Aclamav_(.*)\z/
"ClamAV#{default_inflect($1, abspath)}"
when /\A(.*)_sso\z/
@@ -48,32 +48,32 @@
# we simply return the general OpenProject namespace for such files.
OpenProject::Inflector.rule do |_basename, abspath|
if /\/lib\/openproject-\w+.rb\z/.match?(abspath)
- "OpenProject"
+ 'OpenProject'
end
end
OpenProject::Inflector.inflection(
- "rss" => "RSS",
- "sha1" => "SHA1",
- "sso" => "SSO",
- "csv" => "CSV",
- "pdf" => "PDF",
- "scm" => "SCM",
- "imap" => "IMAP",
- "pop3" => "POP3",
- "cors" => "CORS",
- "openid_connect" => "OpenIDConnect",
- "pdf_export" => "PDFExport",
- "ical" => "ICal",
- "clamav" => "ClamAV"
+ 'rss' => 'RSS',
+ 'sha1' => 'SHA1',
+ 'sso' => 'SSO',
+ 'csv' => 'CSV',
+ 'pdf' => 'PDF',
+ 'scm' => 'SCM',
+ 'imap' => 'IMAP',
+ 'pop3' => 'POP3',
+ 'cors' => 'CORS',
+ 'openid_connect' => 'OpenIDConnect',
+ 'pdf_export' => 'PDFExport',
+ 'ical' => 'ICal',
+ 'clamav' => 'ClamAV'
)
Rails.autoloaders.each do |autoloader|
autoloader.inflector = OpenProject::Inflector.new(__FILE__)
end
-Rails.autoloaders.main.ignore(Rails.root.join("lib/open_project/patches"))
-Rails.autoloaders.main.ignore(Rails.root.join("lib/generators"))
+Rails.autoloaders.main.ignore(Rails.root.join('lib/open_project/patches'))
+Rails.autoloaders.main.ignore(Rails.root.join('lib/generators'))
# Comment in to enable zeitwerk logging.
# Rails.autoloaders.main.log!
diff --git a/config/locales/crowdin/af.yml b/config/locales/crowdin/af.yml
index 5cd129e46d86..c5d3b3c40f8f 100644
--- a/config/locales/crowdin/af.yml
+++ b/config/locales/crowdin/af.yml
@@ -26,14 +26,15 @@ af:
no_results_title_text: There has not been any activity for the project within this time frame.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: There are currently no plugins available.
custom_styles:
color_theme: "Color theme"
color_theme_custom: "(Custom)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternative"
+ content-link-color: "Link font"
+ primary-color: "Primary"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ af:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Edit color select options"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Font color of most of the links."
+ primary-color: "Main color."
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1529,7 +1532,6 @@ af:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "User guides"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glossary"
shortcuts: "Shortcuts"
blog: "OpenProject blog"
@@ -1861,6 +1863,7 @@ af:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "in"
label_in_less_than: "in minder as"
label_in_more_than: "in meer as"
diff --git a/config/locales/crowdin/ar.yml b/config/locales/crowdin/ar.yml
index afc1aae5e11d..f5a15d7f55cf 100644
--- a/config/locales/crowdin/ar.yml
+++ b/config/locales/crowdin/ar.yml
@@ -26,14 +26,15 @@ ar:
no_results_title_text: ولم يكن هناك أي نشاط للمشروع ضمن هذا الإطار الزمني.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: لا يوجد حالياً أية إضافات متاحة.
custom_styles:
color_theme: "لون السمة"
color_theme_custom: "(تخصيص)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "البديل"
+ content-link-color: "خط الارتبط"
+ primary-color: "الأساسي"
+ primary-color-dark: "الأساسي (داكن)"
header-bg-color: "خلفية الترويسة"
header-item-bg-hover-color: "خلفية الترويسة على الحافة"
header-item-font-color: "خط الترويسة"
@@ -52,8 +53,10 @@ ar:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "تعديل خيارات تحديد اللون"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "لون اللكنة القوية، يستخدم عادة لأهم زر على الشاشة."
+ content-link-color: "لون الخط لمعظم الروابط."
+ primary-color: "اللون الرئيسي."
+ primary-color-dark: "عادةً ما تكون نسخة داكنة من اللون الرئيسي المستخدم لتأثيرات الحرارة."
header-item-bg-hover-color: "لون الخلفية لعناصر الترويسة القابلة للنقر عند ربطها بالفأرة."
header-item-font-color: "لون الخط لعناصر الترويسة النقر عليها."
header-item-font-hover-color: "لون الخط لعناصر الترويسة القابلة للنقر عند ربطها بالفأرة."
@@ -1637,7 +1640,6 @@ ar:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "دليل المستخدم"
faq: "الاسئلة الاكثر شيوعا(FAQ)"
- impressum: "Legal notice"
glossary: "معجم المصطلحات"
shortcuts: "اختصارات"
blog: "مدونة أوبِن بروجِكت"
@@ -1969,6 +1971,7 @@ ar:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "في"
label_in_less_than: "في أقل من"
label_in_more_than: "في أكثر من"
diff --git a/config/locales/crowdin/az.yml b/config/locales/crowdin/az.yml
index a17a1464d198..609fb36dc3cb 100644
--- a/config/locales/crowdin/az.yml
+++ b/config/locales/crowdin/az.yml
@@ -26,14 +26,15 @@ az:
no_results_title_text: There has not been any activity for the project within this time frame.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: There are currently no plugins available.
custom_styles:
color_theme: "Color theme"
color_theme_custom: "(Custom)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternative"
+ content-link-color: "Link font"
+ primary-color: "Primary"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ az:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Edit color select options"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Font color of most of the links."
+ primary-color: "Main color."
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1529,7 +1532,6 @@ az:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "User guides"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glossary"
shortcuts: "Shortcuts"
blog: "OpenProject blog"
@@ -1861,6 +1863,7 @@ az:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "in"
label_in_less_than: "in less than"
label_in_more_than: "in more than"
diff --git a/config/locales/crowdin/be.yml b/config/locales/crowdin/be.yml
index 65ba3c251d33..d26d0f1ff248 100644
--- a/config/locales/crowdin/be.yml
+++ b/config/locales/crowdin/be.yml
@@ -26,14 +26,15 @@ be:
no_results_title_text: There has not been any activity for the project within this time frame.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: There are currently no plugins available.
custom_styles:
color_theme: "Color theme"
color_theme_custom: "(Custom)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternative"
+ content-link-color: "Link font"
+ primary-color: "Primary"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ be:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Edit color select options"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Font color of most of the links."
+ primary-color: "Main color."
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1583,7 +1586,6 @@ be:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "User guides"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glossary"
shortcuts: "Shortcuts"
blog: "OpenProject blog"
@@ -1915,6 +1917,7 @@ be:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "in"
label_in_less_than: "in less than"
label_in_more_than: "in more than"
diff --git a/config/locales/crowdin/bg.yml b/config/locales/crowdin/bg.yml
index 941a9aa80a92..f7129ecf6956 100644
--- a/config/locales/crowdin/bg.yml
+++ b/config/locales/crowdin/bg.yml
@@ -26,14 +26,15 @@ bg:
no_results_title_text: There has not been any activity for the project within this time frame.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: В момента има няма плъгини на разположение.
custom_styles:
color_theme: "Цвят на темата"
color_theme_custom: "Потребителски"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Алтернативно"
+ content-link-color: "Шрифт на връзката"
+ primary-color: "Основен"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ bg:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Edit color select options"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Font color of most of the links."
+ primary-color: "Основен цвят."
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1529,7 +1532,6 @@ bg:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "Ръководства за потребителя"
faq: "Често задавани въпроси"
- impressum: "Legal notice"
glossary: "Терминологичен речник"
shortcuts: "Кратки клавишни комбинации"
blog: "OpenProject блог"
@@ -1861,6 +1863,7 @@ bg:
label_subject_or_id: "Тема или №"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "в"
label_in_less_than: "в по-малко от"
label_in_more_than: "в повече от"
diff --git a/config/locales/crowdin/ca.yml b/config/locales/crowdin/ca.yml
index e73abe81b794..6352130ee3e2 100644
--- a/config/locales/crowdin/ca.yml
+++ b/config/locales/crowdin/ca.yml
@@ -26,14 +26,15 @@ ca:
no_results_title_text: No hi hagut activitat al projecte en aquesta finestra de temps.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Actualment no hi ha plugins disponibles.
custom_styles:
color_theme: "Tema de color"
color_theme_custom: "(Personalitzat)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternatiu"
+ content-link-color: "Enllaça font"
+ primary-color: "Primari"
+ primary-color-dark: "Primari (fosc)"
header-bg-color: "Fons de capçalera"
header-item-bg-hover-color: "Fons de capçalera en passar el ratolí"
header-item-font-color: "Font de capçalera"
@@ -52,8 +53,10 @@ ca:
enterprise_more_info: "Nota: el logotip utilitzat serà accessible públicament."
manage_colors: "Edita les opcions de selecció de colors"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Color d'accent fort, típicament utilitzat per al botó més important de la pantalla."
+ content-link-color: "Color de lletra de la majoria dels enllaços."
+ primary-color: "Color principal."
+ primary-color-dark: "Habitualment una versió més fosca del color principal feta servir per efectes quan el ratolí passa per sobre."
header-item-bg-hover-color: "Color de fons dels elements clicables de la capçalera quan el ratolí hi passa per damunt."
header-item-font-color: "Color de lletra dels elements clicables de la capçalera."
header-item-font-hover-color: "Color de lletra dels elements clicables de la capçalera quan el ratolí hi passa per damunt."
@@ -1525,7 +1528,6 @@ ca:
postgres_migration: "Migrant la teva instal·lació a PostgreSQL"
user_guides: "Guies d'usuari"
faq: "Preguntes Més Freqüents"
- impressum: "Legal notice"
glossary: "Glossari"
shortcuts: "Dreceres"
blog: "Blog OpenProject"
@@ -1857,6 +1859,7 @@ ca:
label_subject_or_id: "Subjecte o ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Avís legal"
label_in: "en"
label_in_less_than: "en menys de"
label_in_more_than: "en més de"
diff --git a/config/locales/crowdin/ckb-IR.yml b/config/locales/crowdin/ckb-IR.yml
index ac3ff2b16ff5..00e2e253718e 100644
--- a/config/locales/crowdin/ckb-IR.yml
+++ b/config/locales/crowdin/ckb-IR.yml
@@ -26,14 +26,15 @@ ckb-IR:
no_results_title_text: There has not been any activity for the project within this time frame.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: There are currently no plugins available.
custom_styles:
color_theme: "Color theme"
color_theme_custom: "(Custom)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternative"
+ content-link-color: "Link font"
+ primary-color: "Primary"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ ckb-IR:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Edit color select options"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Font color of most of the links."
+ primary-color: "Main color."
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1529,7 +1532,6 @@ ckb-IR:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "User guides"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glossary"
shortcuts: "Shortcuts"
blog: "OpenProject blog"
@@ -1861,6 +1863,7 @@ ckb-IR:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "in"
label_in_less_than: "in less than"
label_in_more_than: "in more than"
diff --git a/config/locales/crowdin/cs.yml b/config/locales/crowdin/cs.yml
index 796cf5a62f91..45ef8844265e 100644
--- a/config/locales/crowdin/cs.yml
+++ b/config/locales/crowdin/cs.yml
@@ -26,14 +26,15 @@ cs:
no_results_title_text: V tomto časovém rámci nebyla pro projekt žádná aktivita.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: V současné době nejsou k dispozici žádné pluginy.
custom_styles:
color_theme: "Barevné téma"
color_theme_custom: "Vlastní"
colors:
- primary-button-color: "Primární tlačítko"
- accent-color: "Odstín"
+ alternative-color: "Alternativa"
+ content-link-color: "Link font"
+ primary-color: "Primární"
+ primary-color-dark: "Primární (tmavé)"
header-bg-color: "Pozadí záhlaví"
header-item-bg-hover-color: "Pozadí záhlaví při přejetí myší"
header-item-font-color: "Písmo záhlaví"
@@ -52,8 +53,10 @@ cs:
enterprise_more_info: "Poznámka: použité logo bude veřejně přístupné."
manage_colors: "Upravit možnosti výběru barvy"
instructions:
- primary-button-color: "Výrazná akcentní barva, která se používá pro nejdůležitější tlačítko na obrazovce."
- accent-color: "Barva pro odkazy a další decentně zvýrazněné prvky."
+ alternative-color: "Silná barva zvýraznění, obvykle používaná pro nejdůležitější tlačítko na obrazovce."
+ content-link-color: "Barva písma většiny odkazů."
+ primary-color: "Hlavní barva."
+ primary-color-dark: "Obvykle tmavší verze hlavní barvy použité pro efekt vznášení."
header-item-bg-hover-color: "Barva pozadí klikacích položek záhlaví při najetí myší."
header-item-font-color: "Barva pozadí klikacích položek záhlaví."
header-item-font-hover-color: "Barva pozadí klikacích položek záhlaví při najetí myší."
@@ -358,7 +361,7 @@ cs:
irreversible: "Tato akce je nevratná"
confirmation: "Zadejte název zástupného uživatele %{name} pro potvrzení odstranění."
upsale:
- title: placeholder uživatel
+ title: Placeholder uživatel
description: >
Placeholder uživatelé jsou způsob, jak přiřadit pracovní balíčky uživatelům, kteří nejsou součástí vašeho projektu. Mohou být užiteční v řadě scénářů; například, pokud potřebujete sledovat úkoly u zdroje, který ještě nejsou pojmenovány nebo dostupné, nebo pokud nechcete této osobě umožnit přístup k OpenProject ale stále chcete sledovat úkoly, které jim byly přiděleny.
prioritiies:
@@ -564,7 +567,7 @@ cs:
false: "archivováno"
identifier: "Identifikátor"
latest_activity_at: "Poslední aktivita"
- parent: "Podprojekt"
+ parent: "Nadřazený projekt"
public_value:
title: "Viditelnost"
true: "veřejný"
@@ -659,7 +662,7 @@ cs:
true: "zahrnuje nepracovní dny"
notify: "Oznámit" #used in custom actions
parent: "Nadřazený"
- parent_issue: "Rodič"
+ parent_issue: "Nadřazený"
parent_work_package: "Nadřazený"
priority: "Priorita"
progress: "% Dokončeno"
@@ -795,7 +798,7 @@ cs:
blank: "je povinné. Zvolte prosím název."
not_unique: " už bylo použito. Prosím vyberte jiný název."
notifications:
- at_least_one_channel: "Alespoň jeden kanál pro odesílání oznámení musí být specifikován."
+ at_least_one_channel: "Pro odesílání notifikací musí být specifikován alespoň jeden kanál"
attributes:
read_ian:
read_on_creation: "nelze nastavit na pravdivé při vytváření oznámení "
@@ -1014,11 +1017,11 @@ cs:
member: "Člen"
news: "Novinky"
notification:
- one: "Oznámení"
- few: "Oznámení"
- many: "Oznámení"
- other: "Oznámení"
- placeholder_user: "placeholder uživatel"
+ one: "Notifikace"
+ few: "Notifikací"
+ many: "Notifikací"
+ other: "Notifikace"
+ placeholder_user: "Placeholder uživatel"
project: "Projekt"
query: "Vlastní dotaz"
role:
@@ -1583,7 +1586,6 @@ cs:
postgres_migration: "Migrujte vaši instalaci na PostgreSQL"
user_guides: "Uživatelské příručky"
faq: "FAQ - často kladené dotazy"
- impressum: "Právní ustanovení"
glossary: "Glossary"
shortcuts: "Klávesové zkratky"
blog: "OpenProject blog"
@@ -1621,7 +1623,7 @@ cs:
instructions_after_error: "Zkuste se znovu přihlásit kliknutím na %{signin}. Pokud chyba přetrvává, požádejte správce o pomoc."
menus:
admin:
- mail_notification: "E-mailová upozornění"
+ mail_notification: "E-mailové notifikace"
mails_and_notifications: "E-maily a oznámení"
aggregation: "Agregace"
api_and_webhooks: "API & Webhooky"
@@ -1666,7 +1668,7 @@ cs:
failed: "Došlo k chybě a token nemohl být odstraněn. Opakujte akci později."
unknown_storage: "Neznámé úložiště"
notifications:
- send_notifications: "Odeslat oznámení pro tuto akci"
+ send_notifications: "Pro tuto akci odeslat notifikaci"
work_packages:
subject:
created: "Pracovní balíček byl vytvořen."
@@ -1685,7 +1687,7 @@ cs:
S pozdravem, OpenProject tým
body_header: "Verze 12.0 s oznamovacím centrem"
body_subheader: "Novinky"
- subject: "Důležité změny oznámení s vydáním 12.0"
+ subject: "Důležité změny notifikací s vydáním 12.0"
label_accessibility: "Přístupnost"
label_account: "Účet"
label_active: "Aktivní"
@@ -1915,6 +1917,7 @@ cs:
label_subject_or_id: "Předmět nebo ID"
label_calendar_subscriptions: "Předplatné kalendáře"
label_identifier: "Identifikátor"
+ label_impressum: "Právní oznámení"
label_in: "v"
label_in_less_than: "za méně než"
label_in_more_than: "za více než"
@@ -2057,9 +2060,9 @@ cs:
label_permissions: "Práva"
label_permissions_report: "Přehled oprávnění"
label_personalize_page: "Přizpůsobit tuto stránku"
- label_placeholder_user: "placeholder uživatel"
+ label_placeholder_user: "Placeholder uživatel"
label_placeholder_user_new: ""
- label_placeholder_user_plural: "placeholder uživatelé"
+ label_placeholder_user_plural: "Placeholder uživatelé"
label_planning: "Plánování"
label_please_login: "Přihlaste se prosím"
label_plugins: "Pluginy"
@@ -2078,7 +2081,7 @@ cs:
label_project_activity: "Aktivita projektu"
label_project_attribute_plural: "Atributy projektu"
label_project_count: "Celkový počet projektů"
- label_project_copy_notifications: "Během kopie projektu odeslat oznámení e-mailem"
+ label_project_copy_notifications: "Během kopírování projektu odeslat notifikace e-mailem"
label_project_latest: "Nejnovější projekty"
label_project_default_type: "Povolit prázdný typ"
label_project_hierarchy: "Hierarchie projektu"
@@ -2211,7 +2214,7 @@ cs:
label_users_settings: "Uživatelská nastavení"
label_version_new: "Nová verze"
label_version_plural: "Verze"
- label_version_sharing_descendants: "S Podprojekty"
+ label_version_sharing_descendants: "S podprojekty"
label_version_sharing_hierarchy: "S hierarchií projektu"
label_version_sharing_none: "Není sdíleno"
label_version_sharing_system: "Se všemi projekty"
@@ -2313,28 +2316,28 @@ cs:
digests:
including_mention_singular: "včetně zmínky"
including_mention_plural: "včetně %{number_mentioned} zmínění"
- unread_notification_singular: "1 nepřečtené oznámení"
- unread_notification_plural: "%{number_unread} nepřečtených oznámení"
+ unread_notification_singular: "1 nepřečtená notifikace"
+ unread_notification_plural: "%{number_unread} nepřečtených notifikací"
you_have: "Máte"
logo_alt_text: "Logo"
mention:
subject: "%{user_name} vás zmínil v #%{id} - %{subject}"
notification:
- center: "Centrum oznámení"
+ center: "Centrum notifikací"
see_in_center: "Zobrazit komentář v oznamovacím centru"
settings: "Změnit nastavení e-mailu"
salutation: "Ahoj %{user}!"
salutation_full_name: "Jméno a příjmení"
work_packages:
created_at: "Vytvořeno v %{timestamp} uživatelem %{user} "
- login_to_see_all: "Přihlaste se pro zobrazení všech oznámení."
+ login_to_see_all: "Přihlaste se pro zobrazení všech notifikací."
mentioned: "Byli jste zmíněni v komentáři"
mentioned_by: "%{user} vás zmínil v komentáři"
more_to_see:
- one: "Existuje ještě 1 pracovní balíček s oznámeními."
- few: "Existuje ještě %{count} pracovních balíčků s oznámeními."
- many: "Existuje ještě %{count} pracovních balíčků s oznámeními."
- other: "Existuje ještě %{count} pracovních balíčků s oznámeními."
+ one: "Existuje ještě %{count} pracovní balíček s notifikací."
+ few: "Existuje ještě %{count} pracovních balíčků s notifikacema."
+ many: "Existuje ještě %{count} pracovních balíčků s notifikacema."
+ other: "Existuje ještě %{count} pracovních balíčků s notifikacema."
open_in_browser: "Otevřít v prohlížeči"
reason:
watched: "Sledováno"
@@ -2343,7 +2346,7 @@ cs:
mentioned: "Zmíněné"
shared: "Sdílené"
subscribed: "vše"
- prefix: "Obdrženo z důvodu nastavení oznámení: %{reason}"
+ prefix: "Obdrženo z důvodu nastavení notifikací: %{reason}"
date_alert_start_date: "Upozornění na datum"
date_alert_due_date: "Upozornění na datum"
see_all: "Zobrazit vše"
@@ -2587,7 +2590,7 @@ cs:
permission_move_work_packages: "Přesun pracovních balíčků"
permission_protect_wiki_pages: "Ochrana stránky wiki"
permission_rename_wiki_pages: "Přejmenovat stránky wiki"
- permission_save_queries: "Uložit pohled"
+ permission_save_queries: "Uložit zobrazení"
permission_search_project: "Hledat projekt"
permission_select_custom_fields: "Vybrat vlastní pole"
permission_select_project_modules: "Vyberte moduly projektu"
@@ -2941,7 +2944,7 @@ cs:
enable_subscriptions_text_html: Umožňuje uživatelům s nezbytnými oprávněními přihlásit se do OpenProject kalendářů a získat přístup k informacím o pracovním balíčku prostřednictvím externího klienta kalendáře. Poznámka: Před povolením si prosím přečtěte iCalendar předplatné.
language_name_being_default: "%{language_name} (výchozí)"
notifications:
- events_explanation: "Určuje, pro kterou událost je odeslán e-mail. Pracovní balíčky jsou z tohoto seznamu vyloučeny, protože oznámení pro ně mohou být nastavena speciálně pro každého uživatele."
+ events_explanation: "Určuje, pro kterou událost je odeslán e-mail. Pracovní balíčky jsou z tohoto seznamu vyloučeny, protože notifikace pro ně mohou být nastavena speciálně pro každého uživatele."
delay_minutes_explanation: "Odesílání e-mailu může být pozdrženo, aby bylo uživatelům s nakonfigurovaným v oznámení aplikace před odesláním pošty potvrzeno oznámení. Uživatelé, kteří si přečtou oznámení v aplikaci, nedostanou e-mail pro již přečtené oznámení."
other: "Ostatní"
passwords: "Hesla"
@@ -3011,7 +3014,7 @@ cs:
text_destroy_with_associated: "Existují další objekty, které jsou přiřazeny k pracovním balíčkům a které mají být odstraněny. Tyto objekty jsou následující typy:"
text_destroy_what_to_do: "Co chcete udělat?"
text_diff_truncated: "... Toto rozlišení bylo zkráceno, protože přesahuje maximální velikost, kterou lze zobrazit."
- text_email_delivery_not_configured: "Doručení e-mailu není nakonfigurováno a oznámení jsou zakázána.\nNakonfigurujte váš SMTP server pro jejich povolení."
+ text_email_delivery_not_configured: "Doručení e-mailu není nakonfigurováno a notifikace jsou zakázány.\nNakonfigurujte váš SMTP server pro jejich povolení."
text_enumeration_category_reassign_to: "Přiřadit je k této hodnotě:"
text_enumeration_destroy_question: "%{count} objektů je přiřazeno k této hodnotě."
text_file_repository_writable: "Do adresáře příloh lze zapisovat"
diff --git a/config/locales/crowdin/da.yml b/config/locales/crowdin/da.yml
index 49383aa1feff..445f6ce76cc7 100644
--- a/config/locales/crowdin/da.yml
+++ b/config/locales/crowdin/da.yml
@@ -26,14 +26,15 @@ da:
no_results_title_text: Der har ikke været nogen aktivitet for projektet i tidsperioden.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Der er i øjeblikket ingen plugins installeret.
custom_styles:
color_theme: "Farvetema"
color_theme_custom: "(Tilpas)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternativ"
+ content-link-color: "Tilknyt skrifttype"
+ primary-color: "Primær"
+ primary-color-dark: "Primær (mørk)"
header-bg-color: "Overskriftsbaggrund"
header-item-bg-hover-color: "Overskriftsbaggrund ved mus over"
header-item-font-color: "Hoved skrifttype"
@@ -52,8 +53,10 @@ da:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Redigér egenskaber for farvevalg"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Stærk accentfarve, typisk brugt til den vigtigste knap på en skærm."
+ content-link-color: "Tekst-farve på de fleste links."
+ primary-color: "Hovedfarve."
+ primary-color-dark: "Typisk en mørkere version af hovedfarven, brugt til hover effekter."
header-item-bg-hover-color: "Baggrundsfarve på knapper i headeren, når musen føres over."
header-item-font-color: "Tekst-farve på knapper i headeren."
header-item-font-hover-color: "Tekst-farve på knapper i headeren, når musen føres over."
@@ -1527,7 +1530,6 @@ da:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "Brugervejledninger"
faq: "Spørgsmål & Svar"
- impressum: "Legal notice"
glossary: "Ordliste"
shortcuts: "Genveje "
blog: "OpenProject blog"
@@ -1859,6 +1861,7 @@ da:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "i"
label_in_less_than: "på mindre end"
label_in_more_than: "på mere end"
diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml
index 51cbbc498d52..d83086de7f84 100644
--- a/config/locales/crowdin/de.yml
+++ b/config/locales/crowdin/de.yml
@@ -26,14 +26,15 @@ de:
no_results_title_text: Innerhalb dieses Zeitraums haben keine Aktivitäten in dem Projekt stattgefunden.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Zur Zeit stehen keine Plugins zur Verfügung.
custom_styles:
color_theme: "Farbschema"
color_theme_custom: "(Benutzerdefiniert)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternativ"
+ content-link-color: "Link-Schriftfarbe"
+ primary-color: "Primärfarbe"
+ primary-color-dark: "Primärfarbe (dunkel)"
header-bg-color: "Hintergrund der Kopfzeile"
header-item-bg-hover-color: "Hintergrund der Kopfzeile bei Hover"
header-item-font-color: "Textfarbe der Kopfzeile"
@@ -48,12 +49,14 @@ de:
main-menu-border-color: "Rahmenfarbe des Hauptmenüs"
custom_colors: "Benutzerdefinierte Farben"
customize: "Passen Sie Ihre OpenProject Installation mit Ihrem eigenen Logo und eigenen Farben an."
- enterprise_notice: "Diese kleine Erweiterung steht den Abonnenten der Enterprise edition ganz exklusiv als kleines Dankeschön für deren finanzielle Unterstützung zur Verfügung."
+ enterprise_notice: "Dieses kleine Add-on steht den Abonnenten der Enterprise-Edition ganz exklusiv als kleines Dankeschön für deren finanzielle Unterstützung zur Verfügung."
enterprise_more_info: "Hinweis: Das verwendete Logo wird öffentlich zugänglich sein."
manage_colors: "Farbauswahloptionen bearbeiten"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Starke Akzentfarbe, wird normalerweise für die wichtigste Schaltfläche auf dem Bildschirm verwendet."
+ content-link-color: "Schriftfarbe der meisten Links."
+ primary-color: "Hauptfarbe."
+ primary-color-dark: "In der Regel wird eine dunklere Version der Hauptfarbe für Hover-Effekte verwendet."
header-item-bg-hover-color: "Hintergrundfarbe von Header-Elementen während Mouse-hover."
header-item-font-color: "Schriftfarbe von anklickbaren Header-Elementen."
header-item-font-hover-color: "Schriftfarbe von anklickbaren Header-Elementen während Mouse-hover."
@@ -61,15 +64,15 @@ de:
main-menu-bg-color: "Hintergrundfarbe des Menüs in der linken Seitenleiste."
theme_warning: Das Ändern des Themes wird Ihr benutzerdefiniertes Design überschreiben. Alle Änderungen werden dann verloren gehen. Sind Sie sicher, dass Sie fortfahren möchten?
enterprise:
- upgrade_to_ee: "Auf Enterprise edition upgraden"
- add_token: "Enterprise edition Support Token hochladen"
+ upgrade_to_ee: "Auf Enterprise-Edition upgraden"
+ add_token: "Enterprise-Edition Support Token hochladen"
delete_token_modal:
- text: "Sind Sie sicher, dass Sie das aktuelle Enterprise edition token entfernen möchten?"
+ text: "Sind Sie sicher, dass Sie das aktuelle Enterprise Edition-Token entfernen möchten?"
title: "Token löschen"
replace_token: "Aktuellen Enterprise edition Support Token ersetzen"
order: "Enterprise on-premises bestellen"
- paste: "Enterprise edition Support Token hier einfügen"
- required_for_feature: "Dieses Add-on ist nur mit einem aktiven Enterprise edition Support-Token verfügbar."
+ paste: "Enterprise-Edition Support Token hier einfügen"
+ required_for_feature: "Dieses Add-on ist nur mit einem aktiven Enterprise-Edition Support-Token verfügbar."
enterprise_link: "Klicken Sie hier für weitere Informationen."
start_trial: "Kostenlose Testversion starten"
book_now: "Jetzt buchen"
@@ -429,8 +432,8 @@ de:
sharing:
missing_workflow_waring:
title: "Der Workflow für das Teilen von Arbeitspaketen fehlt"
- message: "Es ist kein Arbeitsablauf (Workflow) für die Rolle ‚Arbeitspaket-Editor‘ konfiguriert. Ohne einen Arbeitsablauf kann der gemeinsam mit dem Benutzer den Status des Arbeitspakets nicht ändern. Arbeitsabläufe können kopiert werden. Wählen Sie einen Quelltyp (z. B. ‚Task‘) und eine Quell-Rolle (z. B. 'Member'). Wählen Sie dann die Zieltypen aus, um alle Typen als Ziele auszuwählen und schließlich die Rolle ‚Arbeitspaket-Editor‘ als Ziel aus und drücken Sie ‚Kopieren‘. Nachdem Sie die Standardeinstellungen erstellt haben, können Sie die Arbeitsabläufe so einstellen, wie Sie es für jede andere Rolle tun."
- link_message: "Konfigurieren Sie die Arbeitsabläufe in der Administration."
+ message: "Es ist kein Workflow für die Rolle ‚Work package editor‘ konfiguriert. Nur mit einem solchen Workflow können Benutzer, mit denen ein Arbeitspaket geteilt wurde, den Status des Arbeitspakets ändern. Workflows lassen sich einfach kopieren. Wählen Sie dazu einen Quell-Typ (z. B. ‚Task‘) und eine Quell-Rolle (z. B. 'Member') aus. Wählen Sie dann die Ziel-Typen aus. Als ersten Schritt können Sie alle Typen als Ziel-Typen auswählen. Danach wählen Sie die Ziel-Rolle ‚Work package editor‘ aus und drücken Sie auf den Knopf ‚Kopieren‘. Nachdem Sie hiermit eine Grundlage geschaffen haben, können Sie danach diese Workflows weiter anpassen, ganz genau wie Sie es für jede andere Rolle bereits getan haben."
+ link_message: "Konfigurieren Sie die Workflows in der Administration."
summary:
reports:
category:
@@ -1421,7 +1424,7 @@ de:
error_cookie_missing: "Das OpenProject Cookie fehlt. Bitte stellen Sie sicher, dass Cookies aktiviert sind, da diese Applikation ohne aktivierte Cookies nicht korrekt funktioniert."
error_custom_option_not_found: "Option ist nicht vorhanden."
error_enterprise_activation_user_limit: "Ihr Konto konnte nicht aktiviert werden (Nutzerlimit erreicht). Bitte kontaktieren Sie Ihren Administrator um Zugriff zu erhalten."
- error_enterprise_token_invalid_domain: "Die Enterprise edition ist nicht aktiv. Die aktuelle Domain (%{actual}) entspricht nicht dem erwarteten Hostnamen (%{expected})."
+ error_enterprise_token_invalid_domain: "Die Enterprise-Edition ist nicht aktiv. Die aktuelle Domain (%{actual}) entspricht nicht dem erwarteten Hostnamen (%{expected})."
error_failed_to_delete_entry: "Fehler beim Löschen dieses Eintrags."
error_in_dependent: "Fehler beim Versuch, abhängiges Objekt zu ändern: %{dependent_class} #%{related_id} - %{related_subject}: %{error}"
error_in_new_dependent: "Fehler beim Versuch, abhängiges Objekt zu erstellen: %{dependent_class} - %{related_subject}: %{error}"
@@ -1517,14 +1520,13 @@ de:
blocks:
community: "OpenProject Community"
upsale:
- title: "Auf Enterprise edition upgraden"
+ title: "Auf Enterprise-Edition upgraden"
more_info: "Weitere Informationen"
links:
- upgrade_enterprise_edition: "Auf Enterprise edition upgraden"
+ upgrade_enterprise_edition: "Auf Enterprise-Edition upgraden"
postgres_migration: "Migration Ihrer Installation zu PostgreSQL"
user_guides: "Benutzerhandbuch"
faq: "Häufig gestellte Fragen"
- impressum: "Legal notice"
glossary: "Glossar"
shortcuts: "Tastenkürzel"
blog: "OpenProject Blog"
@@ -1804,7 +1806,7 @@ de:
label_enumerations: "Aufzählungen"
label_enterprise: "Enterprise"
label_enterprise_active_users: "%{current}/%{limit} gebuchte aktive Nutzer"
- label_enterprise_edition: "Enterprise edition"
+ label_enterprise_edition: "Enterprise Edition"
label_enterprise_support: "Enterprise Support"
label_enterprise_addon: "Enterprise Add-on"
label_environment: "Umgebung"
@@ -1856,6 +1858,7 @@ de:
label_subject_or_id: "Titel oder ID"
label_calendar_subscriptions: "Kalenderabonnements"
label_identifier: "Kennung"
+ label_impressum: "Impressum"
label_in: "an"
label_in_less_than: "in weniger als"
label_in_more_than: "in mehr als"
@@ -2684,8 +2687,8 @@ de:
update_timeout: "Speichere die Informationen bzgl. des genutzten Festplattenspeichers eines Projektarchivs für N Minuten.\nErhöhen Sie diesen Wert zur Verbesserung der Performance, da die Erfassung des genutzten Festplattenspeichers Ressourcen-intensiv ist."
oauth_application_details: "Der Client Geheimcode wird nach dem Schließen dieses Fensters nicht mehr zugänglich sein. Bitte kopieren Sie diese Werte in die Nextcloud OpenProject Integrationseinstellungen:"
oauth_application_details_link_text: "Zu den Einstellungen gehen"
- setup_documentation_details: "Wenn Sie Hilfe bei der Konfiguration eines neuen Datei-Speichers benötigen, konsultieren Sie bitte die Dokumentation: "
- setup_documentation_details_link_text: "Datei-Speicher einrichten"
+ setup_documentation_details: "Wenn Sie Hilfe bei der Konfiguration eines neuen Dateispeichers benötigen, konsultieren Sie bitte die Dokumentation: "
+ setup_documentation_details_link_text: "Dateispeicher einrichten"
show_warning_details: "Um diesen Dateispeicher nutzen zu können, müssen Sie das Modul und den spezifischen Speicher in den Projekteinstellungen jedes gewünschten Projekts aktivieren."
subversion:
existing_title: "Vorhandenes Subversion Projektarchiv"
@@ -3109,7 +3112,7 @@ de:
warning_user_limit_reached_admin: >
Das Hinzufügen zusätzlicher Benutzer überschreitet das aktuelle Benutzerlimit. Bitte aktualisieren Sie Ihr Abonnement um sicherzustellen, dass externe Benutzer auf diese Instanz zugreifen können.
warning_user_limit_reached_instructions: >
- Du hast dein Nutzerlimit erreicht (%{current}/%{max} active users). Bitte kontaktiere sales@openproject.com um deinen Enterprise edition Plan upzugraden und weitere Nutzer hinzuzufügen.
+ Du hast dein Nutzerlimit erreicht (%{current}/%{max} active users). Bitte kontaktiere sales@openproject.com um deinen Enterprise Edition Plan upzugraden und weitere Nutzer hinzuzufügen.
warning_protocol_mismatch_html: >
warning_bar:
diff --git a/config/locales/crowdin/el.yml b/config/locales/crowdin/el.yml
index faf93f0f1f96..8f0a0617ad5e 100644
--- a/config/locales/crowdin/el.yml
+++ b/config/locales/crowdin/el.yml
@@ -26,14 +26,15 @@ el:
no_results_title_text: Δεν υπήρξε καμία δραστηριότητα για το έργο εντός αυτού του χρονικού πλαισίου.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Προς το παρόν δεν υπάρχουν διαθέσιμα πρόσθετα.
custom_styles:
color_theme: "Χρωματικό θέμα"
color_theme_custom: "(Προσαρμοσμένο)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Εναλλακτικό"
+ content-link-color: "Γραμματοσειρά συνδέσμου"
+ primary-color: "Κύριο"
+ primary-color-dark: "Κύριο (σκούρο)"
header-bg-color: "Φόντο κεφαλίδας"
header-item-bg-hover-color: "Φόντο κεφαλίδας κατά το πέρασμα του ποντικιού"
header-item-font-color: "Γραμματοσειρά κεφαλίδας"
@@ -52,8 +53,10 @@ el:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Επεξεργαστείτε τις επιλογές επιλογής χρώματος"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Ισχυρός τόνος χρώματος, το οποίο συνήθως χρησιμοποιείται για το πιο σημαντικό κουμπί σε μια οθόνη."
+ content-link-color: "Χρώμα γραμματοσειράς των περισσότερων συνδέσμων."
+ primary-color: "Κύριο χρώμα."
+ primary-color-dark: "Συνήθως μια πιο σκούρα εκδοχή του κύριου χρώματος που χρησιμοποιείται για τα εφέ του hover."
header-item-bg-hover-color: "Χρώμα φόντου στοιχείων κεφαλίδας με δυνατότητα κλικ, όταν ο δείκτης βρίσκεται πάνω."
header-item-font-color: "Χρώμα γραμματοσειράς στοιχείων κεφαλίδας με δυνατότητα κλικ."
header-item-font-hover-color: "Χρώμα γραμματοσειράς στοιχείων κεφαλίδας με δυνατότητα κλικ, όταν ο δείκτης βρίσκεται πάνω."
@@ -1525,7 +1528,6 @@ el:
postgres_migration: "Μεταφορά της εγκατάστασης σας σε PostgreSQL"
user_guides: "Εγχειρίδια χρηστών"
faq: "Συχνές Ερωτήσεις"
- impressum: "Legal notice"
glossary: "Γλωσσάριο"
shortcuts: "Συντομεύσεις"
blog: "OpenProject blog"
@@ -1857,6 +1859,7 @@ el:
label_subject_or_id: "Θέμα ή ταυτότητα"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Νομική Ειδοποίηση"
label_in: "σε"
label_in_less_than: "σε λιγότερο από"
label_in_more_than: "σε περισσότερο από"
diff --git a/config/locales/crowdin/eo.yml b/config/locales/crowdin/eo.yml
index 6240efc1d56f..1a4e378bdf2a 100644
--- a/config/locales/crowdin/eo.yml
+++ b/config/locales/crowdin/eo.yml
@@ -26,14 +26,15 @@ eo:
no_results_title_text: There has not been any activity for the project within this time frame.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: There are currently no plugins available.
custom_styles:
color_theme: "Tema koloro"
color_theme_custom: "(Propra)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternative"
+ content-link-color: "Ligila fonto"
+ primary-color: "Ĉefa"
+ primary-color-dark: "Ĉefa (malluma)"
header-bg-color: "Kapa fono"
header-item-bg-hover-color: "Kapa fono dum musumo"
header-item-font-color: "Kapa tiparo"
@@ -52,8 +53,10 @@ eo:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Redakti agordojn de kolorelekto"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "kolortiparo de plej multe el la ligiloj"
+ primary-color: "Ĉefa koloro."
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1529,7 +1532,6 @@ eo:
postgres_migration: "Transmetanta vian instalon al PostgreSQL"
user_guides: "Manlibro por uzantoj"
faq: "Oftaj Demandoj"
- impressum: "Legal notice"
glossary: "Difinvortaro"
shortcuts: "Fulmoklavoj"
blog: "Blogo de OpenProject"
@@ -1861,6 +1863,7 @@ eo:
label_subject_or_id: "Temo aŭ ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Leĝa atentigo"
label_in: "en"
label_in_less_than: "en malpli ol"
label_in_more_than: "in more than"
diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml
index 09b21877627b..04157ffa1942 100644
--- a/config/locales/crowdin/es.yml
+++ b/config/locales/crowdin/es.yml
@@ -26,14 +26,15 @@ es:
no_results_title_text: No se ha producido ninguna actividad en el proyecto en este período de tiempo.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: No hay extensiones disponibles.
custom_styles:
color_theme: "Tema de color"
color_theme_custom: "(Personalizado)"
colors:
- primary-button-color: "Botón primario"
- accent-color: "Acento"
+ alternative-color: "Alternativo"
+ content-link-color: "Fuente de enlace"
+ primary-color: "Primario"
+ primary-color-dark: "Primario (oscuro)"
header-bg-color: "Fondo de encabezado"
header-item-bg-hover-color: "Fondo de encabezado al mantener el cursor"
header-item-font-color: "Fuente de encabezado"
@@ -52,8 +53,10 @@ es:
enterprise_more_info: "Nota: el logotipo utilizado será de acceso público."
manage_colors: "Editar opciones de selección de colores"
instructions:
- primary-button-color: "Color de acento fuerte, utilizado para el botón más importante de una pantalla."
- accent-color: "Color para los enlaces y otros elementos resaltados decentemente."
+ alternative-color: "Color de énfasis intenso, que suele usarse para el botón más importante de una pantalla."
+ content-link-color: "Color de fuente de la mayoría de los enlaces."
+ primary-color: "Color principal."
+ primary-color-dark: "Se suelen usar versions oscuras del color principal para la acción de pasar el ratón por encima."
header-item-bg-hover-color: "Color de fondo de los elementos interactivos del encabezado cuando se mantiene el ratón sobre estos."
header-item-font-color: "Color de fuente de los elementos interactivos del encabezado."
header-item-font-hover-color: "Color de fuente de los elementos interactivos del encabezado cuando se mantiene el ratón sobre estos."
@@ -1526,7 +1529,6 @@ es:
postgres_migration: "Migrando su instalación a PostgreSQL"
user_guides: "Guia de usuario"
faq: "Preguntas Frecuentes"
- impressum: "Aviso legal"
glossary: "Glosario"
shortcuts: "Accesos directos"
blog: "Blog de OpenProject"
@@ -1858,6 +1860,7 @@ es:
label_subject_or_id: "Asunto o ID"
label_calendar_subscriptions: "Suscripciones al calendario"
label_identifier: "Identificador"
+ label_impressum: "Aviso legal"
label_in: "en"
label_in_less_than: "en menos de"
label_in_more_than: "en más de"
diff --git a/config/locales/crowdin/et.yml b/config/locales/crowdin/et.yml
index 23640c589f67..931159c7ccf3 100644
--- a/config/locales/crowdin/et.yml
+++ b/config/locales/crowdin/et.yml
@@ -26,14 +26,15 @@ et:
no_results_title_text: There has not been any activity for the project within this time frame.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: There are currently no plugins available.
custom_styles:
color_theme: "Värviteema"
color_theme_custom: "(Kohandatud)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternatiiv"
+ content-link-color: "Link font"
+ primary-color: "Peamine"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ et:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Edit color select options"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Font color of most of the links."
+ primary-color: "Main color."
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1529,7 +1532,6 @@ et:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "User guides"
faq: "KKK"
- impressum: "Legal notice"
glossary: "Sõnastik"
shortcuts: "Otseteed"
blog: "OpenProject blog"
@@ -1861,6 +1863,7 @@ et:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "sisaldub hulgas"
label_in_less_than: "on väiksem kui"
label_in_more_than: "on suurem kui"
diff --git a/config/locales/crowdin/eu.yml b/config/locales/crowdin/eu.yml
index 5961b3ab22b3..f6c123cc42ed 100644
--- a/config/locales/crowdin/eu.yml
+++ b/config/locales/crowdin/eu.yml
@@ -26,14 +26,15 @@ eu:
no_results_title_text: There has not been any activity for the project within this time frame.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: There are currently no plugins available.
custom_styles:
color_theme: "Color theme"
color_theme_custom: "(Custom)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternative"
+ content-link-color: "Link font"
+ primary-color: "Primary"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ eu:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Edit color select options"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Font color of most of the links."
+ primary-color: "Main color."
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1529,7 +1532,6 @@ eu:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "User guides"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glossary"
shortcuts: "Shortcuts"
blog: "OpenProject blog"
@@ -1861,6 +1863,7 @@ eu:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "in"
label_in_less_than: "in less than"
label_in_more_than: "in more than"
diff --git a/config/locales/crowdin/fa.yml b/config/locales/crowdin/fa.yml
index 46bee8929440..4c266d585521 100644
--- a/config/locales/crowdin/fa.yml
+++ b/config/locales/crowdin/fa.yml
@@ -26,14 +26,15 @@ fa:
no_results_title_text: در این بازه زمانی عملیاتی برای این پروژه انجام نشده است.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: در حال حاضر پلاگینی موجود نیست.
custom_styles:
color_theme: "رنگ زمینه"
color_theme_custom: "شخصی"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "جایگزین، گزینه ها"
+ content-link-color: "لینک فونت"
+ primary-color: "اصلی"
+ primary-color-dark: "رنگ اصلی (تاریک)"
header-bg-color: "پس زمینه سربرگ"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ fa:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Edit color select options"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Font color of most of the links."
+ primary-color: "رنگ اصلی."
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1529,7 +1532,6 @@ fa:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "User guides"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glossary"
shortcuts: "Shortcuts"
blog: "OpenProject blog"
@@ -1861,6 +1863,7 @@ fa:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "in"
label_in_less_than: "in less than"
label_in_more_than: "in more than"
diff --git a/config/locales/crowdin/fi.yml b/config/locales/crowdin/fi.yml
index 7f142a93e3c3..cc77e1bf03ff 100644
--- a/config/locales/crowdin/fi.yml
+++ b/config/locales/crowdin/fi.yml
@@ -26,14 +26,15 @@ fi:
no_results_title_text: Ei tapahtumia projektissa tällä aikavälillä.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Tällä hetkellä ei ole liitännäisiä saatavilla.
custom_styles:
color_theme: "Väriteema"
color_theme_custom: "(Mukautettu)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Vaihtoehtoinen"
+ content-link-color: "Linkin kirjasin"
+ primary-color: "Primary"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ fi:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Muokkaa värin valitsemis asetuksia"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Fontin väri eniten linkkejä."
+ primary-color: "Pääväri."
+ primary-color-dark: "Yleensä tummempi versio pääväristä on käytössä valintatehosteissa."
header-item-bg-hover-color: "Taustan väri klikattava otsikko eriä kun leijui hiirellä."
header-item-font-color: "Fontin väri klikattava otsikko eriä."
header-item-font-hover-color: "Fontin väri klikattava otsikko eriä kun leijui hiirellä."
@@ -1529,7 +1532,6 @@ fi:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "Käyttöoppaat"
faq: "UKK"
- impressum: "Legal notice"
glossary: "Sanasto"
shortcuts: "Pikanäppäimet"
blog: "OpenProject blogi"
@@ -1861,6 +1863,7 @@ fi:
label_subject_or_id: "Aihe tai ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "tässä"
label_in_less_than: "pienempi kuin"
label_in_more_than: "suurempi kuin"
diff --git a/config/locales/crowdin/fil.yml b/config/locales/crowdin/fil.yml
index a449a6f5ea84..8c3b79bd5e14 100644
--- a/config/locales/crowdin/fil.yml
+++ b/config/locales/crowdin/fil.yml
@@ -26,14 +26,15 @@ fil:
no_results_title_text: May mga walang mga pagkikilos sa proyekto sa panahong ito.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Sa kasalukuyan ay walang mga plugin na available.
custom_styles:
color_theme: "Color theme"
color_theme_custom: "(Custom)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternative"
+ content-link-color: "Link font"
+ primary-color: "Primary"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ fil:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "I-edit ang kulay ng mga napiling opsyon"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Ang kulay ng font ang karamihan ng mga link."
+ primary-color: "Pangunahing kulay."
+ primary-color-dark: "Kadalasan ang masyadong maitim na bersyon sa isang pangunahing kulay ang ginamit para sa mga epekto ng hover."
header-item-bg-hover-color: "Ang nakapalibot na kulay ng madaling pindutin aytem ng header kung naka-hover gamit ang mouse."
header-item-font-color: "Ang kulay ng font sa madaling pinduting header ng mga aytem."
header-item-font-hover-color: "Ang kulay ng font ng madaling pinduting mga aytem kung naka-hover gamit ang mouse."
@@ -1529,7 +1532,6 @@ fil:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "Mga gabay ng gumagamit"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glosaryo"
shortcuts: "Mga madalian"
blog: "Blog ng OpenProject"
@@ -1861,6 +1863,7 @@ fil:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "sa"
label_in_less_than: "mas mababa kaysa"
label_in_more_than: "mahigit sa"
diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml
index a6f9029206e8..a50fe2525676 100644
--- a/config/locales/crowdin/fr.yml
+++ b/config/locales/crowdin/fr.yml
@@ -26,14 +26,15 @@ fr:
no_results_title_text: Il n’y a pas eu d'activité pour le projet pendant cette période.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Il n'y a actuellement aucun plugin disponible.
custom_styles:
color_theme: "Thème de couleur"
color_theme_custom: "(Personnalisé)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternative"
+ content-link-color: "Police des liens"
+ primary-color: "Principale"
+ primary-color-dark: "Principale (sombre)"
header-bg-color: "Fond de l'en-tête"
header-item-bg-hover-color: "Fond d’en-tête au survol"
header-item-font-color: "Police de l'en-tête"
@@ -52,8 +53,10 @@ fr:
enterprise_more_info: "Remarque : le logo utilisé sera accessible publiquement."
manage_colors: "Modifier les options du sélecteur de couleur"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Couleur d'accentuation, habituellement utilisée pour le bouton le plus important à l'écran."
+ content-link-color: "Couleur de la police de la plupart des liens."
+ primary-color: "Couleur principale."
+ primary-color-dark: "Généralement une version plus sombre de la couleur principale utilisée pour les effets de survol."
header-item-bg-hover-color: "Couleur d’arrière-plan des éléments de l’en-tête survolées par la souris."
header-item-font-color: "Couleur de la police des éléments de l’en-tête cliquables."
header-item-font-hover-color: "Couleur de la police des éléments de l’en-tête survolées par la souris."
@@ -1529,7 +1532,6 @@ fr:
postgres_migration: "Migration de votre installation vers PostgreSQL"
user_guides: "Guides d'utilisation"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Lexique"
shortcuts: "Raccourcis"
blog: "Blog OpenProject"
@@ -1861,6 +1863,7 @@ fr:
label_subject_or_id: "Objet ou ID"
label_calendar_subscriptions: "Abonnements au calendrier"
label_identifier: "Identifiant"
+ label_impressum: "Mentions légales"
label_in: "dans"
label_in_less_than: "dans moins de"
label_in_more_than: "dans plus de"
diff --git a/config/locales/crowdin/he.yml b/config/locales/crowdin/he.yml
index a1bbba6d6a16..ffce07246ecd 100644
--- a/config/locales/crowdin/he.yml
+++ b/config/locales/crowdin/he.yml
@@ -26,14 +26,15 @@ he:
no_results_title_text: בפרק זמן זה לא הייתה כל פעילות עבור הפרויקט.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: כרגע אין פלגאינים זמינים.
custom_styles:
color_theme: "Color theme"
color_theme_custom: "(Custom)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternative"
+ content-link-color: "Link font"
+ primary-color: "Primary"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ he:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "ערוך אפשרויות בחירת צבע"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "צבע גופן של מרבית הקישורים."
+ primary-color: "צבע ראשי."
+ primary-color-dark: "בדרך כלל, גרסה כהה יותר של הצבע הראשי המשמש לאפקטים של ריחוף."
header-item-bg-hover-color: "צבע הרקע של פריטים בכותרת העליונה הניתנים ללחיצה, בזמן שמרחפים עליהם עם העכבר."
header-item-font-color: "צבע גופן של פריטים בכותרת העליונה הניתנים ללחיצה."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1583,7 +1586,6 @@ he:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "User guides"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glossary"
shortcuts: "Shortcuts"
blog: "OpenProject blog"
@@ -1915,6 +1917,7 @@ he:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "ב"
label_in_less_than: "in less than"
label_in_more_than: "in more than"
diff --git a/config/locales/crowdin/hi.yml b/config/locales/crowdin/hi.yml
index 19cc1130618b..b6d85a8f9fb3 100644
--- a/config/locales/crowdin/hi.yml
+++ b/config/locales/crowdin/hi.yml
@@ -26,14 +26,15 @@ hi:
no_results_title_text: इस समय सीमा के भीतर परियोजना के लिए कोई भी गतिविधि नहीं हुई है ।
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: There are currently no plugins available.
custom_styles:
color_theme: "Color theme"
color_theme_custom: "(Custom)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternative"
+ content-link-color: "Link font"
+ primary-color: "Primary"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ hi:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Edit color select options"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "लिंक के अधिकांश का फ़ॉंट रंग ।"
+ primary-color: "Main color."
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "क्लिक करने वाले शीर्ष लेख आइटम जब माउस के साथ होवर्ड की पृष्ठभूमि रंग ।"
header-item-font-color: "क्लिक करने के लिए शीर्ष लेख आइटम का फ़ॉंट रंग ।"
header-item-font-hover-color: "क्लिक करने वाले शीर्ष लेख आइटम जब माउस के साथ होवर्ड की पृष्ठभूमि रंग ।"
@@ -1527,7 +1530,6 @@ hi:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "User guides"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glossary"
shortcuts: "Shortcuts"
blog: "OpenProject blog"
@@ -1859,6 +1861,7 @@ hi:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "में"
label_in_less_than: "से भी कम समय में"
label_in_more_than: "से अधिक में"
diff --git a/config/locales/crowdin/hr.yml b/config/locales/crowdin/hr.yml
index b9fc7278d722..ea79ca13f950 100644
--- a/config/locales/crowdin/hr.yml
+++ b/config/locales/crowdin/hr.yml
@@ -26,14 +26,15 @@ hr:
no_results_title_text: There has not been any activity for the project within this time frame.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Nema dostupnih dodataka.
custom_styles:
color_theme: "Color theme"
color_theme_custom: "(Prilagođeno)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternative"
+ content-link-color: "Link font"
+ primary-color: "Primary"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ hr:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Uređivanje boja odaberite Opcije"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Font color of most of the links."
+ primary-color: "Glavna boja."
+ primary-color-dark: "Obično tamnije verzije glavne boje za efekat lebdenja."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1556,7 +1559,6 @@ hr:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "Korisnički priručnici"
faq: "Često postavljana pitanja"
- impressum: "Legal notice"
glossary: "Kazalo pojmova"
shortcuts: "Prečaci"
blog: "OpenProject blog"
@@ -1888,6 +1890,7 @@ hr:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "u"
label_in_less_than: "u manje od"
label_in_more_than: "u više od"
diff --git a/config/locales/crowdin/hu.yml b/config/locales/crowdin/hu.yml
index 49dfcef131bf..aa4621eeb29b 100644
--- a/config/locales/crowdin/hu.yml
+++ b/config/locales/crowdin/hu.yml
@@ -26,14 +26,15 @@ hu:
no_results_title_text: Nem volt semmilyen tevékenység a projektben ebben az időszakban.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Nem állnak rendelkezésre pluginek.
custom_styles:
color_theme: "Színséma"
color_theme_custom: "(Egyéni)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternatíva"
+ content-link-color: "Hivatkozás betűkészlete"
+ primary-color: "Elsődleges"
+ primary-color-dark: "Elsődleges (sötét)"
header-bg-color: "Fejléc háttér"
header-item-bg-hover-color: "Fejléc háttere, ha az egér rajta áll"
header-item-font-color: "Fejléc betűtípus"
@@ -52,8 +53,10 @@ hu:
enterprise_more_info: "Megjegyzés: a használt logó nyilvánosan elérhető lesz."
manage_colors: "A színválasztás beállításainak módosítása"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Kiemelt szín, tipikusan a képernyőn megjelenő legfontosabb gomb esetén."
+ content-link-color: "A legtöbb hivatkozás színe."
+ primary-color: "Fő szín."
+ primary-color-dark: "Általában az alap szín sötétebb verzióját használjuk a hover effekthez."
header-item-bg-hover-color: "Kattintható fejléc háttérszíne egér hatására."
header-item-font-color: "Kattintható fejléc betűszíne."
header-item-font-hover-color: "Kattintható fejléc betűszíne egér hatására."
@@ -1526,7 +1529,6 @@ hu:
postgres_migration: "A rendszer költöztetése PostreSQL-re"
user_guides: "Felhasználói útmutató"
faq: "GY. I. K."
- impressum: "Legal notice"
glossary: "Szószedet"
shortcuts: "Parancsikonok"
blog: "OpenProject blog"
@@ -1858,6 +1860,7 @@ hu:
label_subject_or_id: "Tárgy, vagy azonosító"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Jogi nyilatkozat"
label_in: "in"
label_in_less_than: "kevesebb, mint"
label_in_more_than: "több mint"
diff --git a/config/locales/crowdin/id.yml b/config/locales/crowdin/id.yml
index fca7a411353d..c9e9a7cc93d7 100644
--- a/config/locales/crowdin/id.yml
+++ b/config/locales/crowdin/id.yml
@@ -26,14 +26,15 @@ id:
no_results_title_text: Belum ada kegiatan untuk proyek dalam jangka waktu ini.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Tidak ada plugin yang tersedia saat ini.
custom_styles:
color_theme: "Warna tema"
color_theme_custom: "Kustomisasi"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternatif"
+ content-link-color: "Tautan huruf"
+ primary-color: "Primer"
+ primary-color-dark: "Primer (gelap)"
header-bg-color: "Latar Belakang Header"
header-item-bg-hover-color: "Latar belakang header melayang"
header-item-font-color: "Bentuk huruf Judul"
@@ -52,8 +53,10 @@ id:
enterprise_more_info: "Catatan: logo yang digunakan akan dapat diakses publik."
manage_colors: "Edit warna pilih opsi"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Warna cerah, umumnya dipakai sebagai penanda tombol penting pada layar monitor."
+ content-link-color: "Warna font sebagian besar tautan."
+ primary-color: "Warna utama."
+ primary-color-dark: "Warna yang lebih gelap dari warna utama biasanya dipakai sebagai efek lintasan kursor."
header-item-bg-hover-color: "Warna latar belakang \"item header\" yang bisa di klik ketika ditunjuk dengan mouse."
header-item-font-color: "Warna font item header yang bisa diklik."
header-item-font-hover-color: "Warna font \"item header\" yang bisa di klik ketika ditunjuk dengan mouse."
@@ -1495,7 +1498,6 @@ id:
postgres_migration: "Migrasi instalasi anda ke PostgreSQL"
user_guides: "User guides"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glossary"
shortcuts: "Shortcuts"
blog: "OpenProject blog"
@@ -1800,7 +1802,7 @@ id:
label_file_plural: "File"
label_filter_add: "Tambah Filter"
label_filter: "Filters"
- label_filter_plural: "Filter"
+ label_filter_plural: "Penyaring"
label_filters_toggle: "Tampilkan/Sembunyikan penyaringan"
label_float: "Float"
label_folder: "Folder"
@@ -1827,6 +1829,7 @@ id:
label_subject_or_id: "Subyek atau ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Pernyataan hukum"
label_in: "dalam"
label_in_less_than: "kurang dari"
label_in_more_than: "lebih dari"
diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml
index 40f1adf017f8..6f061ad24bcd 100644
--- a/config/locales/crowdin/it.yml
+++ b/config/locales/crowdin/it.yml
@@ -26,14 +26,15 @@ it:
no_results_title_text: Non c'è stata alcuna attività per il progetto in questo lasso di tempo.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Al momento non vi sono plugin disponibili.
custom_styles:
color_theme: "Tema a colori"
color_theme_custom: "(Personalizzato)"
colors:
- primary-button-color: "Pulsante principale"
- accent-color: "Accento"
+ alternative-color: "Alternativa"
+ content-link-color: "Collega font"
+ primary-color: "Primario"
+ primary-color-dark: "Primario (scuro)"
header-bg-color: "Sfondo intestazione"
header-item-bg-hover-color: "Sfondo intestazione al passaggio del mouse"
header-item-font-color: "Font intestazione"
@@ -52,8 +53,10 @@ it:
enterprise_more_info: "Nota: il logo utilizzato sarà accessibile al pubblico."
manage_colors: "Modifica opzioni di selezione del colore"
instructions:
- primary-button-color: "Colore forte, utilizzato per far risaltare il pulsante principale sullo schermo."
- accent-color: "Colore per i link e altri elementi ben evidenziati."
+ alternative-color: "Colore forte, utilizzato di solito per far risaltare il tasto principale sullo schermo."
+ content-link-color: "Colore del carattere della maggior parte dei collegamenti."
+ primary-color: "Colore principale."
+ primary-color-dark: "In genere una versione più scura del colore principale utilizzato per effetti hover."
header-item-bg-hover-color: "Colore dello sfondo degli elementi cliccabili nelle intestazioni al passaggio del mouse."
header-item-font-color: "Colore del carattere degli elementi cliccabili nelle intestazioni."
header-item-font-hover-color: "Colore del carattere degli elementi cliccabili nelle intestazioni al passaggio del mouse."
@@ -64,11 +67,11 @@ it:
upgrade_to_ee: "Aggiorna a Enterprise edition"
add_token: "Carica un token di assistenza per Enterprise edition"
delete_token_modal:
- text: "Vuoi davvero rimuovere il token Enterprise edition attualmente utilizzato?"
+ text: "Vuoi davvero rimuovere il token Enterprise Edition attualmente utilizzato?"
title: "Elimina token"
replace_token: "Sostituisci il token di assistenza attuale"
order: "Ordina l'edizione Enterprise on-premises"
- paste: "Incolla il tuo token di assistenza per Enterprise edition"
+ paste: "Incolla il tuo token di assistenza per Enterprise Edition"
required_for_feature: "Questa aggiunta è disponibile solo con un token di assistenza Enterprise Edition attivo."
enterprise_link: "Per ulteriori informazioni, clicca qui."
start_trial: "Inizia la prova gratuita"
@@ -692,7 +695,7 @@ it:
confirmation: "non coincide con %{attribute}."
could_not_be_copied: "%{dependency} non può essere (completamente) copiato."
does_not_exist: "non esiste."
- error_enterprise_only: "%{action} è disponibile solo in OpenProject Enterprise edition"
+ error_enterprise_only: "%{action} è disponibile solo in OpenProject Enterprise Edition"
error_unauthorized: "potrebbe non essere accessibile."
error_readonly: "è in sola lettura, pertanto non è stato possibile modificarlo."
error_conflict: "L'informazione è stata aggiornata da almeno un altro utente nel frattempo."
@@ -1423,7 +1426,7 @@ it:
error_cookie_missing: "Il cookie di OpenProject è mancante. Prego, verifica che i cookie siano attivati, questa applicazione non funziona correttamente senza."
error_custom_option_not_found: "L'opzione non esiste."
error_enterprise_activation_user_limit: "Il tuo account potrebbe non essere attivo (raggiunto il limite utente). Si prega di contattare l'amministratore per ottenere l'accesso."
- error_enterprise_token_invalid_domain: "L'Enterprise edition non è attiva. Il dominio del token Enterprise (%{actual}) non corrisponde al nome host del sistema (%{expected})."
+ error_enterprise_token_invalid_domain: "L'Enterprise Edition non è attiva. Il dominio del token Enterprise (%{actual}) non corrisponde al nome host del sistema (%{expected})."
error_failed_to_delete_entry: "Cancellazione voce non riuscita."
error_in_dependent: "Errore nel tentativo di modificare l'oggetto dipendente: %{dependent_class} #%{related_id} - %{related_subject}: %{error}"
error_in_new_dependent: "Errore nel tentativo di creare un oggetto dipendente: %{dependent_class} - %{related_subject}: %{error}"
@@ -1519,14 +1522,13 @@ it:
blocks:
community: "Comunità di OpenProject"
upsale:
- title: "Aggiorna ad Enterprise edition"
+ title: "Aggiorna ad Enterprise Edition"
more_info: "Altre informazioni"
links:
- upgrade_enterprise_edition: "Aggiorna ad Enterprise edition"
+ upgrade_enterprise_edition: "Aggiorna ad Enterprise Edition"
postgres_migration: "Migrazione dell'installazione su PostgreSQL"
user_guides: "Guide utente"
faq: "FAQ"
- impressum: "Note legali"
glossary: "Glossario"
shortcuts: "Tasti di scelta rapida"
blog: "Blog di OpenProject"
@@ -1806,7 +1808,7 @@ it:
label_enumerations: "Enumerazioni"
label_enterprise: "Enterprise"
label_enterprise_active_users: "%{current}/%{limit} utenti attivi riservati"
- label_enterprise_edition: "Enterprise edition"
+ label_enterprise_edition: "Enterprise Edition"
label_enterprise_support: "Supporto per Imprese"
label_enterprise_addon: "Componente aggiuntivo Enterprise"
label_environment: "Ambiente"
@@ -1858,6 +1860,7 @@ it:
label_subject_or_id: "Oggetto o ID"
label_calendar_subscriptions: "Iscrizioni calendario"
label_identifier: "Identificatore"
+ label_impressum: "Note legali"
label_in: "in"
label_in_less_than: "in meno di"
label_in_more_than: "in più di"
diff --git a/config/locales/crowdin/ja.yml b/config/locales/crowdin/ja.yml
index 9a0640de7513..84af79c1ca2c 100644
--- a/config/locales/crowdin/ja.yml
+++ b/config/locales/crowdin/ja.yml
@@ -26,14 +26,15 @@ ja:
no_results_title_text: この期間内にプロジェクトの活動はありませんでした。
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: 現在利用可能なプラグインはありません。
custom_styles:
color_theme: "カラーテーマ"
color_theme_custom: "(カスタム)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "代替"
+ content-link-color: "リンクの色"
+ primary-color: "プライマリ"
+ primary-color-dark: "プライマリ(ダーク)"
header-bg-color: "ヘッダの背景"
header-item-bg-hover-color: "ホバー時のヘッダの背景"
header-item-font-color: "ヘッダのフォント"
@@ -52,8 +53,10 @@ ja:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "色の選択オプションを編集"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "強力なアクセントカラー。通常、画面の最も重要なボタンに使用されます。"
+ content-link-color: "大部分のリンクのフォント色。"
+ primary-color: "メインの色。"
+ primary-color-dark: "ホバー効果に使用する、メインの色の暗いバージョンです。"
header-item-bg-hover-color: "クリック可能なヘッダー項目にマウスを置いたときの背景色。"
header-item-font-color: "クリック可能なヘッダー項目のフォント色。"
header-item-font-hover-color: "クリック可能なヘッダー項目にマウスを置いたときのフォント色。"
@@ -1498,7 +1501,6 @@ ja:
postgres_migration: "PostgreSQL にインストールを移行しています"
user_guides: "ユーザーガイド"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "用語集"
shortcuts: "ショートカット"
blog: "OpenProject ブログ"
@@ -1830,6 +1832,7 @@ ja:
label_subject_or_id: "タイトルまたはID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "法的情報"
label_in: "今日から○日後"
label_in_less_than: "今日から○日後以前"
label_in_more_than: "今日から○日後以降"
diff --git a/config/locales/crowdin/js-ca.yml b/config/locales/crowdin/js-ca.yml
index c86722c18d4a..fa921b0a9f18 100644
--- a/config/locales/crowdin/js-ca.yml
+++ b/config/locales/crowdin/js-ca.yml
@@ -102,7 +102,7 @@ ca:
button_save: "Desa"
button_settings: "Configuració"
button_uncheck_all: "Desmarca-ho tot"
- button_update: "Actualitza"
+ button_update: "Actualitzar"
button_export-pdf: "Descarregar PDF"
button_export-atom: "Descarregar Atom"
button_create: "Crear"
@@ -758,7 +758,7 @@ ca:
label: "Pausa els correu electrònic recordatori temporalment"
first_day: "Primer dia"
last_day: "Últim dia"
- text_are_you_sure: "N'esteu segur?"
+ text_are_you_sure: "N'estas segur?"
text_data_lost: "Totes les dades entrades es perdran."
text_user_wrote: "%{value} wrote:"
types:
diff --git a/config/locales/crowdin/js-cs.yml b/config/locales/crowdin/js-cs.yml
index f7ec87369d5b..4ed8528fbfd2 100644
--- a/config/locales/crowdin/js-cs.yml
+++ b/config/locales/crowdin/js-cs.yml
@@ -494,7 +494,7 @@ cs:
label_sort_lower: "Přesunout níž"
label_sorting: "Řazení"
label_spent_time: "Strávený čas"
- label_star_query: "Oblíbená"
+ label_star_query: "Oblíbené"
label_press_enter_to_save: "Stiskněte Enter pro uložení."
label_public_query: "Veřejné"
label_sum: "Suma"
@@ -756,7 +756,7 @@ cs:
membership_updated: "Členství bylo aktualizováno"
title: "E-mail upozornění "
pause:
- label: "Dočasně pozastavit denní připomenutí e-mailem"
+ label: "Dočasně pozastavit denní posílání oznámení e-mailem"
first_day: "První den"
last_day: "Poslední den"
text_are_you_sure: "Jste si jisti?"
diff --git a/config/locales/crowdin/js-de.yml b/config/locales/crowdin/js-de.yml
index 6c18ece1514a..7295015b48f3 100644
--- a/config/locales/crowdin/js-de.yml
+++ b/config/locales/crowdin/js-de.yml
@@ -231,8 +231,8 @@ de:
status_label: "Status: "
status_confirmed: "bestätigt"
status_waiting: "E-Mail gesendet - Warten auf Bestätigung"
- test_ee: "Testen Sie die Enterprise edition 14 Tage kostenlos"
- quick_overview: "Erhalten Sie einen schnellen Überblick über Projektmanagement und Teamzusammenarbeit mit der OpenProject Enterprise edition."
+ test_ee: "Testen Sie die Enterprise Edition 14 Tage kostenlos"
+ quick_overview: "Erhalten Sie einen schnellen Überblick über Projektmanagement und Teamzusammenarbeit mit der OpenProject Enterprise Edition."
upsale:
become_hero: "Werde zum Held!"
enterprise_info_html: "%{feature_title} ist ein Enterprise Add-on."
@@ -258,7 +258,7 @@ de:
text: >
Die OpenProject Enterprise Edition baut auf der Community Edition auf. Sie umfasst Enterprise Add-ons und professionelle Unterstützung und richtet sich primär an Organisationen mit mehr als 10 Benutzern, die unternehmenskritische Projekte mit OpenProject verwalten.
unlimited: "Unbegrenzt"
- you_contribute: "Auch Software-Entwickler müssen ihre Rechnungen bezahlen. Durch ein Upgrade auf die Enterprise edition unterstützen Sie diese Open-Source-Community und tragen zur Entwicklung, Wartung und kontinuierlichen Verbesserung von OpenProject bei."
+ you_contribute: "Auch Software-Entwickler müssen ihre Rechnungen bezahlen. Durch ein Upgrade auf die Enterprise Edition unterstützen Sie diese Open-Source-Community und tragen zur Entwicklung, Wartung und kontinuierlichen Verbesserung von OpenProject bei."
working_days:
calendar:
empty_state_header: "Arbeitsfreie Tage"
@@ -1083,7 +1083,7 @@ de:
upsale:
attribute_highlighting: "Sollen bestimmte Arbeitspakete aus der Menge herausstechen?"
relation_columns: "Möchten Sie Beziehungen als Spalten in der Arbeitspaketliste sehen können?"
- check_out_link: "Schauen Sie sich die Enterprise edition an."
+ check_out_link: "Schauen Sie sich die Enterprise Edition an."
relation_filters:
filter_work_packages_by_relation_type: "Arbeitspakete nach Beziehungs-Typ filtern"
tabs:
@@ -1230,7 +1230,7 @@ de:
title: "Platzhalter-Benutzer"
title_no_ee: "Platzhalter-Benutzer (Enterprise Edition Add-on)"
description: "Hat keinen Zugriff auf das Projekt und es werden keine E-Mails verschickt."
- description_no_ee: 'Hat keinen Zugriff auf das Projekt und es werden keine E-Mails versendet. Schau dir die Enterprise edition an'
+ description_no_ee: 'Hat keinen Zugriff auf das Projekt und es werden keine E-Mails versendet. Schau dir die Enterprise Edition an'
principal:
label:
name_or_email: "Name oder E-Mail-Adresse"
diff --git a/config/locales/crowdin/js-fr.yml b/config/locales/crowdin/js-fr.yml
index 92c3a69bee02..9aae512eab97 100644
--- a/config/locales/crowdin/js-fr.yml
+++ b/config/locales/crowdin/js-fr.yml
@@ -1275,7 +1275,7 @@ fr:
all: "Tous les projets"
selected: "Uniquement la sélection"
search_placeholder: "Rechercher un projet..."
- include_subprojects: "inclure tous les sous-projets"
+ include_subprojects: "Inclure tous les sous-projets"
tooltip:
include_all_selected: "Projet déjà inclus puisque Include tous les sous-projets sont activés."
current_project: "Ceci est le projet dans lequel vous vous trouvez actuellement."
diff --git a/config/locales/crowdin/js-id.yml b/config/locales/crowdin/js-id.yml
index 533c3e629e76..f93b178aba67 100644
--- a/config/locales/crowdin/js-id.yml
+++ b/config/locales/crowdin/js-id.yml
@@ -102,7 +102,7 @@ id:
button_save: "Simpan"
button_settings: "Pengaturan"
button_uncheck_all: "Uncek semua"
- button_update: "Update"
+ button_update: "Perbarui"
button_export-pdf: "Download PDF"
button_export-atom: "Download Atom"
button_create: "Buat baru"
diff --git a/config/locales/crowdin/js-it.yml b/config/locales/crowdin/js-it.yml
index c22186a85fc3..d065a5fc57a7 100644
--- a/config/locales/crowdin/js-it.yml
+++ b/config/locales/crowdin/js-it.yml
@@ -232,7 +232,7 @@ it:
status_label: "Stato:"
status_confirmed: "confermato"
status_waiting: "email inviata, in attesa di conferma"
- test_ee: "Prova l'Enterprise edition gratuitamente per 14 giorni"
+ test_ee: "Prova l'Enterprise Edition gratuitamente per 14 giorni"
quick_overview: "Veloce panoramica sulla gestione dei progetti e il lavoro di squadra nell'edizione OpenProject Enterprise."
upsale:
become_hero: "Diventa un eroe!"
diff --git a/config/locales/crowdin/js-no.yml b/config/locales/crowdin/js-no.yml
index 4c8e7b5d81f7..68608cc4ef3e 100644
--- a/config/locales/crowdin/js-no.yml
+++ b/config/locales/crowdin/js-no.yml
@@ -102,7 +102,7 @@
button_save: "Lagre"
button_settings: "Innstillinger"
button_uncheck_all: "Avmerk alle"
- button_update: "Oppdatèr"
+ button_update: "Oppdater"
button_export-pdf: "Last ned PDF"
button_export-atom: "Last ned Atom"
button_create: "Opprett"
diff --git a/config/locales/crowdin/js-ru.yml b/config/locales/crowdin/js-ru.yml
index 2167ae44759d..6a42f90b3e74 100644
--- a/config/locales/crowdin/js-ru.yml
+++ b/config/locales/crowdin/js-ru.yml
@@ -102,7 +102,7 @@ ru:
button_save: "Сохранить"
button_settings: "Настройки"
button_uncheck_all: "Снять все отметки"
- button_update: "Обновление"
+ button_update: "Обновить"
button_export-pdf: "Скачать PDF"
button_export-atom: "Скачать Atom"
button_create: "Создать"
diff --git a/config/locales/crowdin/js-vi.yml b/config/locales/crowdin/js-vi.yml
index 6d180c21d8bb..cdd5019e62ef 100644
--- a/config/locales/crowdin/js-vi.yml
+++ b/config/locales/crowdin/js-vi.yml
@@ -102,7 +102,7 @@ vi:
button_save: "Lưu"
button_settings: "Cài đặt"
button_uncheck_all: "Bỏ chọn tất cả"
- button_update: "Cập Nhật"
+ button_update: "Cập nhật"
button_export-pdf: "Tải PDF"
button_export-atom: "Tải về Atom"
button_create: "Tạo mới"
diff --git a/config/locales/crowdin/js-zh-CN.yml b/config/locales/crowdin/js-zh-CN.yml
index 3fdeb85b1c1a..4736940e80aa 100644
--- a/config/locales/crowdin/js-zh-CN.yml
+++ b/config/locales/crowdin/js-zh-CN.yml
@@ -568,7 +568,7 @@ zh-CN:
wiki: "在 维基 中,您可以记录并与您的团队共享知识。"
backlogs:
overview: "在待办清单视图中管理您的工作。"
- sprints: "右侧为产品待办清单和缺陷待办清单,左侧为各自的冲刺 (Sprint)。在这里,您可以创建长篇故事、用户故事和错误,通过拖放来确定优先级,以及将它们添加到冲刺 (sprint) 中。"
+ sprints: "右侧为产品待办清单和缺陷待办清单,左侧为各自的冲刺 (Sprint)。在这里,您可以创建史诗、用户故事和缺陷,通过拖放来确定优先级,以及将它们添加到冲刺 (Sprint) 中。"
task_board_arrow: "要查看您的任务面板,请打开冲刺 (sprint) 下拉菜单…"
task_board_select: "…并选择任务面板条目。"
task_board: "任务面板可以将此冲刺 (sprint) 的进度可视化。点击用户故事旁边的加号 (+) 图标可添加新任务或障碍。 状态可以通过拖放更新。"
@@ -587,10 +587,10 @@ zh-CN:
gantt_menu: "使用甘特图模块轻松创建项目时间表和时间线。"
timeline: "您可以在此编辑您的项目计划、创建新的工作包(例如任务、里程碑、阶段等)以及添加依赖项。所有团队成员都可以随时查看和更新最新计划。"
team_planner:
- overview: "团队规划工具使您可以直观地为团队成员分配任务,并全面了解哪些成员正在处理哪些工作。"
+ overview: "工作组规划器使您可以直观地为团队成员分配任务,并全面了解哪些成员正在处理哪些工作。"
calendar: "单周或双周规划面板可以显示分配给您的团队成员的所有工作包。"
add_assignee: "首先,请将受理人添加到工作组规划器。"
- add_existing: "搜索现有工作包并将其拖动到团队规划工具,以立即将其分配给团队成员并定义开始日期和结束日期。"
+ add_existing: "搜索现有工作包并将其拖动到工作组规划器,以立即将其分配给团队成员并定义开始日期和结束日期。"
card: "水平拖动工作包以前移或后移其时间,拖动边缘以更改开始日期和结束日期,甚至可以将其垂直拖动到不同的行以分配给其他成员。"
notifications:
title: "通知"
@@ -750,7 +750,7 @@ zh-CN:
wiki_page_added: "添加维基页面"
wiki_page_updated: "更新维基页面"
membership_added: "添加成员"
- membership_updated: "更新成员"
+ membership_updated: "成员已更新"
title: "电子邮件提醒"
pause:
label: "临时暂停每日电子邮件提醒"
@@ -1225,9 +1225,9 @@ zh-CN:
description: "基于所选项目中所分配角色的权限"
placeholder:
title: "占位符用户"
- title_no_ee: "占位符用户(Enterprise edition 特定功能)"
+ title_no_ee: "占位符用户(Enterprise edition 附加功能)"
description: "无法访问该项目并且未发送电子邮件。"
- description_no_ee: '无法访问该项目并且未发送电子邮件。 请参见 Enterprise edition'
+ description_no_ee: '由于没有访问项目的权限,所以不会发送电子邮件。 请查看企业版。'
principal:
label:
name_or_email: "用户名或电子邮件地址"
diff --git a/config/locales/crowdin/js-zh-TW.yml b/config/locales/crowdin/js-zh-TW.yml
index f6ff00ebd067..d7ffaadc7de2 100644
--- a/config/locales/crowdin/js-zh-TW.yml
+++ b/config/locales/crowdin/js-zh-TW.yml
@@ -288,7 +288,7 @@ zh-TW:
filter:
more_values_not_shown: "There are %{total} more results, search to filter results."
description:
- text_open_filter: "使用 ALT 和方向鍵打開此篩選器。"
+ text_open_filter: "使用 ALT 和方向鍵打開此篩選條件。"
text_close_filter: "要選擇條目離開焦點例如按輸入。離開沒有篩選器的情況下選擇的第一個 (空) 條目。"
noneElement: "(無)"
time_zone_converted:
@@ -677,13 +677,13 @@ zh-TW:
watched: "監看者\n"
work_package_commented: "有新留言"
work_package_created: "新增工作項目"
- work_package_processed: "所有狀態改變"
- work_package_prioritized: "優先順序已變更"
- work_package_scheduled: "所有日期變更"
+ work_package_processed: "狀態改變(所有)"
+ work_package_prioritized: "更改優先順序"
+ work_package_scheduled: "日期變更(所有)"
global:
immediately:
title: "參與中"
- description: "你參與的工作項目中所有活動的通知(執行者、負責人或監看者)。"
+ description: "你參與的工作項目中所有活動的通知(執行者、負責人或監督人)。"
delayed:
title: "非參與中"
description: "所有項目活動的額外通知。"
@@ -824,7 +824,7 @@ zh-TW:
add_parent: "增加現有的上一層"
add_new_child: "建立子工作項目"
create_new: "新增"
- add_existing: "添加現有的"
+ add_existing: "增加已有的"
add_existing_child: "加入現有子項目"
remove_child: "移除子項目"
add_new_relation: "建立新關聯"
diff --git a/config/locales/crowdin/ka.yml b/config/locales/crowdin/ka.yml
index f7c0e9e09ac7..6517c6cd42a0 100644
--- a/config/locales/crowdin/ka.yml
+++ b/config/locales/crowdin/ka.yml
@@ -26,14 +26,15 @@ ka:
no_results_title_text: There has not been any activity for the project within this time frame.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: There are currently no plugins available.
custom_styles:
color_theme: "ფერის სქემა"
color_theme_custom: "(მომხმარებლის)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "ალტერნატივა"
+ content-link-color: "ბმულის ფონტი"
+ primary-color: "ძირითადი"
+ primary-color-dark: "ძირითადი (მუქი)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "თავსართის ფონტი"
@@ -52,8 +53,10 @@ ka:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Edit color select options"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Font color of most of the links."
+ primary-color: "მთავარი ფერი."
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1529,7 +1532,6 @@ ka:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "მომხმარებლის სახელმძღვანელო"
faq: "ხდკ"
- impressum: "Legal notice"
glossary: "ლექსიკონი"
shortcuts: "მალსახმობები"
blog: "OpenProject blog"
@@ -1861,6 +1863,7 @@ ka:
label_subject_or_id: "სათაური ან ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "იურიდიული გაფრთხილება"
label_in: "სად"
label_in_less_than: "ნაკლებია, ვიდრე"
label_in_more_than: "მეტია, ვიდრე"
diff --git a/config/locales/crowdin/kk.yml b/config/locales/crowdin/kk.yml
index 158244ecc038..f2562d6c521a 100644
--- a/config/locales/crowdin/kk.yml
+++ b/config/locales/crowdin/kk.yml
@@ -26,14 +26,15 @@ kk:
no_results_title_text: There has not been any activity for the project within this time frame.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: There are currently no plugins available.
custom_styles:
color_theme: "Color theme"
color_theme_custom: "(Custom)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternative"
+ content-link-color: "Link font"
+ primary-color: "Primary"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ kk:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Edit color select options"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Font color of most of the links."
+ primary-color: "Main color."
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1529,7 +1532,6 @@ kk:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "User guides"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glossary"
shortcuts: "Shortcuts"
blog: "OpenProject blog"
@@ -1861,6 +1863,7 @@ kk:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "in"
label_in_less_than: "in less than"
label_in_more_than: "in more than"
diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml
index 91276e68e491..5d5239f9e901 100644
--- a/config/locales/crowdin/ko.yml
+++ b/config/locales/crowdin/ko.yml
@@ -26,14 +26,15 @@ ko:
no_results_title_text: 이 시간 프레임 내에서 프로젝트에 대한 활동이 없습니다.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: 사용 가능한 플러그인이 없습니다.
custom_styles:
color_theme: "컬러 테마"
color_theme_custom: "(사용자 지정)"
colors:
- primary-button-color: "기본 버튼"
- accent-color: "강조 색"
+ alternative-color: "대안"
+ content-link-color: "링크 글꼴"
+ primary-color: "기본"
+ primary-color-dark: "기본(진함)"
header-bg-color: "헤더 배경"
header-item-bg-hover-color: "가리킬 때 헤더 배경"
header-item-font-color: "헤더 글꼴"
@@ -52,8 +53,10 @@ ko:
enterprise_more_info: "참고: 사용된 로그는 공개적으로 액세스 가능합니다."
manage_colors: "색상 선택 옵션 편집"
instructions:
- primary-button-color: "강한 강조 색은 화면의 가장 중요한 버튼에 사용됩니다."
- accent-color: "링크 및 기타 적절하게 강조 표시된 요소의 색상을 지정하세요."
+ alternative-color: "강한 강조 색은 일반적으로 화면의 가장 중요한 버튼에 사용됩니다."
+ content-link-color: "대부분 링크의 글꼴색입니다."
+ primary-color: "주 색상"
+ primary-color-dark: "일반적으로 메인 색상의 어두운 버전은 호버 효과에 사용됩니다."
header-item-bg-hover-color: "마우스로 가리킬 때 클릭 가능한 헤더 항목의 배경색입니다."
header-item-font-color: "클릭 가능한 헤더 항목의 글꼴색입니다."
header-item-font-hover-color: "마우스로 가리킬 때 클릭 가능한 헤더 항목의 글꼴색입니다."
@@ -1501,7 +1504,6 @@ ko:
postgres_migration: "설치를 PostgreSQL로 마이그레이션"
user_guides: "사용자 가이드"
faq: "FAQ"
- impressum: "법적 고지"
glossary: "용어집"
shortcuts: "바로가기 "
blog: "OpenProject 블로그"
@@ -1833,6 +1835,7 @@ ko:
label_subject_or_id: "제목 또는 ID"
label_calendar_subscriptions: "캘린더 구독"
label_identifier: "식별자"
+ label_impressum: "법적 고지"
label_in: "-"
label_in_less_than: "보다 작음"
label_in_more_than: "보다 큼"
diff --git a/config/locales/crowdin/lt.yml b/config/locales/crowdin/lt.yml
index cb7326da7470..973561c89e09 100644
--- a/config/locales/crowdin/lt.yml
+++ b/config/locales/crowdin/lt.yml
@@ -26,14 +26,15 @@ lt:
no_results_title_text: Šiuo periodu projekte nieko neįvyko.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Nėra jokių pasiekiamų plėtinių.
custom_styles:
color_theme: "Spalvų tema"
color_theme_custom: "(Pasirinktinis)"
colors:
- primary-button-color: "Pagrindinis mygtukas"
- accent-color: "Akcentas"
+ alternative-color: "Alternatyva"
+ content-link-color: "Nuorodų šriftas"
+ primary-color: "Pagrindinė"
+ primary-color-dark: "Pagrindinė (tamsi)"
header-bg-color: "Antraštės fonas"
header-item-bg-hover-color: "Atraštės fonas užvedus pelę"
header-item-font-color: "Antraštės šriftas"
@@ -52,8 +53,10 @@ lt:
enterprise_more_info: "Pastaba: panaudotas logotipas bus viešai prieinamas."
manage_colors: "Redaguoti spalvos pasirinkimo variantus"
instructions:
- primary-button-color: "Stipraus akcento spalva, naudojama svarbiausiam ekrano mygtukui."
- accent-color: "Spalvos nuorodoms ir kitiems dalinai paryškintiems elementams."
+ alternative-color: "Stipri, akį rėžianti spalva, įprastai naudojama svarbiausiam mygtukui ekrane."
+ content-link-color: "Šrifto spalva daugeliui nuorodų."
+ primary-color: "Pagrindinė spalva."
+ primary-color-dark: "Įprastai tamsesnė pagrindinės spalvos atmaina naudojama žymeklio užvedimo efektui sukurti."
header-item-bg-hover-color: "Antraštės fono spalva galimiems paspausti antraštės įrašams, kai užvedama pelė."
header-item-font-color: "Šrifto spalva galimiems paspausti antraštės įrašams."
header-item-font-hover-color: "Šrifto spalva galimiems paspausti antraštės įrašams, kai užvedama pelė."
@@ -1580,7 +1583,6 @@ lt:
postgres_migration: "Migruojame jūsų instaliaciją į PostgreSQL"
user_guides: "Vartotojo vadovai"
faq: "D.U.K"
- impressum: "Teisinė informacija"
glossary: "Aiškinamasis terminų žodynas"
shortcuts: "Nuorodos"
blog: "OpenProject blogas"
@@ -1912,6 +1914,7 @@ lt:
label_subject_or_id: "Tema arba ID"
label_calendar_subscriptions: "Kalendoriaus prenumeratos"
label_identifier: "Identifikatorius"
+ label_impressum: "Teisinė informacija"
label_in: " "
label_in_less_than: "mažiau nei"
label_in_more_than: "daugiau nei"
diff --git a/config/locales/crowdin/lv.yml b/config/locales/crowdin/lv.yml
index 3721913af29a..8e1aea8d1550 100644
--- a/config/locales/crowdin/lv.yml
+++ b/config/locales/crowdin/lv.yml
@@ -26,14 +26,15 @@ lv:
no_results_title_text: There has not been any activity for the project within this time frame.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Pašlaik neviens paplašinājums nav pieejams.
custom_styles:
color_theme: "Color theme"
color_theme_custom: "(Custom)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternative"
+ content-link-color: "Link font"
+ primary-color: "Primary"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ lv:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Edit color select options"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Font color of most of the links."
+ primary-color: "Main color."
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1556,7 +1559,6 @@ lv:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "Lietotāja pamācības"
faq: "BUJ"
- impressum: "Legal notice"
glossary: "Kopsavilkums"
shortcuts: "Īsinājumtaustiņi"
blog: "OpenProject blog"
@@ -1888,6 +1890,7 @@ lv:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "in"
label_in_less_than: "in less than"
label_in_more_than: "in more than"
diff --git a/config/locales/crowdin/mn.yml b/config/locales/crowdin/mn.yml
index 22bf377518c4..c12a815510ec 100644
--- a/config/locales/crowdin/mn.yml
+++ b/config/locales/crowdin/mn.yml
@@ -26,14 +26,15 @@ mn:
no_results_title_text: There has not been any activity for the project within this time frame.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: There are currently no plugins available.
custom_styles:
color_theme: "Color theme"
color_theme_custom: "(Custom)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternative"
+ content-link-color: "Link font"
+ primary-color: "Primary"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ mn:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Edit color select options"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Font color of most of the links."
+ primary-color: "Main color."
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1529,7 +1532,6 @@ mn:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "User guides"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glossary"
shortcuts: "Shortcuts"
blog: "OpenProject blog"
@@ -1861,6 +1863,7 @@ mn:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "in"
label_in_less_than: "in less than"
label_in_more_than: "in more than"
diff --git a/config/locales/crowdin/ms.yml b/config/locales/crowdin/ms.yml
index c6207da9e6a5..370fb8000acc 100644
--- a/config/locales/crowdin/ms.yml
+++ b/config/locales/crowdin/ms.yml
@@ -26,14 +26,15 @@ ms:
no_results_title_text: There has not been any activity for the project within this time frame.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: There are currently no plugins available.
custom_styles:
color_theme: "Color theme"
color_theme_custom: "(Custom)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternatif"
+ content-link-color: "Link font"
+ primary-color: "Primary"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ ms:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Edit color select options"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Font color of most of the links."
+ primary-color: "Main color."
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1502,7 +1505,6 @@ ms:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "User guides"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glossary"
shortcuts: "Shortcuts"
blog: "OpenProject blog"
@@ -1834,6 +1836,7 @@ ms:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "in"
label_in_less_than: "in less than"
label_in_more_than: "in more than"
diff --git a/config/locales/crowdin/ne.yml b/config/locales/crowdin/ne.yml
index 57d5f5a4b33c..cfba25f9c756 100644
--- a/config/locales/crowdin/ne.yml
+++ b/config/locales/crowdin/ne.yml
@@ -26,14 +26,15 @@ ne:
no_results_title_text: यो अवधिमा आयोजनाको कुनै पनि क्रियाकलाप भएको छैन ।
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: हाल कुनै प्लगइनहरू उपलब्ध छैन।
custom_styles:
color_theme: "रंग विषयवस्तु"
color_theme_custom: "(अनुकूलन)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "वैकल्पिक"
+ content-link-color: "फन्ट लिंक गर्नुहोस् "
+ primary-color: "प्राथमिक"
+ primary-color-dark: "प्राथमिक (अँध्यारो)"
header-bg-color: "हेडर पृष्ठभूमि"
header-item-bg-hover-color: "होभरमा हेडर पृष्ठभूमि"
header-item-font-color: "हेडर फन्ट"
@@ -52,8 +53,10 @@ ne:
enterprise_more_info: "नोट: प्रयोग गरिएको लोगो सार्वजनिक रूपमा पहुँचयोग्य हुनेछ।"
manage_colors: "रङ चयन गर्न सकिने विकल्पहरू सम्पादन गर्नुहोस्"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "कडा उच्चारण रंग, सामान्यतया स्क्रिनमा सबै भन्दा महत्वपूर्ण बटन को लागी प्रयोग गरिने।"
+ content-link-color: "अधिकांश लिङ्कहरूको फन्ट रङ।"
+ primary-color: "मुख्य रंग "
+ primary-color-dark: "सामान्यतया मुख्य रंगको गाढा संस्करण होभर प्रभावहरूको लागि प्रयोग गरिन्छ।"
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1529,7 +1532,6 @@ ne:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "User guides"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glossary"
shortcuts: "Shortcuts"
blog: "OpenProject blog"
@@ -1861,6 +1863,7 @@ ne:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "in"
label_in_less_than: "in less than"
label_in_more_than: "in more than"
diff --git a/config/locales/crowdin/nl.yml b/config/locales/crowdin/nl.yml
index 1ca44d2ae962..dfa29b939aac 100644
--- a/config/locales/crowdin/nl.yml
+++ b/config/locales/crowdin/nl.yml
@@ -26,14 +26,15 @@ nl:
no_results_title_text: Er is geen activiteit voor deze projecten binnen deze periode.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Er zijn momenteel geen plugins beschikbaar.
custom_styles:
color_theme: "Kleurenschema"
color_theme_custom: "(Custom)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternatief"
+ content-link-color: "Link font"
+ primary-color: "Primary"
+ primary-color-dark: "Primary (Donker)"
header-bg-color: "Koptekst achtergrond"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Lettertype koptekst"
@@ -52,8 +53,10 @@ nl:
enterprise_more_info: "Opmerking: het gebruikte logo is openbaar toegankelijk."
manage_colors: "Bewerk de kleur selectie opties"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Sterke accentkleur, meestal gebruikt voor de belangrijkste knop op een scherm."
+ content-link-color: "De kleur van het lettertype van de meeste van de links."
+ primary-color: "Hoofdkleur."
+ primary-color-dark: "Meestal een donkere versie van de belangrijkste kleur die gebruikt wordt voor hover-effecten."
header-item-bg-hover-color: "De achtergrondkleur van klikbare header items wanneer deze aangewezen door de muis."
header-item-font-color: "De lettertypekleur van klikbare header items."
header-item-font-hover-color: "De achtergrondkleur van klikbare header items wanneer deze aangewezen worden door de muis."
@@ -1526,7 +1529,6 @@ nl:
postgres_migration: "Uw installatie overzetten naar PostgreSQL"
user_guides: "Gebruikershandleidingen"
faq: "Veelgestelde vragen (FAQ)"
- impressum: "Legal notice"
glossary: "Woordenlijst"
shortcuts: "Snelkoppelingen"
blog: "OpenProject blog"
@@ -1858,6 +1860,7 @@ nl:
label_subject_or_id: "Onderwerp of ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Juridische mededeling"
label_in: "in"
label_in_less_than: "in minder dan"
label_in_more_than: "in meer dan"
diff --git a/config/locales/crowdin/no.yml b/config/locales/crowdin/no.yml
index bf6a571211c7..e7e0bb73db12 100644
--- a/config/locales/crowdin/no.yml
+++ b/config/locales/crowdin/no.yml
@@ -26,14 +26,15 @@
no_results_title_text: Det har ikke vært noen aktivitet i dette prosjektet i valgt periode
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Det er for tiden ingen utvidelser tilgjengelig
custom_styles:
color_theme: "Fargetema"
color_theme_custom: "Egendefinert"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternativ"
+ content-link-color: "Lenkefarge"
+ primary-color: "Primær"
+ primary-color-dark: "Primær (mørk)"
header-bg-color: "Topp bakgrunn"
header-item-bg-hover-color: "Topp bakgrunn på hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@
enterprise_more_info: "Merk: den brukte logoen vil være offentlig tilgjengelig."
manage_colors: "Endre alternativer for fargevalg"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Sterk aksentfarge, vanligvis brukt på den viktigste knappen på en skjerm."
+ content-link-color: "Skriftfarge til de fleste lenker."
+ primary-color: "Hovedfarge."
+ primary-color-dark: "Typisk en mørkere versjon av hovedfargen som brukes for effekter ved peking."
header-item-bg-hover-color: "Bakgrunnsfarge for klikkbare toppelementer når du peker med musen."
header-item-font-color: "Skriftfarge på klikkbare toppelementer."
header-item-font-hover-color: "Skriftfarge for klikkbare toppelementer når du peker med musen."
@@ -1529,7 +1532,6 @@
postgres_migration: "Overføre installasjonen til PostgreSQL"
user_guides: "Brukerveiledning"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Ordliste"
shortcuts: "Snarveier"
blog: "OpenProject blogg"
@@ -1861,6 +1863,7 @@
label_subject_or_id: "Emne eller ID"
label_calendar_subscriptions: "Abonnementer til kalendere"
label_identifier: "Identifikator"
+ label_impressum: "Juridisk merknad"
label_in: "i"
label_in_less_than: "i mindre enn"
label_in_more_than: "i mer enn"
diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml
index 7d7a44be4ff0..2827acd6f4fa 100644
--- a/config/locales/crowdin/pl.yml
+++ b/config/locales/crowdin/pl.yml
@@ -26,14 +26,15 @@ pl:
no_results_title_text: W tym okresie nie było żadnych działań związanych z projektem.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Aktualnie nie ma dostępnych żadnych dodatków.
custom_styles:
color_theme: "Kolor motywu"
color_theme_custom: "(Niestandardowe)"
colors:
- primary-button-color: "Przycisk główny"
- accent-color: "Akcent"
+ alternative-color: "Alternatywny"
+ content-link-color: "Czcionka linków"
+ primary-color: "Główny"
+ primary-color-dark: "Główny (ciemny)"
header-bg-color: "Tło nagłówka"
header-item-bg-hover-color: "Tło nagłowka po najechaniu myszą"
header-item-font-color: "Czcionka nagłówka"
@@ -52,8 +53,10 @@ pl:
enterprise_more_info: "Uwaga: użyte logo będzie ogólnodostępne."
manage_colors: "Edytuj kolor wybranych opcji"
instructions:
- primary-button-color: "Silnie zaakcentowany kolor, stosowany do najważniejszego przycisku na ekranie."
- accent-color: "Kolor linków i innych ostatnio wyróżnionych elementów."
+ alternative-color: "Silnie zaakcentowany kolor, zazwyczaj stosowany do najważniejszego przycisku na ekranie."
+ content-link-color: "Kolor czcionki większości linków."
+ primary-color: "Główny kolor."
+ primary-color-dark: "Zwykle ciemniejsza wersja głównego koloru, używana dla efektów po najechaniu kursorem."
header-item-bg-hover-color: "Kolor tła nagłówkowych elementów po najechaniu myszą."
header-item-font-color: "Kolor czcionki elementów nagłówkowych."
header-item-font-hover-color: "Kolor czcionki elementów nagłówkowych po najechaniu myszą."
@@ -694,7 +697,7 @@ pl:
confirmation: "nie pasuje do %{attribute}."
could_not_be_copied: "Nie można było (w pełni) skopiować %{dependency}."
does_not_exist: "nie istnieje."
- error_enterprise_only: "%{action} jest dostępna tylko w OpenProject Enterprise edition"
+ error_enterprise_only: "%{action} jest dostępna tylko w OpenProject Enterprise Edition"
error_unauthorized: "— nie można uzyskac dostępu."
error_readonly: "— podjęto próbę zapisu, ale nie jest zapisywalny."
error_conflict: "Information has been updated by at least one other user in the meantime."
@@ -1580,7 +1583,6 @@ pl:
postgres_migration: "Migrowanie instalacji do PostgreSQL"
user_guides: "Przewodniki"
faq: "Najczęściej Zadawane Pytania"
- impressum: "Informacje prawne"
glossary: "Słownik"
shortcuts: "Podpowiedzi"
blog: "Blog OpenProject"
@@ -1912,6 +1914,7 @@ pl:
label_subject_or_id: "Temat lub identyfikator"
label_calendar_subscriptions: "Subskrypcje Kalendarza"
label_identifier: "Identyfikator"
+ label_impressum: "Informacje prawne"
label_in: "w"
label_in_less_than: "w mniej niż"
label_in_more_than: "w ponad"
@@ -3025,7 +3028,7 @@ pl:
text_work_packages_ref_in_commit_messages: "Odwołania i poprawki do pakietów roboczych w wiadomościach o zmianach"
text_journal_added: "%{label} %{value} added"
text_journal_attachment_added: "%{label} %{value} dodano jako załącznik"
- text_journal_attachment_deleted: "%{label} %{value} usunięto jako załącznik"
+ text_journal_attachment_deleted: "%{label} %{old} usunięto jako załącznik"
text_journal_changed_plain: "%{label} zmieniono z %{old} %{linebreak}na %{new}"
text_journal_changed_no_detail: "%{label} updated"
text_journal_changed_with_diff: "%{label} changed (%{link})"
@@ -3258,7 +3261,7 @@ pl:
non_working: "%{day} jest teraz dniem nieroboczym"
dates:
working: "%{day} jest teraz roboczym"
- non_working: "%{day} jest teraz wolnym od pracy"
+ non_working: "%{date} jest teraz wolnym od pracy"
nothing_to_preview: "Nie ma nic do podglądu"
api_v3:
attributes:
diff --git a/config/locales/crowdin/pt-BR.yml b/config/locales/crowdin/pt-BR.yml
index 9145b48a337e..07a74a345516 100644
--- a/config/locales/crowdin/pt-BR.yml
+++ b/config/locales/crowdin/pt-BR.yml
@@ -26,14 +26,15 @@ pt:
no_results_title_text: Não há nenhuma atividade no projeto neste período de tempo.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Atualmente, não existem plugins disponíveis.
custom_styles:
color_theme: "Tema Colorido"
color_theme_custom: "(Personalizado)"
colors:
- primary-button-color: "Botão primário"
- accent-color: "Destaque"
+ alternative-color: "Alternativo"
+ content-link-color: "Fonte do link"
+ primary-color: "Primário"
+ primary-color-dark: "Primário (escuro)"
header-bg-color: "Fundo do cabeçalho"
header-item-bg-hover-color: "Fundo do cabeçalho ao passar o mouse"
header-item-font-color: "Fonte do cabeçalho"
@@ -52,8 +53,10 @@ pt:
enterprise_more_info: "Obs.: o logotipo usado pode ser acessado publicamente."
manage_colors: "Editar opções de seleção de cor"
instructions:
- primary-button-color: "Cor de destaque forte, usada para o botão mais importante na tela."
- accent-color: "Cor para os links e outros elementos destacados adequadamente."
+ alternative-color: "Cor de destaque forte, normalmente usada para o botão mais importante na tela."
+ content-link-color: "Cor da fonte da maioria dos links."
+ primary-color: "Cor principal."
+ primary-color-dark: "Normalmente, uma versão mais escura da cor principal usada para efeitos de foco."
header-item-bg-hover-color: "Cor de fundo dos itens clicáveis do cabeçalho ao passar o mouse sobre eles."
header-item-font-color: "Cor da fonte dos itens clicáveis do cabeçalho."
header-item-font-hover-color: "Cor da fonte dos itens clicáveis do cabeçalho ao passar o mouse sobre eles."
@@ -1528,7 +1531,6 @@ pt:
postgres_migration: "Migrando sua instalação para PostgreSQL"
user_guides: "Guias do usuário"
faq: "Perguntas Freqüentes"
- impressum: "Aviso legal"
glossary: "Glossário"
shortcuts: "Atalhos"
blog: "Blog do OpenProject"
@@ -1860,6 +1862,7 @@ pt:
label_subject_or_id: "Assunto ou ID"
label_calendar_subscriptions: "Assinaturas do calendários"
label_identifier: "Identificador"
+ label_impressum: "Aviso legal"
label_in: "em"
label_in_less_than: "em menos de"
label_in_more_than: "em mais de"
diff --git a/config/locales/crowdin/pt-PT.yml b/config/locales/crowdin/pt-PT.yml
index a596884714c3..e17a2aab9ea0 100644
--- a/config/locales/crowdin/pt-PT.yml
+++ b/config/locales/crowdin/pt-PT.yml
@@ -26,14 +26,15 @@ pt:
no_results_title_text: Não ocorreu nenhuma atividade neste projeto dentro deste espaço de tempo.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Atualmente, não existem extensões disponíveis.
custom_styles:
color_theme: "Cores do tema"
color_theme_custom: "(Personalizado)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternativo"
+ content-link-color: "Fonte dos links"
+ primary-color: "Primária"
+ primary-color-dark: "Primária (escuro)"
header-bg-color: "Fundo do cabeçalho"
header-item-bg-hover-color: "Fundo do cabeçalho ao passar o rato"
header-item-font-color: "Fonte do cabeçalho"
@@ -52,8 +53,10 @@ pt:
enterprise_more_info: "Nota: o logótipo usado estará acessível ao público."
manage_colors: "Editar opções de selecção de cor"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Cor de contraste forte, utilizada habitualmente no botão mais importante de um ecrã."
+ content-link-color: "Cor da fonte da maioria dos hyperlinks."
+ primary-color: "Cor principal."
+ primary-color-dark: "Normalmente é utilizada uma cor mais escura da cor principal para a ação de passar com o rato por cima."
header-item-bg-hover-color: "Cor de fundo de itens do cabeçalho clicáveis quando se passa com o rato por cima."
header-item-font-color: "Cor da fonte dos itens clicáveis do cabeçalho."
header-item-font-hover-color: "Cor da fonte de itens clicáveis do cabeçalho quando se passa com o mouse por cima."
@@ -1527,7 +1530,6 @@ pt:
postgres_migration: "A migrar a sua instalação para PostgreSQL"
user_guides: "Guia do Utilizador"
faq: "FAQ (Perguntas Mais Frequentes)"
- impressum: "Legal notice"
glossary: "Glossário"
shortcuts: "Atalhos"
blog: "Blog de OpenProject"
@@ -1859,6 +1861,7 @@ pt:
label_subject_or_id: "ID ou Assunto"
label_calendar_subscriptions: "Subscrições do calendário"
label_identifier: "Identificador"
+ label_impressum: "Aviso legal"
label_in: "em"
label_in_less_than: "em menos de"
label_in_more_than: "em mais de"
diff --git a/config/locales/crowdin/ro.yml b/config/locales/crowdin/ro.yml
index 3e30516f3ed5..447eee27597f 100644
--- a/config/locales/crowdin/ro.yml
+++ b/config/locales/crowdin/ro.yml
@@ -26,14 +26,15 @@ ro:
no_results_title_text: Nu s-a înregistrat nicio activitate pentru acest proiect în această perioadă de timp.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: În acest moment nu există plugin-uri disponibile.
custom_styles:
color_theme: "Culoarea temei"
color_theme_custom: "(Personalizat)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Logo-ul alternativ"
+ content-link-color: "Font Legături"
+ primary-color: "Primar"
+ primary-color-dark: "Primară (închisă)"
header-bg-color: "Fundal antet"
header-item-bg-hover-color: "Fundal antet la plutire"
header-item-font-color: "Font Antet"
@@ -52,8 +53,10 @@ ro:
enterprise_more_info: "Notă: logo-ul utilizat va fi accesibil publicului."
manage_colors: "Modificați opțiunile de selecție ale culorilor"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Culoare accentuată puternică, folosită de obicei pentru cel mai important buton de pe un ecran."
+ content-link-color: "Culoarea fontului pentru majoritatea link-urilor."
+ primary-color: "Culoarea principală."
+ primary-color-dark: "De obicei, o versiune mai închisă a culorii principale, utilizată pentru efectele hover."
header-item-bg-hover-color: "Culoarea de fundal a obiectelor care pot fi selectate când cursorului se află deasupra lor."
header-item-font-color: "Culoare fontului pentru elementele selectabile din antet."
header-item-font-hover-color: "Culoarea fontului pentru elementele selectabile din antet când cursorul se află deasupra lor."
@@ -1556,7 +1559,6 @@ ro:
postgres_migration: "Migrarea instalației dvs. către PostgreSQL"
user_guides: "Ghiduri utilizator"
faq: "Întrebări Frecvente"
- impressum: "Legal notice"
glossary: "Glosar"
shortcuts: "Scurtături"
blog: "Blog-ul OpenProject"
@@ -1888,6 +1890,7 @@ ro:
label_subject_or_id: "Subiect sau ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Notificare legala"
label_in: "în"
label_in_less_than: "în mai puțin de"
label_in_more_than: "în mai mult de"
diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml
index 22a9493488e5..79b3e9df8dd9 100644
--- a/config/locales/crowdin/ru.yml
+++ b/config/locales/crowdin/ru.yml
@@ -26,14 +26,15 @@ ru:
no_results_title_text: В течение этого периода времени не было никакой деятельности по проекту.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Дополнения отсутствуют.
custom_styles:
color_theme: "Цветовая тема"
color_theme_custom: "(Пользовательская)"
colors:
- primary-button-color: "Основная кнопка"
- accent-color: "Акцент"
+ alternative-color: "Альтернативная"
+ content-link-color: "Шрифт ссылки"
+ primary-color: "Основной"
+ primary-color-dark: "Основной (темный)"
header-bg-color: "Фон заголовка"
header-item-bg-hover-color: "Фон заголовка при наведении курсора"
header-item-font-color: "Шрифт заголовка"
@@ -52,8 +53,10 @@ ru:
enterprise_more_info: "Примечание: используемый логотип будет общедоступным."
manage_colors: "Изменить цвет выбранных опций"
instructions:
- primary-button-color: "Яркий контрастный цвет, который обычно используют для важных кнопок на экране."
- accent-color: "Цвет ссылок и других удачно выделенных элементов."
+ alternative-color: "Яркий контрастный цвет, который обычно используют для важных кнопок на экране."
+ content-link-color: "Цвет шрифта большинства ссылок."
+ primary-color: "Основной цвет."
+ primary-color-dark: "Для эффекта наведения обычно используется более темная версия основного цвета."
header-item-bg-hover-color: "Цвет фона в заголовках интерактивных элементов при наведении мыши."
header-item-font-color: "Цвет шрифта в заголовках интерактивных элементов."
header-item-font-hover-color: "Цвет шрифта в заголовках интерактивных элементов при наведении мыши."
@@ -1582,7 +1585,6 @@ ru:
postgres_migration: "Перенос вашей установки в PostgreSQL"
user_guides: "Руководство пользователя"
faq: "ЧаВо"
- impressum: "Правовое уведомление"
glossary: "Глоссарий"
shortcuts: "Ярлыки"
blog: "Openproject блог"
@@ -1914,6 +1916,7 @@ ru:
label_subject_or_id: "Тема или ID"
label_calendar_subscriptions: "Подписки на календарь"
label_identifier: "Идентификатор"
+ label_impressum: "Правовое уведомление"
label_in: "в"
label_in_less_than: "менее чем"
label_in_more_than: "более чем"
diff --git a/config/locales/crowdin/rw.yml b/config/locales/crowdin/rw.yml
index 673eb9b49742..28f124783be7 100644
--- a/config/locales/crowdin/rw.yml
+++ b/config/locales/crowdin/rw.yml
@@ -26,14 +26,15 @@ rw:
no_results_title_text: There has not been any activity for the project within this time frame.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: There are currently no plugins available.
custom_styles:
color_theme: "Color theme"
color_theme_custom: "(Custom)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternative"
+ content-link-color: "Link font"
+ primary-color: "Primary"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ rw:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Edit color select options"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Font color of most of the links."
+ primary-color: "Main color."
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1529,7 +1532,6 @@ rw:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "User guides"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glossary"
shortcuts: "Shortcuts"
blog: "OpenProject blog"
@@ -1861,6 +1863,7 @@ rw:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "in"
label_in_less_than: "in less than"
label_in_more_than: "in more than"
diff --git a/config/locales/crowdin/si.yml b/config/locales/crowdin/si.yml
index 5d077b509724..55620eb04518 100644
--- a/config/locales/crowdin/si.yml
+++ b/config/locales/crowdin/si.yml
@@ -26,14 +26,15 @@ si:
no_results_title_text: මෙම කාල රාමුව තුළ ව්යාපෘතිය සඳහා කිසිදු ක්රියාකාරකමක් සිදු වී නොමැත.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: දැනට ප්ලගින නොමැත.
custom_styles:
color_theme: "වර්ණ තේමාව"
color_theme_custom: "(අභිරුචි)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "විකල්ප"
+ content-link-color: "ලින්ක් ෆොන්ටය"
+ primary-color: "ප්රාථමික"
+ primary-color-dark: "ප්රාථමික (අඳුරු)"
header-bg-color: "පසුබිම ශීර්ෂකය"
header-item-bg-hover-color: "හැවර් මත ශීර්ෂකය පසුබිම"
header-item-font-color: "අකුරු ශීර්ෂකය"
@@ -52,8 +53,10 @@ si:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "වර්ණ තෝරා ගැනීමේ විකල්ප සංස්කරණය කරන්න"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong අවධාරණය වර්ණ, සාමාන්යයෙන් තිරය මත වඩාත් වැදගත් බොත්තම සඳහා භාවිතා."
+ content-link-color: "සබැඳි බොහෝ අකුරු වර්ණය."
+ primary-color: "ප්රධාන වර්ණය."
+ primary-color-dark: "සාමාන්යයෙන් සැරිසරන බලපෑම් සඳහා භාවිතා කරන ප්රධාන වර්ණ වඩා තද වර්ණයෙන් දැක්වෙන අනුවාදය."
header-item-bg-hover-color: "මූසිකය සමඟ සැරිසැරූ විට ක්ලික් කළ හැකි ශීර්ෂ අයිතමවල පසුබිම් වර්ණය."
header-item-font-color: "ක්ලික් කළ හැකි ශීර්ෂ අයිතමවල අකුරු වර්ණය."
header-item-font-hover-color: "මූසිකය සමඟ සැරිසැරූ විට ක්ලික් කළ හැකි ශීර්ෂ අයිතමවල අකුරු වර්ණය."
@@ -1529,7 +1532,6 @@ si:
postgres_migration: "ඔබගේ ස්ථාපනය PostgreSQL වෙත සංක්රමණය කිරීම"
user_guides: "පරිශීලක මාර්ගෝපදේශ"
faq: "නිතර අසන ප්රශ්න"
- impressum: "Legal notice"
glossary: "පාරිභාෂික ශබ්ද මාලාව"
shortcuts: "කෙටිමං"
blog: "OpenProject බ්ලොග්"
@@ -1861,6 +1863,7 @@ si:
label_subject_or_id: "විෂය හෝ හැඳුනුම්පත"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "නීතිමය දැනුම්දීම"
label_in: "තුළ"
label_in_less_than: "වඩා අඩු"
label_in_more_than: "වඩා වැඩි"
diff --git a/config/locales/crowdin/sk.yml b/config/locales/crowdin/sk.yml
index 9d1ef37f3b27..1f350be0e0c8 100644
--- a/config/locales/crowdin/sk.yml
+++ b/config/locales/crowdin/sk.yml
@@ -26,14 +26,15 @@ sk:
no_results_title_text: Počas tohto časového obdobia nebola vykonaná žiadna aktivita na projekte.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Momentálne nie sú k dispozícii žiadne zásuvné moduly.
custom_styles:
color_theme: "Farebný motív"
color_theme_custom: "(Vlastné)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternatíva"
+ content-link-color: "Link font"
+ primary-color: "Primárna"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Pozadie hlavičky"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Písmo hlavičky"
@@ -52,8 +53,10 @@ sk:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Upraviť možnosti výberu farieb"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Farba písma väčšiny odkazov."
+ primary-color: "Hlavná farba."
+ primary-color-dark: "Obvykle sa používa tmavšia verzia hlavnej farby pre hover efekty."
header-item-bg-hover-color: "Farba pozadia kliknuteľnej hlavičky pri umiestnení kurzora nad hlavičku."
header-item-font-color: "Farba písma kliknuteľnej hlavičky položky."
header-item-font-hover-color: "Farba písma kliknuteľnej hlavičky pri umiestnení kurzora nad hlavičku."
@@ -1583,7 +1586,6 @@ sk:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "Používateľské príručky"
faq: "Často kladené otázky"
- impressum: "Legal notice"
glossary: "Slovníček pojmov"
shortcuts: "Skratky"
blog: "OpenProject blog"
@@ -1915,6 +1917,7 @@ sk:
label_subject_or_id: "Predmet alebo ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "v"
label_in_less_than: "v menej ako"
label_in_more_than: "vo viac ako"
diff --git a/config/locales/crowdin/sl.yml b/config/locales/crowdin/sl.yml
index 04ce66ce5507..c4fb9285611c 100644
--- a/config/locales/crowdin/sl.yml
+++ b/config/locales/crowdin/sl.yml
@@ -26,14 +26,15 @@ sl:
no_results_title_text: Na projektu ni bilo nobene aktivnosti v izbranem časovnem okviru
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Trenutno vtičniki niso na voljo
custom_styles:
color_theme: "Barvna tema"
color_theme_custom: "(Po meri)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternativno"
+ content-link-color: "Pisava povezave"
+ primary-color: "Primarna"
+ primary-color-dark: "Primarna (temna)"
header-bg-color: "Ozadje glave"
header-item-bg-hover-color: "Ozadje glave, ko smo z miško na vsebini"
header-item-font-color: "Pisava glave"
@@ -52,8 +53,10 @@ sl:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Uredi možnosti izbire barve"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Močna poudarjena barva, ki se običajno uporablja za najpomembnejši gumb na zaslonu."
+ content-link-color: "Barva pisave večine povezav."
+ primary-color: "Glavna barva."
+ primary-color-dark: "Običajno temnejša različica glavne barve, ki se uporablja za učinke lebdenja."
header-item-bg-hover-color: "Barva ozadja enot v glavi katere je mogoče klikniti, ko se z miško premaknete na njih."
header-item-font-color: "Barva pisave enot v glavi, na katere lahko kliknemo."
header-item-font-hover-color: "Barva pisave elementov v glavi, na katere lahko kliknemo, ko se z miško premaknemo na njih."
@@ -1315,8 +1318,8 @@ sl:
- "avgust"
- "september"
- "oktober"
- - "November"
- - "December"
+ - "november"
+ - "december"
order:
- :leto
- :mesec
@@ -1580,7 +1583,6 @@ sl:
postgres_migration: "Selitev namestitve na PostgreSQL"
user_guides: "Uporabniški priročniki"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Slovar"
shortcuts: "Bližnjice"
blog: "Blog OpenProject"
@@ -1912,6 +1914,7 @@ sl:
label_subject_or_id: "Predmet ali ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Pravno obvestilo"
label_in: "v"
label_in_less_than: "v manj kot"
label_in_more_than: "v več kot"
diff --git a/config/locales/crowdin/sr.yml b/config/locales/crowdin/sr.yml
index a19ac18fbb01..32cda2908255 100644
--- a/config/locales/crowdin/sr.yml
+++ b/config/locales/crowdin/sr.yml
@@ -26,14 +26,15 @@ sr:
no_results_title_text: There has not been any activity for the project within this time frame.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: There are currently no plugins available.
custom_styles:
color_theme: "Color theme"
color_theme_custom: "(Custom)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternative"
+ content-link-color: "Link font"
+ primary-color: "Primary"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ sr:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Edit color select options"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Font color of most of the links."
+ primary-color: "Main color."
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1556,7 +1559,6 @@ sr:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "User guides"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glossary"
shortcuts: "Shortcuts"
blog: "OpenProject blog"
@@ -1888,6 +1890,7 @@ sr:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "in"
label_in_less_than: "in less than"
label_in_more_than: "in more than"
diff --git a/config/locales/crowdin/sv.yml b/config/locales/crowdin/sv.yml
index 06d8eba89aa5..da70b4d61169 100644
--- a/config/locales/crowdin/sv.yml
+++ b/config/locales/crowdin/sv.yml
@@ -26,14 +26,15 @@ sv:
no_results_title_text: Det har inte förekommit någon aktivitet för projektet inom denna tidsram.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Det finns för närvarande inga tillgängliga plugins.
custom_styles:
color_theme: "Färgtema"
color_theme_custom: "(Anpassad)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternativ"
+ content-link-color: "Link font"
+ primary-color: "Primär"
+ primary-color-dark: "Primär (mörk)"
header-bg-color: "Rubrikbakgrund"
header-item-bg-hover-color: "Rubrikbakgrund vid hovring"
header-item-font-color: "Rubriktypsnitt"
@@ -52,8 +53,10 @@ sv:
enterprise_more_info: "Obs: logotypen som används kommer att vara allmänt tillgänglig."
manage_colors: "Redigera alternativ för valbara färger"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Stark accentfärg som brukar användas för de viktigaste knapparna på skärmen."
+ content-link-color: "Teckenfärg på de flesta länkarna."
+ primary-color: "Huvudfärg."
+ primary-color-dark: "Vanligtvis en mörkare version av huvudfärgen som används för hover-effekter."
header-item-bg-hover-color: "Bakgrundsfärg på klickbara objekt i sidhuvudet när man hovrar med muspekaren."
header-item-font-color: "Teckenfärg på klickbara objekt i sidhuvudet."
header-item-font-hover-color: "Teckenfärg på klickbara objekt i sidhuvudet när man hovrar med muspekaren."
@@ -1528,7 +1531,6 @@ sv:
postgres_migration: "Migrera din installation till PostgreSQL"
user_guides: "Användarguider"
faq: "Vanliga frågor (FAQ)"
- impressum: "Legal notice"
glossary: "Ordlista"
shortcuts: "Genvägar"
blog: "OpenProject blogg"
@@ -1860,6 +1862,7 @@ sv:
label_subject_or_id: "Ämne eller ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Villkor"
label_in: "i"
label_in_less_than: "i mindre än"
label_in_more_than: "i mer än"
diff --git a/config/locales/crowdin/th.yml b/config/locales/crowdin/th.yml
index 8bd56cc7347b..a311f66db60b 100644
--- a/config/locales/crowdin/th.yml
+++ b/config/locales/crowdin/th.yml
@@ -26,14 +26,15 @@ th:
no_results_title_text: ไม่มีกิจกรรมสำหรับโปรเจคนี้
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: ขณะนี้ยังไม่มีปลั๊กอินที่พร้อมใช้งาน
custom_styles:
color_theme: "สีของรูปแบบ"
color_theme_custom: "ตั้งค่าเอง"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "ตัวเลือกอื่น"
+ content-link-color: "ลิงค์แบบอักษร"
+ primary-color: "สีหลัก"
+ primary-color-dark: "สีหลักธีมดำ"
header-bg-color: "พื้นหลังหัวข้อ"
header-item-bg-hover-color: "พื้นหลังส่วนหัวบนโฮเวอร์"
header-item-font-color: "แบบอักษรส่วนหัว"
@@ -52,8 +53,10 @@ th:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Redigér egenskaber for farvevalg"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Font color of most of the links."
+ primary-color: "สีหลัก"
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1502,7 +1505,6 @@ th:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "User guides"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glossary"
shortcuts: "Shortcuts"
blog: "OpenProject blog"
@@ -1834,6 +1836,7 @@ th:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "ใน"
label_in_less_than: "ในไม่เกิน"
label_in_more_than: "ในมากกว่า"
diff --git a/config/locales/crowdin/tr.yml b/config/locales/crowdin/tr.yml
index 69c889d1083a..9957aac351fe 100644
--- a/config/locales/crowdin/tr.yml
+++ b/config/locales/crowdin/tr.yml
@@ -26,14 +26,15 @@ tr:
no_results_title_text: Bu zaman dilimi içerisinde proje için herhangi bir faaliyet olmamıştır.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Şu anda kullanılabilir eklenti mevcut değil.
custom_styles:
color_theme: "Renk teması"
color_theme_custom: "(Özel)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternatif"
+ content-link-color: "Bağlantı yazı tipi"
+ primary-color: "Birincil"
+ primary-color-dark: "Birincil (karanlık)"
header-bg-color: "Üstbilgi arka planı"
header-item-bg-hover-color: "Fareyle üzerine gelindiğinde başlık arka planı"
header-item-font-color: "Başlık yazı tipi"
@@ -52,8 +53,10 @@ tr:
enterprise_more_info: "Not: Kullanılan logo herkese açık olacaktır."
manage_colors: "Renk seçim seçeneklerini düzenle"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Güçlü vurgu rengi, genellikle ekrandaki en önemli düğme için kullanılır."
+ content-link-color: "Bir çok bağlantının yazı tipi rengi."
+ primary-color: "Ana renk."
+ primary-color-dark: "Daha etkili efektler için ana renklerin koyu versiyonu."
header-item-bg-hover-color: "Tıklanabilir başlık bileşenleri nin üzerine gelindiğinde kullanılacak arka plan rengi."
header-item-font-color: "Tıklanabilir başlık bileşenleri için yazı rengi."
header-item-font-hover-color: "Tıklanabilir başlık bileşenleri nin üzerine gelindiğinde kullanılacak yazı rengi."
@@ -1071,7 +1074,7 @@ tr:
base: "Genel Hata:"
blocks_ids: "Engellenen iş paketlerinin ID'leri"
category: "Kategori"
- comment: "Yorum"
+ comment: "Yorumlar"
comments: "Yorum"
content: "İçerik"
color: "Renk"
@@ -1528,7 +1531,6 @@ tr:
postgres_migration: "Kurulumunuzu PostgreSQL'e taşıyın"
user_guides: "Kullanıcı rehberleri"
faq: "SSS"
- impressum: "Legal notice"
glossary: "Terimler sözlüğü"
shortcuts: "Kısayollar"
blog: "OpenProject blog"
@@ -1860,6 +1862,7 @@ tr:
label_subject_or_id: "Konu ya da ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Yasal uyarı"
label_in: "şurada"
label_in_less_than: "daha azdır"
label_in_more_than: "daha fazla"
diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml
index b307d615e591..39f8fd332815 100644
--- a/config/locales/crowdin/uk.yml
+++ b/config/locales/crowdin/uk.yml
@@ -26,14 +26,15 @@ uk:
no_results_title_text: Протягом цього часу не було жодної діяльності для проекту.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Наразі немає доступних плагінів.
custom_styles:
color_theme: "Колірна тема"
color_theme_custom: "(Власний)"
colors:
- primary-button-color: "Основна кнопка"
- accent-color: "Акцент"
+ alternative-color: "Альтернативний"
+ content-link-color: "Шрифт посилання"
+ primary-color: "Основний"
+ primary-color-dark: "Основний (темний)"
header-bg-color: "Фон заголовка"
header-item-bg-hover-color: "Фон заголовка в разі наведення курсора"
header-item-font-color: "Шрифт заголовка"
@@ -52,8 +53,10 @@ uk:
enterprise_more_info: "Примітка: використаний логотип буде загальнодоступний."
manage_colors: "Редагувати параметри вибору кольору"
instructions:
- primary-button-color: "Насичений акцентний колір використовується для більшості важливих кнопок на екрані."
- accent-color: "Колір для посилань та інших елементів, які має бути виділено."
+ alternative-color: "Насичений акцентний колір зазвичай використовується для більшості важливих кнопок на екрані."
+ content-link-color: "Колір шрифту більшості посилань."
+ primary-color: "Основний колір."
+ primary-color-dark: "Зазвичай темний варіант основного кольору, який використовується для ефектів наведення."
header-item-bg-hover-color: "Колір фону в заголовках інтерактивних елементів під курсором миші."
header-item-font-color: "Колір шрифту в заголовках інтерактивних елементів."
header-item-font-hover-color: "Колір шрифту в заголовках інтерактивних елементів під курсором миші."
@@ -1578,7 +1581,6 @@ uk:
postgres_migration: "Міграція інсталяції в PostgreSQL"
user_guides: "Посібники користувача"
faq: "ЧаПи"
- impressum: "Юридична інформація"
glossary: "Глосарій"
shortcuts: "Ярлики"
blog: "Openproject блог"
@@ -1910,6 +1912,7 @@ uk:
label_subject_or_id: "Тема або ідентифікатор"
label_calendar_subscriptions: "Підписки на календарі"
label_identifier: "Ідентифікатор"
+ label_impressum: "Правове повідомлення"
label_in: "в"
label_in_less_than: "менш ніж"
label_in_more_than: "більше ніж"
@@ -1920,7 +1923,7 @@ uk:
label_index_by_title: "Індекс за назвою"
label_information: "Інформація"
label_information_plural: "Інформація"
- label_installation_guides: "Інструкції зі встановлення"
+ label_installation_guides: "Інструкції із встановлення"
label_integer: "Ціле число"
label_internal: "Власне"
label_introduction_video: "Введення відео"
diff --git a/config/locales/crowdin/uz.yml b/config/locales/crowdin/uz.yml
index 84fc9ce94d54..8592af7e93ef 100644
--- a/config/locales/crowdin/uz.yml
+++ b/config/locales/crowdin/uz.yml
@@ -26,14 +26,15 @@ uz:
no_results_title_text: There has not been any activity for the project within this time frame.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: There are currently no plugins available.
custom_styles:
color_theme: "Color theme"
color_theme_custom: "(Custom)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternative"
+ content-link-color: "Link font"
+ primary-color: "Primary"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -52,8 +53,10 @@ uz:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Edit color select options"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Font color of most of the links."
+ primary-color: "Main color."
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1529,7 +1532,6 @@ uz:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "User guides"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glossary"
shortcuts: "Shortcuts"
blog: "OpenProject blog"
@@ -1861,6 +1863,7 @@ uz:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "in"
label_in_less_than: "in less than"
label_in_more_than: "in more than"
diff --git a/config/locales/crowdin/vi.yml b/config/locales/crowdin/vi.yml
index ec6666f774dd..10537c40a0a3 100644
--- a/config/locales/crowdin/vi.yml
+++ b/config/locales/crowdin/vi.yml
@@ -26,14 +26,15 @@ vi:
no_results_title_text: Đã không có bất kỳ hoạt động nào cho dự án trong khung thời gian này.
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: Không có plugins nào khả dụng.
custom_styles:
color_theme: "Màu sắc giao diện"
color_theme_custom: "(Tùy chỉnh)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Thay thế"
+ content-link-color: "Liên kết phông chữ"
+ primary-color: "Cấp 1"
+ primary-color-dark: "Cấp 1(tối)"
header-bg-color: "Nền của tiêu đề"
header-item-bg-hover-color: "Màu nền tiêu đề khi trỏ chuột"
header-item-font-color: "Phông chữ tiêu đề"
@@ -52,8 +53,10 @@ vi:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Chỉnh sửa màu sắc trong select option"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Màu nhấn mạnh, thường được sử dụng cho nút quan trọng nhất trên màn hình."
+ content-link-color: "Màu sắc Font chữ các liên kết"
+ primary-color: "Màu sắc chính"
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Màu nền của tiêu đề được thay đổi khi đưa chuột đến"
header-item-font-color: "Màu sắc font chữ của tiêu đề đã nhấp"
header-item-font-hover-color: "Màu sắc của tiêu đề được thay đổi khi đưa chuột đến"
@@ -1504,7 +1507,6 @@ vi:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "User guides"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glossary"
shortcuts: "Shortcuts"
blog: "OpenProject blog"
@@ -1836,6 +1838,7 @@ vi:
label_subject_or_id: "Chủ đề hoặc Mã"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Thông báo pháp lý"
label_in: "trong"
label_in_less_than: "ít hơn"
label_in_more_than: "nhiều hơn"
diff --git a/config/locales/crowdin/zh-CN.seeders.yml b/config/locales/crowdin/zh-CN.seeders.yml
index 69a96ab7a069..00a07d513b07 100644
--- a/config/locales/crowdin/zh-CN.seeders.yml
+++ b/config/locales/crowdin/zh-CN.seeders.yml
@@ -151,7 +151,7 @@ zh-CN:
demo-project:
name: 演示项目
status_explanation: 所有任务都按计划进行。相关人员均知晓各自任务。系统已完全建立。
- description: 这是对此演示项目目标的简短摘要。
+ description: 这是对此演示 Scrum 项目目标的简短摘要。
news:
item_0:
title: 欢迎来到您的演示项目
@@ -254,7 +254,7 @@ zh-CN:
scrum-project:
name: Scrum 项目
status_explanation: 所有任务都按计划进行。相关人员均知晓各自任务。系统已完全建立。
- description: 这是对此演示Scrum项目目标的简短摘要。
+ description: 这是对此演示 Scrum 项目目标的简短摘要。
news:
item_0:
title: 欢迎来到您的 Scrum 演示项目
diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml
index 9ea29e560957..29aae00b5880 100644
--- a/config/locales/crowdin/zh-CN.yml
+++ b/config/locales/crowdin/zh-CN.yml
@@ -26,14 +26,15 @@ zh-CN:
no_results_title_text: 在这个时间范围内没有任何项目的活动。
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: 目前没有插件可用。
custom_styles:
color_theme: "主题颜色"
color_theme_custom: "(自定义)"
colors:
- primary-button-color: "主按钮色"
- accent-color: "强调色"
+ alternative-color: "备用"
+ content-link-color: "链接字体"
+ primary-color: "主要"
+ primary-color-dark: "主要(深色)"
header-bg-color: "标题背景"
header-item-bg-hover-color: "悬停时的标题背景"
header-item-font-color: "标题字体"
@@ -52,8 +53,10 @@ zh-CN:
enterprise_more_info: "注:使用的徽标将可公开访问。"
manage_colors: "编辑颜色选择选项"
instructions:
- primary-button-color: "强烈的强调色,通常用于屏幕上最重要的按钮。"
- accent-color: "链接和其他适当突出元素的颜色。"
+ alternative-color: "强烈的颜色,通常用于屏幕上最重要的按钮。"
+ content-link-color: "大多数链接的特定颜色。"
+ primary-color: "主颜色。"
+ primary-color-dark: "通常深色的主颜色用于悬浮效果。"
header-item-bg-hover-color: "鼠标悬停时可点击的标题的背景色。"
header-item-font-color: "可点击标题的特定颜色。"
header-item-font-hover-color: "鼠标悬停时可点击标题的特定颜色。"
@@ -67,7 +70,7 @@ zh-CN:
text: "您确定要删除当前使用的企业版令牌吗?"
title: "删除令牌"
replace_token: "替换您当前的支持令牌"
- order: "订购本地部署的 Enterprise edition"
+ order: "订购本地部署版的 Enterprise edition"
paste: "粘贴您企业版的支持令牌"
required_for_feature: "此功能仅限具激活的企业版支持令牌的订阅者使用。"
enterprise_link: "如需了解详细信息,请单击此处。"
@@ -1498,7 +1501,6 @@ zh-CN:
postgres_migration: "将您的安装迁移到 PostgreSQL"
user_guides: "用户指南"
faq: "常见问题"
- impressum: "法律声明"
glossary: "术语表"
shortcuts: "快捷键"
blog: "OpenProject 博客"
@@ -1830,6 +1832,7 @@ zh-CN:
label_subject_or_id: "主题或ID"
label_calendar_subscriptions: "日历订阅"
label_identifier: "标识符"
+ label_impressum: "法律声明"
label_in: "在"
label_in_less_than: "在小于"
label_in_more_than: "在多于"
@@ -2042,7 +2045,7 @@ zh-CN:
label_revision_id: "修订版本 %{value}"
label_revision_plural: "修订"
label_roadmap: "路线图"
- label_roadmap_edit: "编辑路线图 %{name}"
+ label_roadmap_edit: "编辑路线图%{name}"
label_roadmap_due_in: "%{value} 到期"
label_roadmap_no_work_packages: "该版本没有工作包。"
label_roadmap_overdue: "%{value} 超时"
@@ -2647,7 +2650,7 @@ zh-CN:
managed: "在 OpenProject 中创建新的存储库"
storage:
not_available: "磁盘存储开销不可用于此存储库。"
- update_timeout: "在 N 分钟内保留存储库最后所需磁盘空间的信息。由于计算存储库所需的磁盘空间可能增加系统开销,增加该值可以减少性能影响。"
+ update_timeout: "在 N 分钟内保留存储库最后所需的磁盘空间信息。由于计算存储库所需的磁盘空间可能增加系统开销,增加该值可以减少性能影响。"
oauth_application_details: "关闭此窗口后,将无法再次访问客户端密钥值。请将这些值复制到 Nextcloud OpenProject 集成设置中:"
oauth_application_details_link_text: "转到设置页面"
setup_documentation_details: "如果您在配置新文件存储方面需要帮助,请查看文档:"
@@ -2784,7 +2787,7 @@ zh-CN:
setting_session_ttl_hint: "当设置的值低于5时,其作用类似于禁用。"
setting_session_ttl_enabled: "会话过期"
setting_start_of_week: "一周起始日"
- setting_sys_api_enabled: "启用版本库管理 web 服务"
+ setting_sys_api_enabled: "启用存储库管理网页服务"
setting_sys_api_description: "存储库管理网页服务提供了集成的,用户授权的存储库访问。"
setting_time_format: "时间"
setting_accessibility_mode_for_anonymous: "为匿名用户启用辅助功能模式"
@@ -3074,7 +3077,7 @@ zh-CN:
warning_user_limit_reached_admin: >
添加额外的用户将超出当前限制。请升级您的计划,以确保外部用户能够访问此实例。
warning_user_limit_reached_instructions: >
- 您达到了用户限制(%{current}/%{max}活跃用户)。 请联系sales@openproject.com以升级您的Enterprise edition计划并添加其他用户。
+ 您已达到用户限制(%{current}/%{max} 活跃用户)。请联系 sales@openproject.com 升级您的企业版计划以添加额外用户。
warning_protocol_mismatch_html: >
warning_bar:
diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml
index d6b65ad4de7c..124ddfd44f8b 100644
--- a/config/locales/crowdin/zh-TW.yml
+++ b/config/locales/crowdin/zh-TW.yml
@@ -26,14 +26,15 @@ zh-TW:
no_results_title_text: 在這一時限內, 該專案沒有任何活動。
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: 目前沒有外掛可以使用
custom_styles:
color_theme: "色彩佈景主題"
color_theme_custom: "自訂"
colors:
- primary-button-color: "Primary button"
- accent-color: "強調(Accent)"
+ alternative-color: "替代"
+ content-link-color: "連結字型"
+ primary-color: "主要"
+ primary-color-dark: "主要(深色)"
header-bg-color: "頁首背景"
header-item-bg-hover-color: "頁首背景(滑鼠停留)"
header-item-font-color: "頁首字型"
@@ -52,8 +53,10 @@ zh-TW:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "編輯顏色選擇選項"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "濃重的主題色,通常用於螢幕上最重要的按鈕。"
+ content-link-color: "大部分連結的文字顏色"
+ primary-color: "主要顏色"
+ primary-color-dark: "通常深色的主顏色用於懸浮特效。"
header-item-bg-hover-color: "當滑鼠移動到可點選的標題項目的背景顏色"
header-item-font-color: "可點擊的標題項目的文字顏色"
header-item-font-hover-color: "當滑鼠移動到可點選的標題項目的文字顏色"
@@ -422,7 +425,7 @@ zh-TW:
copy_failed: "此工作項目無法被複製"
move_failed: "此工作項目無法被移動"
could_not_be_saved: "以下文檔無法被保存"
- none_could_be_saved: "None of the %{total} work packages could be updated."
+ none_could_be_saved: " %{total} 工作項目無法更新"
x_out_of_y_could_be_saved: "%{failing} out of the %{total} work packages could not be updated while %{success} could."
selected_because_descendants: "While %{selected} work packages where selected, in total %{total} work packages are affected which includes descendants."
descendant: "descendant of selected"
@@ -1501,7 +1504,6 @@ zh-TW:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "使用手冊"
faq: "問答集"
- impressum: "Legal notice"
glossary: "術語表 "
shortcuts: "快捷鍵"
blog: "Openproject 部落格"
@@ -1806,7 +1808,7 @@ zh-TW:
label_file_plural: "檔案"
label_filter_add: "新增條件"
label_filter: "篩選條件"
- label_filter_plural: "篩選器"
+ label_filter_plural: "篩選條件"
label_filters_toggle: "顯示/隱藏篩選條件"
label_float: "浮點數"
label_folder: "資料夾"
@@ -1830,9 +1832,10 @@ zh-TW:
label_history: "歷史"
label_hierarchy_leaf: "頁面結構頁"
label_home: "Home"
- label_subject_or_id: "主旨或 id"
+ label_subject_or_id: "名稱或 id"
label_calendar_subscriptions: "訂閱行事曆"
label_identifier: "識別碼"
+ label_impressum: "法律聲明"
label_in: "在"
label_in_less_than: "少於"
label_in_more_than: "多於"
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 98df69b847df..eb59e3cd8644 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -35,14 +35,15 @@ en:
admin:
plugins:
- no_results_title_text: There are currently no plugins installed.
- no_results_content_text: See our integrations and plugins page for more information.
+ no_results_title_text: There are currently no plugins available.
custom_styles:
color_theme: "Color theme"
color_theme_custom: "(Custom)"
colors:
- primary-button-color: "Primary button"
- accent-color: "Accent"
+ alternative-color: "Alternative"
+ content-link-color: "Link font"
+ primary-color: "Primary"
+ primary-color-dark: "Primary (dark)"
header-bg-color: "Header background"
header-item-bg-hover-color: "Header background on hover"
header-item-font-color: "Header font"
@@ -61,8 +62,10 @@ en:
enterprise_more_info: "Note: the used logo will be publicly accessible."
manage_colors: "Edit color select options"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ alternative-color: "Strong accent color, typically used for the most important button on a screen."
+ content-link-color: "Font color of most of the links."
+ primary-color: "Main color."
+ primary-color-dark: "Typically a darker version of the main color used for hover effects."
header-item-bg-hover-color: "Background color of clickable header items when hovered with the mouse."
header-item-font-color: "Font color of clickable header items."
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
@@ -1632,7 +1635,6 @@ en:
postgres_migration: "Migrating your installation to PostgreSQL"
user_guides: "User guides"
faq: "FAQ"
- impressum: "Legal notice"
glossary: "Glossary"
shortcuts: "Shortcuts"
blog: "OpenProject blog"
@@ -1646,7 +1648,6 @@ en:
changes_retracted: "The changes were retracted."
caused_changes:
- default_attribute_written: "Read-only attributes written"
dates_changed: "Dates changed"
system_update: "OpenProject system update:"
@@ -1988,6 +1989,7 @@ en:
label_subject_or_id: "Subject or ID"
label_calendar_subscriptions: "Calendar subscriptions"
label_identifier: "Identifier"
+ label_impressum: "Legal notice"
label_in: "in"
label_in_less_than: "in less than"
label_in_more_than: "in more than"
@@ -2874,16 +2876,6 @@ en:
If CORS is enabled, these are the origins that are allowed to access OpenProject API.
Please check the Documentation on the Origin header on how to specify the expected values.
- setting_apiv3_write_readonly_attributes: "Write access to read-only attributes"
- setting_apiv3_write_readonly_attributes_instructions_html: >
- If enabled, the API will allow administrators to write static read-only attributes during creation,
- such as createdAt and updatedAt timestamps.
-
- Warning: This setting has a use-case for e.g., importing data, but allows
- administrators to impersonate the creation of items as other users. All creation requests are being
- logged however with the true author.
-
- For more information on attributes and supported resources, please see the %{api_documentation_link}.
setting_apiv3_max_page_size: "Maximum API page size"
setting_apiv3_max_page_instructions_html: >
Set the maximum page size the API will respond with.
@@ -3338,7 +3330,6 @@ en:
status_user_and_brute_force: "%{user} and %{brute_force}"
status_change: "Status change"
text_change_disabled_for_provider_login: "The name is set by your login provider and can thus not be changed."
- text_change_disabled_for_ldap_login: "The name and email is set by LDAP and can thus not be changed."
unlock: "Unlock"
unlock_and_reset_failed_logins: "Unlock and reset failed logins"
diff --git a/config/puma.rb b/config/puma.rb
index 4fe6d97c7c04..d375917d8fc1 100644
--- a/config/puma.rb
+++ b/config/puma.rb
@@ -28,12 +28,12 @@
# before forking the application. This takes advantage of Copy On Write
# process behavior so workers use less memory.
#
-preload_app! if ENV["RAILS_ENV"] == "production"
+preload_app! if ENV["RAILS_ENV"] == 'production'
# Allow puma to be restarted by `rails restart` command.
-plugin :tmp_restart unless ENV["RAILS_ENV"] == "production"
+plugin :tmp_restart unless ENV["RAILS_ENV"] == 'production'
-plugin :appsignal if ENV["APPSIGNAL_ENABLED"] == "true"
+plugin :appsignal if ENV['APPSIGNAL_ENABLED'] == 'true'
# activate statsd plugin only if a host is configured explicitly
if OpenProject::Configuration.statsd_host.present?
diff --git a/config/routes.rb b/config/routes.rb
index 89c4963a26d3..6e7dbf0313eb 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -27,74 +27,74 @@
#++
Rails.application.routes.draw do
- root to: "homescreen#index", as: "home"
- rails_relative_url_root = OpenProject::Configuration["rails_relative_url_root"] || ""
+ root to: 'homescreen#index', as: 'home'
+ rails_relative_url_root = OpenProject::Configuration['rails_relative_url_root'] || ''
# Route for error pages
- get "/404", to: "errors#not_found"
- get "/422", to: "errors#unacceptable"
- get "/500", to: "errors#internal_error"
+ get '/404', to: "errors#not_found"
+ get '/422', to: "errors#unacceptable"
+ get '/500', to: "errors#internal_error"
# Route for health_checks
- get "/health_check" => "ok_computer/ok_computer#show", check: "web"
+ get '/health_check' => 'ok_computer/ok_computer#show', check: 'web'
# Override the default `all` checks route to return the full check
- get "/health_checks/all" => "ok_computer/ok_computer#show", check: "full"
+ get '/health_checks/all' => 'ok_computer/ok_computer#show', check: 'full'
mount OkComputer::Engine, at: "/health_checks"
- get "/api/docs" => "api_docs#index"
+ get "/api/docs" => 'api_docs#index'
# Redirect deprecated issue links to new work packages uris
- get "/issues(/)" => redirect("#{rails_relative_url_root}/work_packages")
+ get '/issues(/)' => redirect("#{rails_relative_url_root}/work_packages")
# The URI.escape doesn't escape / unless you ask it to.
# see https://github.com/rails/rails/issues/5688
- get "/issues/*rest" => redirect { |params, _req|
+ get '/issues/*rest' => redirect { |params, _req|
"#{rails_relative_url_root}/work_packages/#{URI::RFC2396_Parser.new.escape(params[:rest])}"
}
# Respond with 410 gone for APIV2 calls
- match "/api/v2(/*unmatched_route)", to: proc { [410, {}, [""]] }, via: :all
- match "/assets/compiler.js.map", to: proc { [404, {}, [""]] }, via: :all
+ match '/api/v2(/*unmatched_route)', to: proc { [410, {}, ['']] }, via: :all
+ match '/assets/compiler.js.map', to: proc { [404, {}, ['']] }, via: :all
# Redirect wp short url for work packages to full URL
- get "/wp(/)" => redirect("#{rails_relative_url_root}/work_packages")
- get "/wp/*rest" => redirect { |params, _req|
+ get '/wp(/)' => redirect("#{rails_relative_url_root}/work_packages")
+ get '/wp/*rest' => redirect { |params, _req|
"#{rails_relative_url_root}/work_packages/#{URI::RFC2396_Parser.new.escape(params[:rest])}"
}
# Add catch method for Rack OmniAuth to allow route helpers
# Note: This renders a 404 in rails but is caught by omniauth in Rack before
- get "/auth/failure", to: "account#omniauth_failure"
- get "/auth/:provider", to: proc { [404, {}, [""]] }, as: "omniauth_start"
- match "/auth/:provider/callback", to: "account#omniauth_login", as: "omniauth_login", via: %i[get post]
+ get '/auth/failure', to: 'account#omniauth_failure'
+ get '/auth/:provider', to: proc { [404, {}, ['']] }, as: 'omniauth_start'
+ match '/auth/:provider/callback', to: 'account#omniauth_login', as: 'omniauth_login', via: %i[get post]
# In case assets are actually delivered by a node server (e.g. in test env)
# forward requests to the proxy
if FrontendAssetHelper.assets_proxied?
- match "/assets/frontend/*appendix",
+ match '/assets/frontend/*appendix',
to: redirect("#{FrontendAssetHelper.cli_proxy}/assets/frontend/%{appendix}", status: 307),
format: false,
via: :all
end
- scope controller: "account" do
- get "/account/force_password_change", action: "force_password_change"
- post "/account/change_password", action: "change_password"
- match "/account/lost_password", action: "lost_password", via: %i[get post]
- match "/account/register", action: "register", via: %i[get post patch]
- get "/account/activate", action: "activate"
+ scope controller: 'account' do
+ get '/account/force_password_change', action: 'force_password_change'
+ post '/account/change_password', action: 'change_password'
+ match '/account/lost_password', action: 'lost_password', via: %i[get post]
+ match '/account/register', action: 'register', via: %i[get post patch]
+ get '/account/activate', action: 'activate'
- match "/login", action: "login", as: "signin", via: %i[get post]
- get "/login/internal", action: "internal_login", as: "internal_signin"
- get "/logout", action: "logout", as: "signout"
+ match '/login', action: 'login', as: 'signin', via: %i[get post]
+ get '/login/internal', action: 'internal_login', as: 'internal_signin'
+ get '/logout', action: 'logout', as: 'signout'
- get "/sso", action: "auth_source_sso_failed", as: "sso_failure"
+ get '/sso', action: 'auth_source_sso_failed', as: 'sso_failure'
- get "/login/:stage/failure", action: "stage_failure", as: "stage_failure"
- get "/login/:stage/:secret", action: "stage_success", as: "stage_success"
+ get '/login/:stage/failure', action: 'stage_failure', as: 'stage_failure'
+ get '/login/:stage/:secret', action: 'stage_success', as: 'stage_success'
- get "/account/consent", action: "consent", as: "account_consent"
- get "/account/decline_consent", action: "decline_consent", as: "account_decline_consent"
- post "/account/confirm_consent", action: "confirm_consent", as: "account_confirm_consent"
+ get '/account/consent', action: 'consent', as: 'account_consent'
+ get '/account/decline_consent', action: 'decline_consent', as: 'account_decline_consent'
+ post '/account/confirm_consent', action: 'confirm_consent', as: 'account_confirm_consent'
end
# Because of https://github.com/intridea/grape/pull/853/files this has to be
@@ -102,7 +102,7 @@
# returned for all routes for which the v3 has also resources. Grape does
# remove the prefix (v3) before checking whether the method is supported. I
# don't understand why that should make sense.
- mount API::Root => "/api"
+ mount API::Root => '/api'
# OAuth authorization routes
use_doorkeeper do
@@ -110,45 +110,45 @@
skip_controllers :applications, :authorized_applications
end
- get "/roles/workflow/:id/:role_id/:type_id" => "roles#workflow"
+ get '/roles/workflow/:id/:role_id/:type_id' => 'roles#workflow'
- get "/types/:id/edit/:tab" => "types#edit",
+ get '/types/:id/edit/:tab' => "types#edit",
as: "edit_type_tab"
- match "/types/:id/update/:tab" => "types#update",
+ match '/types/:id/update/:tab' => "types#update",
as: "update_type_tab",
via: %i[post patch]
resources :types do
- post "move/:id", action: "move", on: :collection
+ post 'move/:id', action: 'move', on: :collection
end
resources :statuses, except: :show do
collection do
- post "update_work_package_done_ratio"
+ post 'update_work_package_done_ratio'
end
end
- get "custom_style/:digest/logo/:filename" => "custom_styles#logo_download",
- as: "custom_style_logo",
+ get 'custom_style/:digest/logo/:filename' => 'custom_styles#logo_download',
+ as: 'custom_style_logo',
constraints: { filename: /[^\/]*/ }
- get "custom_style/:digest/export_logo/:filename" => "custom_styles#export_logo_download",
- as: "custom_style_export_logo",
+ get 'custom_style/:digest/export_logo/:filename' => 'custom_styles#export_logo_download',
+ as: 'custom_style_export_logo',
constraints: { filename: /[^\/]*/ }
- get "custom_style/:digest/export_cover/:filename" => "custom_styles#export_cover_download",
- as: "custom_style_export_cover",
+ get 'custom_style/:digest/export_cover/:filename' => 'custom_styles#export_cover_download',
+ as: 'custom_style_export_cover',
constraints: { filename: /[^\/]*/ }
- get "custom_style/:digest/favicon/:filename" => "custom_styles#favicon_download",
- as: "custom_style_favicon",
+ get 'custom_style/:digest/favicon/:filename' => 'custom_styles#favicon_download',
+ as: 'custom_style_favicon',
constraints: { filename: /[^\/]*/ }
- get "custom_style/:digest/touch-icon/:filename" => "custom_styles#touch_icon_download",
- as: "custom_style_touch_icon",
+ get 'custom_style/:digest/touch-icon/:filename' => 'custom_styles#touch_icon_download',
+ as: 'custom_style_touch_icon',
constraints: { filename: /[^\/]*/ }
- get "highlighting/styles(/:version_tag)" => "highlighting#styles",
- as: "highlighting_css_styles"
+ get 'highlighting/styles(/:version_tag)' => 'highlighting#styles',
+ as: 'highlighting_css_styles'
resources :custom_fields, except: :show do
member do
@@ -158,25 +158,25 @@
end
end
- get "(projects/:project_id)/search" => "search#index", as: "search"
+ get '(projects/:project_id)/search' => 'search#index', as: 'search'
# only providing routes for journals when there are multiple subclasses of journals
# all subclasses will look for the journals routes
resources :journals, only: :index do
- get "diff/:field", action: :diff, on: :member, as: "diff"
+ get 'diff/:field', action: :diff, on: :member, as: 'diff'
end
# REVIEW: review those wiki routes
- scope "projects/:project_id/wiki/:id" do
+ scope 'projects/:project_id/wiki/:id' do
resource :wiki_menu_item, only: %i[edit update]
end
# generic route for adding/removing watchers.
# Models declared as acts_as_watchable will be automatically added to
# OpenProject::Acts::Watchable::Routes.watched
- scope ":object_type/:object_id", constraints: OpenProject::Acts::Watchable::Routes do
- post "/watch" => "watchers#watch"
- delete "/unwatch" => "watchers#unwatch"
+ scope ':object_type/:object_id', constraints: OpenProject::Acts::Watchable::Routes do
+ post '/watch' => 'watchers#watch'
+ delete '/unwatch' => 'watchers#unwatch'
end
namespace :projects do
@@ -185,32 +185,32 @@
end
resources :projects, except: %i[show edit create update] do
- scope module: "projects" do
- namespace "settings" do
- resource :general, only: %i[show], controller: "general"
+ scope module: 'projects' do
+ namespace 'settings' do
+ resource :general, only: %i[show], controller: 'general'
resource :modules, only: %i[show update]
resource :types, only: %i[show update]
resource :custom_fields, only: %i[show update]
- resource :repository, only: %i[show], controller: "repository"
+ resource :repository, only: %i[show], controller: 'repository'
resource :versions, only: %i[show]
resource :categories, only: %i[show update]
- resource :storage, only: %i[show], controller: "storage"
+ resource :storage, only: %i[show], controller: 'storage'
end
- resource :templated, only: %i[create destroy], controller: "templated"
- resource :archive, only: %i[create destroy], controller: "archive"
- resource :identifier, only: %i[show update], controller: "identifier"
+ resource :templated, only: %i[create destroy], controller: 'templated'
+ resource :archive, only: %i[create destroy], controller: 'archive'
+ resource :identifier, only: %i[show update], controller: 'identifier'
end
member do
- get "settings", to: redirect("projects/%{id}/settings/general/")
+ get "settings", to: redirect('projects/%{id}/settings/general/')
get :copy
patch :types
# Destroy uses a get request to prompt the user before the actual DELETE request
- get :destroy_info, as: "confirm_destroy"
+ get :destroy_info, as: 'confirm_destroy'
end
resources :versions, only: %i[new create] do
@@ -222,7 +222,7 @@
# this is only another name for versions#index
# For nice "road in the url for the index action
# this could probably be rewritten with a resource as: 'roadmap'
- get "/roadmap" => "versions#index"
+ get '/roadmap' => 'versions#index'
resources :news, only: %i[index new create]
@@ -233,25 +233,25 @@
constraints: { id: /([^\/]+(?=\.markdown)|[^\/]+)/ },
except: %i[index create] do
collection do
- post "/new" => "wiki#create", as: "create"
+ post '/new' => 'wiki#create', as: 'create'
get :export
- get "/index" => "wiki#index"
+ get '/index' => 'wiki#index'
get :menu
end
member do
- get "/new" => "wiki#new_child", as: "new_child"
- get "/diff/:version/vs/:version_from" => "wiki#diff", as: "wiki_diff_compare"
- get "/diff(/:version)" => "wiki#diff", as: "wiki_diff"
- get "/annotate/:version" => "wiki#annotate", as: "wiki_annotate"
- get "/toc" => "wiki#index"
+ get '/new' => 'wiki#new_child', as: 'new_child'
+ get '/diff/:version/vs/:version_from' => 'wiki#diff', as: 'wiki_diff_compare'
+ get '/diff(/:version)' => 'wiki#diff', as: 'wiki_diff'
+ get '/annotate/:version' => 'wiki#annotate', as: 'wiki_annotate'
+ get '/toc' => 'wiki#index'
match :rename, via: %i[get patch]
- get :parent_page, action: "edit_parent_page"
- patch :parent_page, action: "update_parent_page"
+ get :parent_page, action: 'edit_parent_page'
+ patch :parent_page, action: 'update_parent_page'
get :history
post :protect
- get :select_main_menu_item, to: "wiki_menu_items#select_main_menu_item"
- post :replace_main_menu_item, to: "wiki_menu_items#replace_main_menu_item"
+ get :select_main_menu_item, to: 'wiki_menu_items#select_main_menu_item'
+ post :replace_main_menu_item, to: 'wiki_menu_items#replace_main_menu_item'
get :menu
end
end
@@ -260,24 +260,24 @@
# it is necessary to define the show action later
# than any other route as it otherwise would
# work as a catchall for everything under /wiki
- get "wiki" => "wiki#show"
+ get 'wiki' => 'wiki#show'
resources :work_packages, only: [] do
collection do
- get "/report/:detail" => "work_packages/reports#report_details"
- get "/report" => "work_packages/reports#report"
+ get '/report/:detail' => 'work_packages/reports#report_details'
+ get '/report' => 'work_packages/reports#report'
end
# states managed by client-side routing on work_package#index
- get "(/*state)" => "work_packages#index", on: :collection, as: ""
- get "/create_new" => "work_packages#index", on: :collection, as: "new_split"
- get "/new" => "work_packages#index", on: :collection, as: "new"
+ get '(/*state)' => 'work_packages#index', on: :collection, as: ''
+ get '/create_new' => 'work_packages#index', on: :collection, as: 'new_split'
+ get '/new' => 'work_packages#index', on: :collection, as: 'new'
# state for show view in project context
- get "(/*state)" => "work_packages#show", on: :member, as: ""
+ get '(/*state)' => 'work_packages#show', on: :member, as: ''
end
- resources :activity, :activities, only: :index, controller: "activities" do
+ resources :activity, :activities, only: :index, controller: 'activities' do
collection do
get :menu
end
@@ -303,7 +303,7 @@
resource :menu, only: %[show]
end
- resource :repository, controller: "repositories", except: [:new] do
+ resource :repository, controller: 'repositories', except: [:new] do
# Destroy uses a get request to prompt the user before the actual DELETE request
get :destroy_info
get :committers
@@ -311,36 +311,36 @@
get :graph
get :revisions
- get "/statistics", action: :stats, as: "stats"
+ get '/statistics', action: :stats, as: 'stats'
- get "(/revisions/:rev)/diff.:format", action: :diff
- get "(/revisions/:rev)/diff(/*repo_path)",
+ get '(/revisions/:rev)/diff.:format', action: :diff
+ get '(/revisions/:rev)/diff(/*repo_path)',
action: :diff,
- format: "html",
- constraints: { rev: /[\w.\-]+/, repo_path: /.*/ }
+ format: 'html',
+ constraints: { rev: /[\w0-9.\-_]+/, repo_path: /.*/ }
- get "(/revisions/:rev)/:format/*repo_path",
+ get '(/revisions/:rev)/:format/*repo_path',
action: :entry,
format: /raw/,
- rev: /[\w.\-]+/
+ rev: /[\w0-9.\-_]+/
%w{diff annotate changes entry browse}.each do |action|
get "(/revisions/:rev)/#{action}(/*repo_path)",
- format: "html",
+ format: 'html',
action:,
- constraints: { rev: /[\w.\-]+/, repo_path: /.*/ },
+ constraints: { rev: /[\w0-9.\-_]+/, repo_path: /.*/ },
as: "#{action}_revision"
end
- get "/revision(/:rev)", rev: /[\w.\-]+/,
+ get '/revision(/:rev)', rev: /[\w0-9.\-_]+/,
action: :revision,
- as: "show_revision"
+ as: 'show_revision'
- get "(/revisions/:rev)(/*repo_path)",
+ get '(/revisions/:rev)(/*repo_path)',
action: :show,
- format: "html",
- constraints: { rev: /[\w.\-]+/, repo_path: /.*/ },
- as: "show_revisions_path"
+ format: 'html',
+ constraints: { rev: /[\w0-9.\-_]+/, repo_path: /.*/ },
+ as: 'show_revisions_path'
end
end
@@ -352,52 +352,52 @@
end
end
- scope "admin" do
+ scope 'admin' do
resource :announcements, only: %i[edit update]
constraints(Constraints::Enterprise) do
resource :enterprise, only: %i[show create destroy]
- scope controller: "enterprises" do
- post "enterprise/save_trial_key" => "enterprises#save_trial_key"
- delete "enterprise/delete_trial_key" => "enterprises#delete_trial_key"
+ scope controller: 'enterprises' do
+ post 'enterprise/save_trial_key' => 'enterprises#save_trial_key'
+ delete 'enterprise/delete_trial_key' => 'enterprises#delete_trial_key'
end
end
resources :enumerations do
- post "move/:id", action: "move", on: :collection
+ post 'move/:id', action: 'move', on: :collection
end
- delete "design/logo" => "custom_styles#logo_delete", as: "custom_style_logo_delete"
- delete "design/export_logo" => "custom_styles#export_logo_delete", as: "custom_style_export_logo_delete"
- 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"
- 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",
- as: "update_custom_style_export_cover_text_color"
+ delete 'design/logo' => 'custom_styles#logo_delete', as: 'custom_style_logo_delete'
+ delete 'design/export_logo' => 'custom_styles#export_logo_delete', as: 'custom_style_export_logo_delete'
+ 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'
+ 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',
+ as: 'update_custom_style_export_cover_text_color'
- resource :custom_style, only: %i[update show create], path: "design"
+ resource :custom_style, only: %i[update show create], path: 'design'
resources :attribute_help_texts, only: %i(index new create edit update destroy) do
- get :upsale, to: "attribute_help_texts#upsale", on: :collection, as: :upsale
+ get :upsale, to: 'attribute_help_texts#upsale', on: :collection, as: :upsale
end
resources :groups, except: %i[show] do
member do
# this should be put into it's own resource
- post "/members" => "groups#add_users", as: "members_of"
- delete "/members/:user_id" => "groups#remove_user", as: "member_of"
+ post '/members' => 'groups#add_users', as: 'members_of'
+ delete '/members/:user_id' => 'groups#remove_user', as: 'member_of'
# this should be put into it's own resource
- patch "/memberships/:membership_id" => "groups#edit_membership", as: "membership_of"
- put "/memberships/:membership_id" => "groups#edit_membership"
- delete "/memberships/:membership_id" => "groups#destroy_membership"
- post "/memberships" => "groups#create_memberships", as: "memberships_of"
+ patch '/memberships/:membership_id' => 'groups#edit_membership', as: 'membership_of'
+ put '/memberships/:membership_id' => 'groups#edit_membership'
+ delete '/memberships/:membership_id' => 'groups#destroy_membership'
+ post '/memberships' => 'groups#create_memberships', as: 'memberships_of'
end
end
resources :roles, except: %i[show] do
collection do
- put "/" => "roles#bulk_update"
+ put '/' => 'roles#bulk_update'
get :report
end
end
@@ -422,37 +422,37 @@
patch tab[:name], controller: tab[:controller], action: :update, as: "update_#{tab[:name]}"
end
- resource :authentication, controller: "/admin/settings/authentication_settings", only: %i[show update]
- resource :attachments, controller: "/admin/settings/attachments_settings", only: %i[show update]
- resource :virus_scanning, controller: "/admin/settings/virus_scanning_settings", only: %i[show update] do
+ resource :authentication, controller: '/admin/settings/authentication_settings', only: %i[show update]
+ resource :attachments, controller: '/admin/settings/attachments_settings', only: %i[show update]
+ resource :virus_scanning, controller: '/admin/settings/virus_scanning_settings', only: %i[show update] do
collection do
get :av_form
end
end
- resource :incoming_mails, controller: "/admin/settings/incoming_mails_settings", only: %i[show update]
- resource :aggregation, controller: "/admin/settings/aggregation_settings", only: %i[show update]
- resource :mail_notifications, controller: "/admin/settings/mail_notifications_settings", only: %i[show update]
- resource :api, controller: "/admin/settings/api_settings", only: %i[show update]
- resource :work_packages, controller: "/admin/settings/work_packages_settings", only: %i[show update]
- resource :working_days, controller: "/admin/settings/working_days_settings", only: %i[show update]
- resource :users, controller: "/admin/settings/users_settings", only: %i[show update]
- resource :date_format, controller: "/admin/settings/date_format_settings", only: %i[show update]
- resource :icalendar, controller: "/admin/settings/icalendar_settings", only: %i[show update]
+ resource :incoming_mails, controller: '/admin/settings/incoming_mails_settings', only: %i[show update]
+ resource :aggregation, controller: '/admin/settings/aggregation_settings', only: %i[show update]
+ resource :mail_notifications, controller: '/admin/settings/mail_notifications_settings', only: %i[show update]
+ resource :api, controller: '/admin/settings/api_settings', only: %i[show update]
+ resource :work_packages, controller: '/admin/settings/work_packages_settings', only: %i[show update]
+ resource :working_days, controller: '/admin/settings/working_days_settings', only: %i[show update]
+ resource :users, controller: '/admin/settings/users_settings', only: %i[show update]
+ resource :date_format, controller: '/admin/settings/date_format_settings', only: %i[show update]
+ resource :icalendar, controller: '/admin/settings/icalendar_settings', only: %i[show update]
# Redirect /settings to general settings
- get "/", to: redirect("/admin/settings/general")
+ get '/', to: redirect('/admin/settings/general')
# Plugin settings
- get "plugin/:id", action: :show_plugin
- post "plugin/:id", action: :update_plugin
+ get 'plugin/:id', action: :show_plugin
+ post 'plugin/:id', action: :update_plugin
end
resources :quarantined_attachments,
- controller: "/admin/attachments/quarantined_attachments",
+ controller: '/admin/attachments/quarantined_attachments',
only: %i[index destroy]
- resource :backups, controller: "/admin/backups", only: %i[show] do
+ resource :backups, controller: '/admin/backups', only: %i[show] do
collection do
get :reset_token
post :reset_token, action: :perform_token_reset
@@ -465,48 +465,48 @@
resource :workflows, only: %i[edit update show] do
member do
# We should fix this crappy routing (split up and rename controller methods)
- match "copy", action: "copy", via: %i[get post]
+ match 'copy', action: 'copy', via: %i[get post]
end
end
namespace :work_packages do
- match "auto_complete" => "auto_completes#index", via: %i[get post]
- resource :bulk, controller: "bulk", only: %i[edit update destroy]
+ match 'auto_complete' => 'auto_completes#index', via: %i[get post]
+ resource :bulk, controller: 'bulk', only: %i[edit update destroy]
# FIXME: this is kind of evil!! We need to remove this soonest and
# cover the functionality. Route is being used in work-package-service.js:331
- get "/bulk" => "bulk#destroy"
+ get '/bulk' => 'bulk#destroy'
resources :shares, only: %i[destroy update]
end
resources :work_packages, only: [:index] do
# move bulk of wps
- get "move/new" => "work_packages/moves#new", on: :collection, as: "new_move"
- post "move" => "work_packages/moves#create", on: :collection, as: "move"
+ get 'move/new' => 'work_packages/moves#new', on: :collection, as: 'new_move'
+ post 'move' => 'work_packages/moves#create', on: :collection, as: 'move'
# move individual wp
- resource :move, controller: "work_packages/moves", only: %i[new create]
+ resource :move, controller: 'work_packages/moves', only: %i[new create]
# states managed by client-side routing on work_package#index
- get "details/*state" => "work_packages#index", on: :collection, as: :details
+ get 'details/*state' => 'work_packages#index', on: :collection, as: :details
# Rails managed sharing route
- resources :shares, controller: "work_packages/shares", only: %i[index create] do
+ resources :shares, controller: 'work_packages/shares', only: %i[index create] do
member do
- post "resend_invite" => "work_packages/shares#resend_invite"
+ post 'resend_invite' => 'work_packages/shares#resend_invite'
end
collection do
- resource :bulk, controller: "work_packages/shares/bulk", only: %i[update destroy], as: :shares_bulk
+ resource :bulk, controller: 'work_packages/shares/bulk', only: %i[update destroy], as: :shares_bulk
end
end
# states managed by client-side (angular) routing on work_package#show
- get "/" => "work_packages#index", on: :collection, as: "index"
- get "/create_new" => "work_packages#index", on: :collection, as: "new_split"
- get "/new" => "work_packages#index", on: :collection, as: "new", state: "new"
+ get '/' => 'work_packages#index', on: :collection, as: 'index'
+ get '/create_new' => 'work_packages#index', on: :collection, as: 'new_split'
+ 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+/ }
- get "/share_upsale" => "work_packages#index", on: :collection, as: "share_upsale"
- get "/edit" => "work_packages#show", on: :member, as: "edit"
+ get '(/*state)' => 'work_packages#show', on: :member, as: '', constraints: { id: /\d+/ }
+ get '/share_upsale' => 'work_packages#index', on: :collection, as: 'share_upsale'
+ get '/edit' => 'work_packages#show', on: :member, as: 'edit'
end
resources :versions, only: %i[show edit update destroy] do
@@ -515,18 +515,18 @@
end
end
- resources :activity, :activities, only: :index, controller: "activities" do
+ resources :activity, :activities, only: :index, controller: 'activities' do
collection do
get :menu
end
end
resources :users, constraints: { id: /(\d+|me)/ }, except: :edit do
- resources :memberships, controller: "users/memberships", only: %i[update create destroy]
+ resources :memberships, controller: 'users/memberships', only: %i[update create destroy]
member do
- get "/edit(/:tab)" => "users#edit", as: "edit"
- get "/change_status/:change_action" => "users#change_status_info", as: "change_status_info"
+ get '/edit(/:tab)' => 'users#edit', as: 'edit'
+ get '/change_status/:change_action' => 'users#change_status_info', as: 'change_status_info'
post :change_status
post :resend_invitation
get :deletion_info
@@ -534,10 +534,10 @@
end
resources :placeholder_users, except: :edit do
- resources :memberships, controller: "placeholder_users/memberships", only: %i[update create destroy]
+ resources :memberships, controller: 'placeholder_users/memberships', only: %i[update create destroy]
member do
- get "/edit(/:tab)" => "placeholder_users#edit", as: "edit"
+ get '/edit(/:tab)' => 'placeholder_users#edit', as: 'edit'
get :deletion_info
end
end
@@ -546,33 +546,33 @@
resources :groups, only: %i[show], as: :show_group
resources :forums, only: [] do
- resources :topics, controller: "messages", except: [:index], shallow: true do
+ resources :topics, controller: 'messages', except: [:index], shallow: true do
member do
get :quote
- post :reply, as: "reply_to"
+ post :reply, as: 'reply_to'
end
end
end
resources :news, only: %i[index destroy update edit show] do
- resources :comments, controller: "news/comments", only: %i[create destroy], shallow: true
+ resources :comments, controller: 'news/comments', only: %i[create destroy], shallow: true
end
# redirect for backwards compatibility
- scope "attachments",
+ scope 'attachments',
constraints: { id: /\d+/, filename: /[^\/]*/ },
format: false do
- get "/download/:id/:filename",
+ get '/download/:id/:filename',
to: redirect("#{rails_relative_url_root}/attachments/%{id}/%{filename}")
- get "/download/:id",
+ get '/download/:id',
to: redirect("#{rails_relative_url_root}/attachments/%{id}")
- scope ":id" do
- get "(/:filename)",
+ scope ':id' do
+ get '(/:filename)',
to: redirect("#{rails_relative_url_root}/api/v3/attachments/%{id}/content")
- delete "",
+ delete '',
to: redirect("#{rails_relative_url_root}/api/v3/attachments/%{id}")
end
end
@@ -584,45 +584,45 @@
end
end
- scope controller: "sys" do
- match "/sys/repo_auth", action: "repo_auth", via: %i[get post]
- get "/sys/projects", action: "projects"
- get "/sys/fetch_changesets", action: "fetch_changesets"
- get "/sys/projects/:id/repository/update_storage", action: "update_required_storage"
+ scope controller: 'sys' do
+ match '/sys/repo_auth', action: 'repo_auth', via: %i[get post]
+ get '/sys/projects', action: 'projects'
+ get '/sys/fetch_changesets', action: 'fetch_changesets'
+ get '/sys/projects/:id/repository/update_storage', action: 'update_required_storage'
end
# alternate routes for the current user
- scope "my" do
- get "/deletion_info" => "users#deletion_info", as: "delete_my_account_info"
- post "/oauth/revoke_application/:application_id" => "oauth/grants#revoke_application", as: "revoke_my_oauth_application"
- delete "/storage_token/:id" => "my#delete_storage_token", as: "storage_token_delete"
+ scope 'my' do
+ get '/deletion_info' => 'users#deletion_info', as: 'delete_my_account_info'
+ post '/oauth/revoke_application/:application_id' => 'oauth/grants#revoke_application', as: 'revoke_my_oauth_application'
+ delete '/storage_token/:id' => 'my#delete_storage_token', as: 'storage_token_delete'
- resources :sessions, controller: "my/sessions", as: "my_sessions", only: %i[index show destroy]
- resources :auto_login_tokens, controller: "my/auto_login_tokens", as: "my_auto_login_tokens", only: %i[destroy]
+ resources :sessions, controller: 'my/sessions', as: 'my_sessions', only: %i[index show destroy]
+ resources :auto_login_tokens, controller: 'my/auto_login_tokens', as: 'my_auto_login_tokens', only: %i[destroy]
end
- scope controller: "my" do
- get "/my/password", action: "password"
- post "/my/change_password", action: "change_password"
+ scope controller: 'my' do
+ get '/my/password', action: 'password'
+ post '/my/change_password', action: 'change_password'
- get "/my/account", action: "account"
- get "/my/settings", action: "settings"
- get "/my/notifications", action: "notifications"
- get "/my/reminders", action: "reminders"
+ get '/my/account', action: 'account'
+ get '/my/settings', action: 'settings'
+ get '/my/notifications', action: 'notifications'
+ get '/my/reminders', action: 'reminders'
- patch "/my/account", action: "update_account"
- patch "/my/settings", action: "update_settings"
+ patch '/my/account', action: 'update_account'
+ patch '/my/settings', action: 'update_settings'
- post "/my/generate_rss_key", action: "generate_rss_key"
- delete "/my/revoke_rss_key", action: "revoke_rss_key"
- post "/my/generate_api_key", action: "generate_api_key"
- delete "/my/revoke_api_key", action: "revoke_api_key"
- delete "/my/revoke_ical_token", action: "revoke_ical_token"
- get "/my/access_token", action: "access_token"
+ post '/my/generate_rss_key', action: 'generate_rss_key'
+ delete '/my/revoke_rss_key', action: 'revoke_rss_key'
+ post '/my/generate_api_key', action: 'generate_api_key'
+ delete '/my/revoke_api_key', action: 'revoke_api_key'
+ delete '/my/revoke_ical_token', action: 'revoke_ical_token'
+ get '/my/access_token', action: 'access_token'
end
- scope controller: "onboarding" do
- patch "user_settings", action: "user_settings"
+ scope controller: 'onboarding' do
+ patch 'user_settings', action: 'user_settings'
end
resources :colors do
@@ -633,25 +633,21 @@
end
end
- get "/robots" => "homescreen#robots", defaults: { format: :txt }
+ get '/robots' => 'homescreen#robots', defaults: { format: :txt }
- root to: "account#login"
+ root to: 'account#login'
scope :notifications do
- get "(/*state)", to: "angular#notifications_layout", as: :notifications_center
+ get '(/*state)', to: 'angular#notifications_layout', as: :notifications_center
end
# OAuthClient needs a "callback" URL that Nextcloud calls with a "code" (see OAuth2 RFC)
- scope "oauth_clients/:oauth_client_id" do
- get "callback", controller: "oauth_clients", action: :callback
- get "ensure_connection", controller: "oauth_clients", action: :ensure_connection, as: "oauth_clients_ensure_connection"
+ scope 'oauth_clients/:oauth_client_id' do
+ get 'callback', controller: 'oauth_clients', action: :callback
+ get 'ensure_connection', controller: 'oauth_clients', action: :ensure_connection, as: 'oauth_clients_ensure_connection'
end
if OpenProject::Configuration.lookbook_enabled?
mount Lookbook::Engine, at: "/lookbook"
end
-
- if Rails.env.development?
- mount GoodJob::Engine => "good_job"
- end
end
diff --git a/db/migrate/10000000000000_to_v710_aggregated_migrations.rb b/db/migrate/10000000000000_to_v710_aggregated_migrations.rb
index 028afd8fe62e..db910bc79889 100644
--- a/db/migrate/10000000000000_to_v710_aggregated_migrations.rb
+++ b/db/migrate/10000000000000_to_v710_aggregated_migrations.rb
@@ -122,7 +122,7 @@ def up
end
def down
- raise ActiveRecord::IrreversibleMigration, "Use OpenProject v7.4 for the down migrations"
+ raise ActiveRecord::IrreversibleMigration, 'Use OpenProject v7.4 for the down migrations'
end
private
@@ -137,7 +137,7 @@ def run_aggregated_migrations
# been applied. In this case, remove the information about those
# migrations from the schema_migrations table and we're done.
def remove_applied_migration_entries(intersection)
- execute <<-SQL + (intersection.map { |version| <<-CONDITIONS }).join(" OR ")
+ execute <<-SQL + (intersection.map { |version| <<-CONDITIONS }).join(' OR ')
DELETE FROM
#{quoted_schema_migrations_table_name}
WHERE
@@ -147,11 +147,11 @@ def remove_applied_migration_entries(intersection)
end
def raise_on_incomplete_3_0_migrations
- raise_on_incomplete_migrations(aggregated_versions_3_0, "v2.4.0", "ChiliProject")
+ raise_on_incomplete_migrations(aggregated_versions_3_0, 'v2.4.0', 'ChiliProject')
end
def raise_on_incomplete_7_1_migrations
- raise_on_incomplete_migrations(aggregated_versions_7_1, "v7.4.0", "OpenProject")
+ raise_on_incomplete_migrations(aggregated_versions_7_1, 'v7.4.0', 'OpenProject')
end
def raise_on_incomplete_migrations(aggregated_versions, version_number, app_name)
@@ -163,7 +163,7 @@ def raise_on_incomplete_migrations(aggregated_versions, version_number, app_name
# Only a part of the migrations that this migration aggregates
# have already been applied. In this case, fail miserably.
- raise IncompleteMigrationsError, <<-MESSAGE.split("\n").map(&:strip!).join(" ") + "\n"
+ raise IncompleteMigrationsError, <<-MESSAGE.split("\n").map(&:strip!).join(' ') + "\n"
It appears you are migrating from an incompatible version of
#{app_name}. Yourdatabase has only some migrations from #{app_name} <
#{version_number} Please update your database to the schema of #{app_name}
@@ -200,7 +200,7 @@ def quoted_schema_migrations_table_name
end
def quoted_version_column_name
- ActiveRecord::Base.connection.quote_table_name("version")
+ ActiveRecord::Base.connection.quote_table_name('version')
end
def version_column_for_comparison
diff --git a/db/migrate/20100528100562_aggregated_global_roles_migrations.rb b/db/migrate/20100528100562_aggregated_global_roles_migrations.rb
index 899eb505e311..022ab3c19993 100644
--- a/db/migrate/20100528100562_aggregated_global_roles_migrations.rb
+++ b/db/migrate/20100528100562_aggregated_global_roles_migrations.rb
@@ -27,19 +27,19 @@
#++
require Rails.root.join("db/migrate/migration_utils/migration_squasher").to_s
-require "open_project/plugins/migration_mapping"
+require 'open_project/plugins/migration_mapping'
# This migration aggregates the migrations detailed in MIGRATION_FILES
class AggregatedGlobalRolesMigrations < ActiveRecord::Migration[5.0]
MIGRATION_FILES = <<-MIGRATIONS
001_sti_for_roles.rb
MIGRATIONS
- OLD_PLUGIN_NAME = "redmine_global_roles"
+ OLD_PLUGIN_NAME = 'redmine_global_roles'
def up
migration_names = OpenProject::Plugins::MigrationMapping.migration_files_to_migration_names(MIGRATION_FILES, OLD_PLUGIN_NAME)
Migration::MigrationSquasher.squash(migration_names) do
- add_column :roles, :type, :string, limit: 30, default: "Role"
+ add_column :roles, :type, :string, limit: 30, default: 'Role'
ActiveRecord::Base.connection.execute("UPDATE roles SET type='Role';")
diff --git a/db/migrate/20170829095701_generate_wp_closure.rb b/db/migrate/20170829095701_generate_wp_closure.rb
index 60c6e4d6f07d..94eacfc0b0fe 100644
--- a/db/migrate/20170829095701_generate_wp_closure.rb
+++ b/db/migrate/20170829095701_generate_wp_closure.rb
@@ -44,7 +44,7 @@ def up
def down
recreate_nested_set_columns
- invert_from_to_on_follows("follows = 1")
+ invert_from_to_on_follows('follows = 1')
set_parent_id
@@ -94,7 +94,7 @@ def remove_hierarchy_relations
end
def invert_from_to_on_follows(condition)
- if ActiveRecord::Base.connection.adapter_name == "Mysql2"
+ if ActiveRecord::Base.connection.adapter_name == 'Mysql2'
ActiveRecord::Base.connection.execute <<-SQL
UPDATE
relations r1,
@@ -223,9 +223,9 @@ def rebuild_nested_set
end
class NestedSetWorkPackage < ActiveRecord::Base
- self.table_name = "work_packages"
+ self.table_name = 'work_packages'
- acts_as_nested_set scope: "root_id", dependent: :destroy
+ acts_as_nested_set scope: 'root_id', dependent: :destroy
include OpenProject::NestedSet::RebuildPatch
end
diff --git a/db/migrate/20171106074835_move_hashed_token_to_core.rb b/db/migrate/20171106074835_move_hashed_token_to_core.rb
index a17e0403f0f4..efa290af60d1 100644
--- a/db/migrate/20171106074835_move_hashed_token_to_core.rb
+++ b/db/migrate/20171106074835_move_hashed_token_to_core.rb
@@ -57,7 +57,7 @@ def create_tokens_table
def migrate_existing_tokens
# API tokens
::Token::API.transaction do
- OldToken.where(action: "api").find_each do |token|
+ OldToken.where(action: 'api').find_each do |token|
result = ::Token::API.create(user_id: token.user_id, value: ::Token::API.hash_function(token.value))
warn "Failed to migrate API token for ##{user.id}" unless result
end
@@ -65,7 +65,7 @@ def migrate_existing_tokens
# RSS tokens
::Token::RSS.transaction do
- OldToken.where(action: "feeds").find_each do |token|
+ OldToken.where(action: 'feeds').find_each do |token|
result = ::Token::RSS.create(user_id: token.user_id, value: token.value)
warn "Failed to migrate RSS token for ##{user.id}" unless result
end
diff --git a/db/migrate/20180105130053_rebuild_dag.rb b/db/migrate/20180105130053_rebuild_dag.rb
index 8a61cfa404a6..c171f29c468f 100644
--- a/db/migrate/20180105130053_rebuild_dag.rb
+++ b/db/migrate/20180105130053_rebuild_dag.rb
@@ -25,8 +25,8 @@
#
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "migration_utils/utils"
-require_relative "migration_utils/typed_dag"
+require_relative 'migration_utils/utils'
+require_relative 'migration_utils/typed_dag'
class RebuildDag < ActiveRecord::Migration[5.0]
include ::Migration::Utils
@@ -47,10 +47,10 @@ def up
add_index :relations,
%i(from_id to_id hierarchy relates duplicates blocks follows includes requires),
- name: "index_relations_on_type_columns",
+ name: 'index_relations_on_type_columns',
unique: true
- say_with_time "Building the directed acyclic graph of all relations. This might take a while." do
+ say_with_time 'Building the directed acyclic graph of all relations. This might take a while.' do
Migration::MigrationUtils::TypedDag::WorkPackage.rebuild_dag! 1000
end
@@ -66,11 +66,11 @@ def down
remove_column :relations, :count
end
- remove_index_if_exists :relations, "index_relations_hierarchy_follows_scheduling"
- remove_index_if_exists :relations, "index_relations_only_hierarchy"
- remove_index_if_exists :relations, "index_relations_to_from_only_follows"
- remove_index_if_exists :relations, "index_relations_direct_non_hierarchy"
- remove_index_if_exists :relations, "index_relations_on_type_columns"
+ remove_index_if_exists :relations, 'index_relations_hierarchy_follows_scheduling'
+ remove_index_if_exists :relations, 'index_relations_only_hierarchy'
+ remove_index_if_exists :relations, 'index_relations_to_from_only_follows'
+ remove_index_if_exists :relations, 'index_relations_direct_non_hierarchy'
+ remove_index_if_exists :relations, 'index_relations_on_type_columns'
truncate_closure_entries
end
@@ -79,7 +79,7 @@ def down
def add_count_index
# supports finding relations that are to be deleted
- add_index :relations, :count, where: "count = 0"
+ add_index :relations, :count, where: 'count = 0'
end
def add_scheduling_indices
@@ -87,7 +87,7 @@ def add_scheduling_indices
# has been moved
add_index :relations,
%i(to_id hierarchy follows from_id),
- name: "index_relations_hierarchy_follows_scheduling",
+ name: 'index_relations_hierarchy_follows_scheduling',
where: <<-SQL
relations.relates = 0
AND relations.duplicates = 0
@@ -99,7 +99,7 @@ def add_scheduling_indices
add_index :relations,
%i(from_id to_id hierarchy),
- name: "index_relations_only_hierarchy",
+ name: 'index_relations_only_hierarchy',
where: <<-SQL
relations.relates = 0
AND relations.duplicates = 0
@@ -111,7 +111,7 @@ def add_scheduling_indices
add_index :relations,
%i(to_id follows from_id),
- name: "index_relations_to_from_only_follows",
+ name: 'index_relations_to_from_only_follows',
where: <<-SQL
hierarchy = 0
AND relates = 0
@@ -126,8 +126,8 @@ def add_non_hierarchy_index
# supports finding relations via the api as only non hierarchy relations are returned
add_index :relations,
:from_id,
- name: "index_relations_direct_non_hierarchy",
- where: "(hierarchy + relates + duplicates + follows + blocks + includes + requires = 1) AND relations.hierarchy = 0"
+ name: 'index_relations_direct_non_hierarchy',
+ where: '(hierarchy + relates + duplicates + follows + blocks + includes + requires = 1) AND relations.hierarchy = 0'
end
def set_count_to_1
@@ -150,7 +150,7 @@ def truncate_closure_entries
def remove_duplicate_relations
equal_conditions = relation_types.map do |type|
"r1.#{type} = r2.#{type}"
- end.join(" AND ")
+ end.join(' AND ')
ActiveRecord::Base.connection.execute <<-SQL
DELETE
diff --git a/db/migrate/20180108132929_vacuum_relations.rb b/db/migrate/20180108132929_vacuum_relations.rb
index 511ec3e4fd58..9b69feab2d1d 100644
--- a/db/migrate/20180108132929_vacuum_relations.rb
+++ b/db/migrate/20180108132929_vacuum_relations.rb
@@ -30,8 +30,8 @@ class VacuumRelations < ActiveRecord::Migration[5.0]
disable_ddl_transaction!
def up
- if ActiveRecord::Base.connection.adapter_name == "PostgreSQL"
- connection.execute "vacuum relations"
+ if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
+ connection.execute 'vacuum relations'
end
end
end
diff --git a/db/migrate/20180117065255_remove_timelines_and_reportings.rb b/db/migrate/20180117065255_remove_timelines_and_reportings.rb
index d46c111f4760..8f8eb7b5e17c 100644
--- a/db/migrate/20180117065255_remove_timelines_and_reportings.rb
+++ b/db/migrate/20180117065255_remove_timelines_and_reportings.rb
@@ -73,7 +73,7 @@ def create_timelines
def create_available_project_statuses
create_table(:available_project_statuses, id: :integer) do |t|
t.belongs_to :project_type
- t.belongs_to :reported_project_status, index: { name: "index_avail_project_statuses_on_rep_project_status_id" }
+ t.belongs_to :reported_project_status, index: { name: 'index_avail_project_statuses_on_rep_project_status_id' }
t.timestamps
end
diff --git a/db/migrate/20180305130811_remove_wiki_content_versions.rb b/db/migrate/20180305130811_remove_wiki_content_versions.rb
index 5662f355c9d2..18409d5f9d11 100644
--- a/db/migrate/20180305130811_remove_wiki_content_versions.rb
+++ b/db/migrate/20180305130811_remove_wiki_content_versions.rb
@@ -37,13 +37,13 @@ def down
t.integer :page_id, null: false
t.integer :author_id
t.binary :data, limit: 16.megabytes
- t.string :compression, limit: 6, default: ""
- t.string :comments, default: ""
+ t.string :compression, limit: 6, default: ''
+ t.string :comments, default: ''
t.datetime :updated_on, null: false
t.integer :version, null: false
end
- add_index :wiki_content_versions, [:updated_on], name: "index_wiki_content_versions_on_updated_on"
- add_index :wiki_content_versions, [:wiki_content_id], name: "wiki_content_versions_wcid"
+ add_index :wiki_content_versions, [:updated_on], name: 'index_wiki_content_versions_on_updated_on'
+ add_index :wiki_content_versions, [:wiki_content_id], name: 'wiki_content_versions_wcid'
end
end
diff --git a/db/migrate/20180419061910_timestamp_for_caching.rb b/db/migrate/20180419061910_timestamp_for_caching.rb
index 19f13c1596ba..49e7ab6ee421 100644
--- a/db/migrate/20180419061910_timestamp_for_caching.rb
+++ b/db/migrate/20180419061910_timestamp_for_caching.rb
@@ -28,7 +28,7 @@
class TimestampForCaching < ActiveRecord::Migration[5.1]
class MigratingAuthSource < ApplicationRecord
- self.table_name = "auth_sources"
+ self.table_name = 'auth_sources'
end
def change
diff --git a/db/migrate/20180524084654_remove_non_null_container_on_attachments.rb b/db/migrate/20180524084654_remove_non_null_container_on_attachments.rb
index 0c8339d6211a..63e4498e355b 100644
--- a/db/migrate/20180524084654_remove_non_null_container_on_attachments.rb
+++ b/db/migrate/20180524084654_remove_non_null_container_on_attachments.rb
@@ -32,13 +32,13 @@ def change
change_column_null :attachments, :container_type, true
change_column_default :attachments, :container_id, from: 0, to: nil
- change_column_default :attachments, :container_type, from: "", to: nil
+ change_column_default :attachments, :container_type, from: '', to: nil
change_column_null :attachment_journals, :container_id, true
change_column_null :attachment_journals, :container_type, true
change_column_default :attachment_journals, :container_id, from: 0, to: nil
- change_column_default :attachment_journals, :container_type, from: "", to: nil
+ change_column_default :attachment_journals, :container_type, from: '', to: nil
add_column :attachments, :updated_at, :datetime
rename_column :attachments, :created_on, :created_at
diff --git a/db/migrate/20180706150714_convert_to_markdown.rb b/db/migrate/20180706150714_convert_to_markdown.rb
index 1da5c0af589b..0b2123ad43b7 100644
--- a/db/migrate/20180706150714_convert_to_markdown.rb
+++ b/db/migrate/20180706150714_convert_to_markdown.rb
@@ -28,10 +28,10 @@
class ConvertToMarkdown < ActiveRecord::Migration[5.1]
def up
- setting = Setting.where(name: "text_formatting").pluck(:value)
- return unless setting && setting[0] == "textile"
+ setting = Setting.where(name: 'text_formatting').pluck(:value)
+ return unless setting && setting[0] == 'textile'
- if ENV["OPENPROJECT_SKIP_TEXTILE_MIGRATION"].present?
+ if ENV['OPENPROJECT_SKIP_TEXTILE_MIGRATION'].present?
warn <<~WARNING
Your instance is configured with Textile text formatting, this means you have likely been running OpenProject before 8.0.0
@@ -49,7 +49,7 @@ def up
return
end
- if setting && setting[0] == "textile"
+ if setting && setting[0] == 'textile'
raise <<~ERROR
You appear to be upgrading from an old version of OpenProject using textile text formatters.
diff --git a/db/migrate/20180830120550_migrate_light_background_themes.rb b/db/migrate/20180830120550_migrate_light_background_themes.rb
index 0a8140fd583e..0653b2a3baab 100644
--- a/db/migrate/20180830120550_migrate_light_background_themes.rb
+++ b/db/migrate/20180830120550_migrate_light_background_themes.rb
@@ -42,29 +42,29 @@ def up
return unless apply?
# Main menu was set to white
- if DesignColor.find_by(variable: "main-menu-bg-color")&.hexcode == "#FFFFFF"
+ if DesignColor.find_by(variable: 'main-menu-bg-color')&.hexcode == '#FFFFFF'
set_old_default_menu_colors
end
# Header is white and main menu was default light grey
- if DesignColor.find_by(variable: "header-bg-color")&.hexcode == "#FFFFFF" &&
- DesignColor.find_by(variable: "main-menu-bg-color").nil?
- set_variable("main-menu-bg-color", "#F8F8F8")
+ if DesignColor.find_by(variable: 'header-bg-color')&.hexcode == '#FFFFFF' &&
+ DesignColor.find_by(variable: 'main-menu-bg-color').nil?
+ set_variable('main-menu-bg-color', '#F8F8F8')
set_old_default_menu_colors
end
end
def set_old_default_menu_colors
- content_link_color = DesignColor.find_by(variable: "content-link-color")&.hexcode ||
- DesignColor.find_by(variable: "primary-color-dark")&.hexcode ||
+ content_link_color = DesignColor.find_by(variable: 'content-link-color')&.hexcode ||
+ DesignColor.find_by(variable: 'primary-color-dark')&.hexcode ||
"#175A8E"
- set_variable("main-menu-font-color", "#333333")
- set_variable("main-menu-bg-selected-background", "#E9E9E9")
- set_variable("main-menu-selected-font-color", content_link_color)
- set_variable("main-menu-bg-hover-background", "#F0F0F0")
- set_variable("main-menu-hover-font-color", "#333333")
- set_variable("main-menu-border-color", "#E7E7E7")
+ set_variable('main-menu-font-color', '#333333')
+ set_variable('main-menu-bg-selected-background', '#E9E9E9')
+ set_variable('main-menu-selected-font-color', content_link_color)
+ set_variable('main-menu-bg-hover-background', '#F0F0F0')
+ set_variable('main-menu-hover-font-color', '#333333')
+ set_variable('main-menu-border-color', '#E7E7E7')
end
def set_variable(variable_name, hexcode)
diff --git a/db/migrate/20181112125034_create_doorkeeper_tables.rb b/db/migrate/20181112125034_create_doorkeeper_tables.rb
index 4313df4ff752..77f5b2ace9df 100644
--- a/db/migrate/20181112125034_create_doorkeeper_tables.rb
+++ b/db/migrate/20181112125034_create_doorkeeper_tables.rb
@@ -36,7 +36,7 @@ def change
t.integer :owner_id
t.integer :client_credentials_user_id
t.text :redirect_uri, null: false
- t.string :scopes, null: false, default: ""
+ t.string :scopes, null: false, default: ''
t.boolean :confidential, null: false, default: true
t.timestamps null: false
end
diff --git a/db/migrate/20190220080647_migrate_my_page_layout.rb b/db/migrate/20190220080647_migrate_my_page_layout.rb
index 53869baa4998..d72bfca54885 100644
--- a/db/migrate/20190220080647_migrate_my_page_layout.rb
+++ b/db/migrate/20190220080647_migrate_my_page_layout.rb
@@ -61,7 +61,7 @@ def migrate_my_page(user_id, old_layout)
start_row = 1
# Give every widget a fixed height of 4 rows
widget_height = 4
- (old_layout["top"] || []).each do |block|
+ (old_layout['top'] || []).each do |block|
map_widget my_page,
old_name: block,
start_row:,
@@ -74,7 +74,7 @@ def migrate_my_page(user_id, old_layout)
# Migrate left
left_row = start_row
- (old_layout["left"] || []).each do |block|
+ (old_layout['left'] || []).each do |block|
map_widget my_page,
old_name: block,
start_row: left_row,
@@ -87,7 +87,7 @@ def migrate_my_page(user_id, old_layout)
# Migrate right
right_row = start_row
- (old_layout["right"] || []).each do |block|
+ (old_layout['right'] || []).each do |block|
map_widget my_page,
old_name: block,
start_row: right_row,
@@ -107,7 +107,7 @@ def migrate_my_page(user_id, old_layout)
def remove_old_my_page(pref)
# There are some cases where keys where not symbolized
pref.others.delete(:my_page_layout)
- pref.others.delete("my_page_layout")
+ pref.others.delete('my_page_layout')
pref.save
end
diff --git a/db/migrate/20190227163226_add_tls_mode_to_auth_sources.rb b/db/migrate/20190227163226_add_tls_mode_to_auth_sources.rb
index 52360fa37907..0da94f8cbfd0 100644
--- a/db/migrate/20190227163226_add_tls_mode_to_auth_sources.rb
+++ b/db/migrate/20190227163226_add_tls_mode_to_auth_sources.rb
@@ -28,7 +28,7 @@
class AddTlsModeToAuthSources < ActiveRecord::Migration[5.2]
class MigratingAuthSource < ApplicationRecord
- self.table_name = "auth_sources"
+ self.table_name = 'auth_sources'
end
def change
diff --git a/db/migrate/20190301122554_remove_hierarchy_paths.rb b/db/migrate/20190301122554_remove_hierarchy_paths.rb
index 473c3864a33f..58a852737842 100644
--- a/db/migrate/20190301122554_remove_hierarchy_paths.rb
+++ b/db/migrate/20190301122554_remove_hierarchy_paths.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "20180116065518_add_hierarchy_paths"
+require_relative '20180116065518_add_hierarchy_paths'
class RemoveHierarchyPaths < ActiveRecord::Migration[5.2]
def up
@@ -60,7 +60,7 @@ def down
##
# Map parent sort_criteria to id asc.
def map_parent_to_id(criteria)
- if criteria.first.to_s == "parent"
+ if criteria.first.to_s == 'parent'
%w[id asc]
else
criteria
diff --git a/db/migrate/20190312083304_rename_boards_to_forums.rb b/db/migrate/20190312083304_rename_boards_to_forums.rb
index 0b4b2c6b1b3c..046fc6252afa 100644
--- a/db/migrate/20190312083304_rename_boards_to_forums.rb
+++ b/db/migrate/20190312083304_rename_boards_to_forums.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "tables/forums"
+require_relative 'tables/forums'
class RenameBoardsToForums < ActiveRecord::Migration[5.2]
def up
@@ -39,9 +39,9 @@ def up
rename_column :message_journals, :board_id, :forum_id
# Rename string references in DB to forums
- EnabledModule.where(name: "boards").update_all(name: "forums")
- RolePermission.where(permission: "manage_boards").update_all(permission: "manage_forums")
- Watcher.where(watchable_type: "Board").update_all(watchable_type: "Forum")
+ EnabledModule.where(name: 'boards').update_all(name: 'forums')
+ RolePermission.where(permission: 'manage_boards').update_all(permission: 'manage_forums')
+ Watcher.where(watchable_type: 'Board').update_all(watchable_type: 'Forum')
# Finally, drop the old table
drop_table :boards
@@ -54,8 +54,8 @@ def down
rename_column :message_journals, :forum_id, :board_id
# Rename back items
- EnabledModule.where(name: "forums").update_all(name: "boards")
- RolePermission.where(permission: "manage_forums").update_all(permission: "manage_boards")
- Watcher.where(watchable_type: "Forum").update_all(watchable_type: "Board")
+ EnabledModule.where(name: 'forums').update_all(name: 'boards')
+ RolePermission.where(permission: 'manage_forums').update_all(permission: 'manage_boards')
+ Watcher.where(watchable_type: 'Forum').update_all(watchable_type: 'Board')
end
end
diff --git a/db/migrate/20190502102512_ensure_postgres_index_names.rb b/db/migrate/20190502102512_ensure_postgres_index_names.rb
index 1d3a19ea8261..901f3fd8e639 100644
--- a/db/migrate/20190502102512_ensure_postgres_index_names.rb
+++ b/db/migrate/20190502102512_ensure_postgres_index_names.rb
@@ -42,8 +42,8 @@ def up
SQL
ActiveRecord::Base.connection.execute(sql).each do |entry|
- old_name = entry["old_name"]
- new_name = entry["new_name"]
+ old_name = entry['old_name']
+ new_name = entry['new_name']
ActiveRecord::Base.transaction do
execute %(ALTER INDEX "#{old_name}" RENAME TO #{new_name};)
diff --git a/db/migrate/20190507132517_add_board_view_to_roles.rb b/db/migrate/20190507132517_add_board_view_to_roles.rb
index e407292e2ada..3f7fb964788d 100644
--- a/db/migrate/20190507132517_add_board_view_to_roles.rb
+++ b/db/migrate/20190507132517_add_board_view_to_roles.rb
@@ -34,8 +34,8 @@ def up
.add(:view_work_packages,
:show_board_views)
- unless Setting.default_projects_modules.include?("board_view")
- Setting.default_projects_modules = Setting.default_projects_modules + ["board_view"]
+ unless Setting.default_projects_modules.include?('board_view')
+ Setting.default_projects_modules = Setting.default_projects_modules + ['board_view']
end
end
diff --git a/db/migrate/20190618115620_fix_available_languages.rb b/db/migrate/20190618115620_fix_available_languages.rb
index 42f3cf8e1e12..9b6835ec2034 100644
--- a/db/migrate/20190618115620_fix_available_languages.rb
+++ b/db/migrate/20190618115620_fix_available_languages.rb
@@ -28,34 +28,34 @@
class FixAvailableLanguages < ActiveRecord::Migration[5.2]
def up
- if Setting.where(name: "available_languages").exists? # rubocop:disable Rails/WhereExists
+ if Setting.where(name: 'available_languages').exists? # rubocop:disable Rails/WhereExists
Setting.reset_column_information
Setting.available_languages = Setting.available_languages.map do |lang|
- if lang == "zh"
- "zh-CN"
+ if lang == 'zh'
+ 'zh-CN'
else
lang
end
end
end
- User.where(language: "zh").update_all(language: "zh-CN")
+ User.where(language: 'zh').update_all(language: 'zh-CN')
end
def down
- if Setting.where(name: "available_languages").exists? # rubocop:disable Rails/WhereExists
+ if Setting.where(name: 'available_languages').exists? # rubocop:disable Rails/WhereExists
Setting.reset_column_information
Setting.available_languages = Setting.available_languages.map do |lang|
- if lang == "zh-CN"
- "zh"
+ if lang == 'zh-CN'
+ 'zh'
else
lang
end
end
end
- User.where(language: "zh-CN").update_all(language: "zh")
+ User.where(language: 'zh-CN').update_all(language: 'zh')
end
end
diff --git a/db/migrate/20190710132957_rename_my_page_widgets.rb b/db/migrate/20190710132957_rename_my_page_widgets.rb
index fa991d11817a..a15f85f9fc55 100644
--- a/db/migrate/20190710132957_rename_my_page_widgets.rb
+++ b/db/migrate/20190710132957_rename_my_page_widgets.rb
@@ -31,13 +31,13 @@ def up
reset_column_information
Grids::MyPage.eager_load(:widgets, user: :preference).each do |page|
- I18n.with_locale(page.user&.language.presence || "en") do
+ I18n.with_locale(page.user&.language.presence || 'en') do
page.widgets.each(&method(:update_widget))
end
rescue I18n::InvalidLocale => e
Rails.logger.warn "Failed to use user locale from #{page.user.inspect}: #{e} #{e.message}. Correcting"
page.widgets.each(&method(:update_widget))
- page.user&.update_column(:language, "en")
+ page.user&.update_column(:language, 'en')
end
end
@@ -45,17 +45,17 @@ def up
def update_widget(widget)
case widget.identifier
- when "work_packages_assigned"
- update_table_widget(widget, "assignee")
- when "work_packages_accountable"
- update_table_widget(widget, "responsible")
- when "work_packages_created"
- update_table_widget(widget, "author")
- when "work_packages_watched"
- update_table_widget(widget, "watcher")
- when "work_packages_calendar", "news", "documents", "time_entries_current_user"
+ when 'work_packages_assigned'
+ update_table_widget(widget, 'assignee')
+ when 'work_packages_accountable'
+ update_table_widget(widget, 'responsible')
+ when 'work_packages_created'
+ update_table_widget(widget, 'author')
+ when 'work_packages_watched'
+ update_table_widget(widget, 'watcher')
+ when 'work_packages_calendar', 'news', 'documents', 'time_entries_current_user'
update_widget_name(widget)
- when "work_packages_table"
+ when 'work_packages_table'
update_query_widget(widget)
end
end
@@ -64,12 +64,12 @@ def update_table_widget(widget, filter_name)
widget.options = {
name: I18n.t("js.grid.widgets.#{widget.identifier}.title"),
queryProps: {
- "columns[]": %w(id project type subject),
+ 'columns[]': %w(id project type subject),
filters: JSON.dump([{ status: { operator: "o", values: [] } },
{ filter_name => { operator: "=", values: ["me"] } }])
}
}
- widget.identifier = "work_packages_table"
+ widget.identifier = 'work_packages_table'
widget.save(validate: false)
end
@@ -83,9 +83,9 @@ def update_widget_name(widget)
end
def update_query_widget(widget)
- query_id = widget.options["queryId"]
+ query_id = widget.options['queryId']
- name = Query.where(id: query_id).limit(1).pick(:name) || I18n.t("js.grid.widgets.work_packages_table.title")
+ name = Query.where(id: query_id).limit(1).pick(:name) || I18n.t('js.grid.widgets.work_packages_table.title')
widget.options = {
name:,
diff --git a/db/migrate/20190724093332_add_journal_versions_table.rb b/db/migrate/20190724093332_add_journal_versions_table.rb
index cdfaf1a128bf..f9dd416c5c91 100644
--- a/db/migrate/20190724093332_add_journal_versions_table.rb
+++ b/db/migrate/20190724093332_add_journal_versions_table.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "migration_utils/utils"
+require_relative 'migration_utils/utils'
class AddJournalVersionsTable < ActiveRecord::Migration[5.2]
include ::Migration::Utils
@@ -37,7 +37,7 @@ def up
t.integer :journable_id
t.integer :version, default: 0
t.index %i[journable_type journable_id version],
- name: "unique_journal_version",
+ name: 'unique_journal_version',
unique: true
end
diff --git a/db/migrate/20190920102446_clean_custom_values.rb b/db/migrate/20190920102446_clean_custom_values.rb
index d5207a17831f..13ca1ea4f248 100644
--- a/db/migrate/20190920102446_clean_custom_values.rb
+++ b/db/migrate/20190920102446_clean_custom_values.rb
@@ -31,7 +31,7 @@ def up
invalid_cv = CustomValue
.joins(:custom_field)
.where("#{CustomField.table_name}.field_format = 'list'")
- .where.not(value: "")
+ .where.not(value: '')
.where("value !~ '^[0-9]+$'")
if invalid_cv.count > 0
@@ -41,7 +41,7 @@ def up
end
warn warn_string
- invalid_cv.update_all(value: "")
+ invalid_cv.update_all(value: '')
end
end
diff --git a/db/migrate/20191216135213_join_table_for_active_activities.rb b/db/migrate/20191216135213_join_table_for_active_activities.rb
index e0b491e0fc51..965c2504a240 100644
--- a/db/migrate/20191216135213_join_table_for_active_activities.rb
+++ b/db/migrate/20191216135213_join_table_for_active_activities.rb
@@ -59,7 +59,7 @@ def create_join_table
add_index :time_entry_activities_projects,
%i[project_id activity_id],
unique: true,
- name: "index_teap_on_project_id_and_activity_id"
+ name: 'index_teap_on_project_id_and_activity_id'
end
# Delete all references from enumerations to projects which point to no longer
diff --git a/db/migrate/20200217155632_rename_tokens.rb b/db/migrate/20200217155632_rename_tokens.rb
index 2446e06f9e80..a11699b77dd1 100644
--- a/db/migrate/20200217155632_rename_tokens.rb
+++ b/db/migrate/20200217155632_rename_tokens.rb
@@ -31,12 +31,12 @@ class Token < ApplicationRecord
end
def up
- Token.where(type: "Token::Rss").update_all(type: "Token::RSS")
- Token.where(type: "Token::Api").update_all(type: "Token::API")
+ Token.where(type: 'Token::Rss').update_all(type: 'Token::RSS')
+ Token.where(type: 'Token::Api').update_all(type: 'Token::API')
end
def down
- Token.where(type: "Token::RSS").update_all(type: "Token::Rss")
- Token.where(type: "Token::API").update_all(type: "Token::Api")
+ Token.where(type: 'Token::RSS').update_all(type: 'Token::Rss')
+ Token.where(type: 'Token::API').update_all(type: 'Token::Api')
end
end
diff --git a/db/migrate/20200220171133_rename_bim_module.rb b/db/migrate/20200220171133_rename_bim_module.rb
index de32c897def0..1536d7a1b53d 100644
--- a/db/migrate/20200220171133_rename_bim_module.rb
+++ b/db/migrate/20200220171133_rename_bim_module.rb
@@ -33,14 +33,14 @@ class RenameBimModule < ActiveRecord::Migration[6.0]
class Project < ApplicationRecord; end
def up
- projects_with_bcf = EnabledModule.where(name: "bcf").pluck(:project_id)
+ projects_with_bcf = EnabledModule.where(name: 'bcf').pluck(:project_id)
# Delete all bcf to avoid duplicates
- EnabledModule.where(name: "bcf").delete_all
- EnabledModule.where(name: "ifc_models").update_all(name: "bim")
+ EnabledModule.where(name: 'bcf').delete_all
+ EnabledModule.where(name: 'ifc_models').update_all(name: 'bim')
# Re-enable bim if ifc_models was not active but bcf was
Project.where(id: projects_with_bcf).includes(:enabled_modules).each do |project|
- project.enabled_modules.create(name: "bim") unless project.enabled_module_names.include?("bim")
+ project.enabled_modules.create(name: 'bim') unless project.enabled_module_names.include?('bim')
end
# Rename attachments container
@@ -50,7 +50,7 @@ def up
def down
# We cannot now which module was active, so enable BCF
- EnabledModule.where(name: "bim").update_all(name: "bcf")
+ EnabledModule.where(name: 'bim').update_all(name: 'bcf')
# Rename attachments container
execute "UPDATE attachments SET container_type = 'Bcf::Viewpoint' WHERE container_type = 'Bim::Bcf::Viewpoint'"
diff --git a/db/migrate/20200325101528_strip_whitespace_from_user_attributes.rb b/db/migrate/20200325101528_strip_whitespace_from_user_attributes.rb
index d8538cbc6848..ca7302c16e30 100644
--- a/db/migrate/20200325101528_strip_whitespace_from_user_attributes.rb
+++ b/db/migrate/20200325101528_strip_whitespace_from_user_attributes.rb
@@ -28,7 +28,7 @@
class StripWhitespaceFromUserAttributes < ActiveRecord::Migration[6.0]
def up
- User.update_all("login = TRIM(login), mail = TRIM(mail)")
+ User.update_all('login = TRIM(login), mail = TRIM(mail)')
end
def down
diff --git a/db/migrate/20200326102408_rename_fixed_version.rb b/db/migrate/20200326102408_rename_fixed_version.rb
index e940c5277004..8e0cfde92442 100644
--- a/db/migrate/20200326102408_rename_fixed_version.rb
+++ b/db/migrate/20200326102408_rename_fixed_version.rb
@@ -31,14 +31,14 @@ def up
rename_column :work_packages, :fixed_version_id, :version_id
rename_column :work_package_journals, :fixed_version_id, :version_id
- rename_query_attributes("fixed_version", "version")
+ rename_query_attributes('fixed_version', 'version')
end
def down
rename_column :work_packages, :version_id, :fixed_version_id
rename_column :work_package_journals, :version_id, :fixed_version_id
- rename_query_attributes("version", "fixed_version")
+ rename_query_attributes('version', 'fixed_version')
end
def rename_query_attributes(from, to)
diff --git a/db/migrate/20200428105404_unique_member_role.rb b/db/migrate/20200428105404_unique_member_role.rb
index 900a24442f7a..07058d0ed72f 100644
--- a/db/migrate/20200428105404_unique_member_role.rb
+++ b/db/migrate/20200428105404_unique_member_role.rb
@@ -30,7 +30,7 @@ class UniqueMemberRole < ActiveRecord::Migration[6.0]
def change
change_table :member_roles do |t|
t.index %i[member_id role_id inherited_from],
- name: "unique_inherited_role",
+ name: 'unique_inherited_role',
unique: true
end
end
diff --git a/db/migrate/20200522140244_remove_journal_versions_table.rb b/db/migrate/20200522140244_remove_journal_versions_table.rb
index aea50b7974b6..88e5b5f1cc8f 100644
--- a/db/migrate/20200522140244_remove_journal_versions_table.rb
+++ b/db/migrate/20200522140244_remove_journal_versions_table.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "20190724093332_add_journal_versions_table"
+require_relative '20190724093332_add_journal_versions_table'
class RemoveJournalVersionsTable < ActiveRecord::Migration[6.0]
def up
diff --git a/db/migrate/20200625133727_fix_inherited_group_member_roles.rb b/db/migrate/20200625133727_fix_inherited_group_member_roles.rb
index f3602c463f39..b171fd239e6c 100644
--- a/db/migrate/20200625133727_fix_inherited_group_member_roles.rb
+++ b/db/migrate/20200625133727_fix_inherited_group_member_roles.rb
@@ -35,7 +35,7 @@ def up
# which will auto-create members for the users if necessary
Member
.includes(%i[principal])
- .where(users: { type: "Group" })
+ .where(users: { type: 'Group' })
.find_each do |member|
# Recreate member_roles for all group members
Groups::UpdateRolesService
diff --git a/db/migrate/20200708065116_fix_members_inconsistencies.rb b/db/migrate/20200708065116_fix_members_inconsistencies.rb
index f8435abcdb09..daf1212e968c 100644
--- a/db/migrate/20200708065116_fix_members_inconsistencies.rb
+++ b/db/migrate/20200708065116_fix_members_inconsistencies.rb
@@ -28,7 +28,7 @@
class FixMembersInconsistencies < ActiveRecord::Migration[6.0]
def change
- change_column_default :members, :created_on, -> { "CURRENT_TIMESTAMP" }
+ change_column_default :members, :created_on, -> { 'CURRENT_TIMESTAMP' }
# Update all members without created_on which got created by CTE
Member.where(created_on: nil).update_all(created_on: Time.zone.now)
diff --git a/db/migrate/20200903064009_enable_current_project_custom_fields_columns.rb b/db/migrate/20200903064009_enable_current_project_custom_fields_columns.rb
index b568154c5d7c..f650a3870481 100644
--- a/db/migrate/20200903064009_enable_current_project_custom_fields_columns.rb
+++ b/db/migrate/20200903064009_enable_current_project_custom_fields_columns.rb
@@ -28,7 +28,7 @@
class EnableCurrentProjectCustomFieldsColumns < ActiveRecord::Migration[6.0]
def up
- return unless Setting.where(name: "enabled_projects_column").exists? # rubocop:disable Rails/WhereExists
+ return unless Setting.where(name: 'enabled_projects_column').exists? # rubocop:disable Rails/WhereExists
columns = Setting.enabled_projects_columns
cf_columns = ProjectCustomField.pluck(:id).map { |id| "cf_#{id}" }
diff --git a/db/migrate/20200914092212_set_current_timestamp_defaults_for_bcf_viewpoints_and_issues.rb b/db/migrate/20200914092212_set_current_timestamp_defaults_for_bcf_viewpoints_and_issues.rb
index 768ba09c6cff..18588a3c2927 100644
--- a/db/migrate/20200914092212_set_current_timestamp_defaults_for_bcf_viewpoints_and_issues.rb
+++ b/db/migrate/20200914092212_set_current_timestamp_defaults_for_bcf_viewpoints_and_issues.rb
@@ -28,10 +28,10 @@
class SetCurrentTimestampDefaultsForBcfViewpointsAndIssues < ActiveRecord::Migration[6.0]
def up
- change_column_default(:bcf_issues, :created_at, -> { "CURRENT_TIMESTAMP" })
- change_column_default(:bcf_issues, :updated_at, -> { "CURRENT_TIMESTAMP" })
- change_column_default(:bcf_viewpoints, :created_at, -> { "CURRENT_TIMESTAMP" })
- change_column_default(:bcf_viewpoints, :updated_at, -> { "CURRENT_TIMESTAMP" })
+ change_column_default(:bcf_issues, :created_at, -> { 'CURRENT_TIMESTAMP' })
+ change_column_default(:bcf_issues, :updated_at, -> { 'CURRENT_TIMESTAMP' })
+ change_column_default(:bcf_viewpoints, :created_at, -> { 'CURRENT_TIMESTAMP' })
+ change_column_default(:bcf_viewpoints, :updated_at, -> { 'CURRENT_TIMESTAMP' })
end
def down
diff --git a/db/migrate/20200924085508_cleanup_orphaned_journal_data.rb b/db/migrate/20200924085508_cleanup_orphaned_journal_data.rb
index b0786030e775..0ccfdbd0ce5b 100644
--- a/db/migrate/20200924085508_cleanup_orphaned_journal_data.rb
+++ b/db/migrate/20200924085508_cleanup_orphaned_journal_data.rb
@@ -28,14 +28,14 @@
class CleanupOrphanedJournalData < ActiveRecord::Migration[6.0]
def up
- cleanup_orphaned_journals("attachable_journals")
- cleanup_orphaned_journals("customizable_journals")
- cleanup_orphaned_journals("attachment_journals")
- cleanup_orphaned_journals("changeset_journals")
- cleanup_orphaned_journals("message_journals")
- cleanup_orphaned_journals("news_journals")
- cleanup_orphaned_journals("wiki_content_journals")
- cleanup_orphaned_journals("work_package_journals")
+ cleanup_orphaned_journals('attachable_journals')
+ cleanup_orphaned_journals('customizable_journals')
+ cleanup_orphaned_journals('attachment_journals')
+ cleanup_orphaned_journals('changeset_journals')
+ cleanup_orphaned_journals('message_journals')
+ cleanup_orphaned_journals('news_journals')
+ cleanup_orphaned_journals('wiki_content_journals')
+ cleanup_orphaned_journals('work_package_journals')
end
# No down needed as this only cleans up data that should have been deleted anyway.
diff --git a/db/migrate/20200925084550_members_allow_null_on_project.rb b/db/migrate/20200925084550_members_allow_null_on_project.rb
index 1cb890e030cf..47bf49e8c05c 100644
--- a/db/migrate/20200925084550_members_allow_null_on_project.rb
+++ b/db/migrate/20200925084550_members_allow_null_on_project.rb
@@ -30,7 +30,7 @@ class MembersAllowNullOnProject < ActiveRecord::Migration[6.0]
def change
change_column_null :members, :project_id, true
change_column_default :members, :project_id, from: 0, to: nil
- add_column :members, :updated_at, :timestamp, default: -> { "CURRENT_TIMESTAMP" }
+ add_column :members, :updated_at, :timestamp, default: -> { 'CURRENT_TIMESTAMP' }
reversible do |rev|
rev.up do
@@ -66,8 +66,8 @@ def add_updated_at_values
def migrate_principal_roles_data
fetch_principal_roles.each do |principal_id, records|
- member_id = insert_into_members(principal_id, records.first["created_at"], records.first["updated_at"])
- insert_into_member_roles(member_id, records.pluck("role_id"))
+ member_id = insert_into_members(principal_id, records.first['created_at'], records.first['updated_at'])
+ insert_into_member_roles(member_id, records.pluck('role_id'))
end
end
@@ -85,7 +85,7 @@ def insert_into_members(principal_id, created_at, updated_at)
RETURNING id
SQL
- member_id.to_a.first["id"]
+ member_id.to_a.first['id']
end
def insert_into_member_roles(member_id, role_ids)
diff --git a/db/migrate/20201001184404_rename_timestamp_on_time_and_cost_entry.rb b/db/migrate/20201001184404_rename_timestamp_on_time_and_cost_entry.rb
index f19ec790ee0e..d771b159ac04 100644
--- a/db/migrate/20201001184404_rename_timestamp_on_time_and_cost_entry.rb
+++ b/db/migrate/20201001184404_rename_timestamp_on_time_and_cost_entry.rb
@@ -38,7 +38,7 @@ def alter_name_and_defaults(table)
rename_column table, :created_on, :created_at
rename_column table, :updated_on, :updated_at
- change_column_default table, :created_at, from: nil, to: -> { "CURRENT_TIMESTAMP" }
- change_column_default table, :updated_at, from: nil, to: -> { "CURRENT_TIMESTAMP" }
+ change_column_default table, :created_at, from: nil, to: -> { 'CURRENT_TIMESTAMP' }
+ change_column_default table, :updated_at, from: nil, to: -> { 'CURRENT_TIMESTAMP' }
end
end
diff --git a/db/migrate/20201005120137_ensure_integer_for_relations_foreign_keys.rb b/db/migrate/20201005120137_ensure_integer_for_relations_foreign_keys.rb
index e291582dd851..11025bb671c6 100644
--- a/db/migrate/20201005120137_ensure_integer_for_relations_foreign_keys.rb
+++ b/db/migrate/20201005120137_ensure_integer_for_relations_foreign_keys.rb
@@ -37,7 +37,7 @@ def up
Relation.reset_column_information
# Nothing to do for us if the column already has the expected type
- return if Relation.column_for_attribute("from_id").sql_type == "integer"
+ return if Relation.column_for_attribute('from_id').sql_type == 'integer'
change_table :relations do |t|
t.change :from_id, :integer, null: false
diff --git a/db/migrate/20201005184411_rename_timestamps.rb b/db/migrate/20201005184411_rename_timestamps.rb
index b0ba86cbe6b5..2dda2f451760 100644
--- a/db/migrate/20201005184411_rename_timestamps.rb
+++ b/db/migrate/20201005184411_rename_timestamps.rb
@@ -54,8 +54,8 @@ def change
add_timestamp_column(:journals, :updated_at, :created_at)
- add_timestamp_column(:roles, :created_at, "CURRENT_TIMESTAMP")
- add_timestamp_column(:roles, :updated_at, "CURRENT_TIMESTAMP")
+ add_timestamp_column(:roles, :created_at, 'CURRENT_TIMESTAMP')
+ add_timestamp_column(:roles, :updated_at, 'CURRENT_TIMESTAMP')
end
private
@@ -63,7 +63,7 @@ def change
def alter_name_and_defaults(table, old_column_name, new_column_name)
rename_column table, old_column_name, new_column_name
- change_column_default table, new_column_name, from: nil, to: -> { "CURRENT_TIMESTAMP" }
+ change_column_default table, new_column_name, from: nil, to: -> { 'CURRENT_TIMESTAMP' }
# Ensure we reset column information because otherwise,
# +updated_on+ will still be used.
@@ -76,7 +76,7 @@ def alter_name_and_defaults(table, old_column_name, new_column_name)
end
def add_timestamp_column(table, column_name, from_column = nil)
- add_column table, column_name, :timestamp, default: -> { "CURRENT_TIMESTAMP" }
+ add_column table, column_name, :timestamp, default: -> { 'CURRENT_TIMESTAMP' }
reversible do |dir|
dir.up do
diff --git a/db/migrate/20201125121949_remove_renamed_cron_job.rb b/db/migrate/20201125121949_remove_renamed_cron_job.rb
index be642846ee2a..c9d08ea8a7ed 100644
--- a/db/migrate/20201125121949_remove_renamed_cron_job.rb
+++ b/db/migrate/20201125121949_remove_renamed_cron_job.rb
@@ -31,6 +31,8 @@ def up
# The job has been renamed to JobStatus::Cron::ClearOldJobStatusJob
# the new job will be added on restarting the application but the old will still be in the database
# and will cause 'uninitialized constant' errors.
- execute("DELETE FROM delayed_jobs WHERE handler LIKE '%job_class: Cron::ClearOldJobStatusJob%'")
+ Delayed::Job
+ .where('handler LIKE ?', "%job_class: Cron::ClearOldJobStatusJob%")
+ .delete_all
end
end
diff --git a/db/migrate/20210214205545_replace_invalid_principal_references.rb b/db/migrate/20210214205545_replace_invalid_principal_references.rb
index 912b9b3f6e52..2d9fd7de7cb4 100644
--- a/db/migrate/20210214205545_replace_invalid_principal_references.rb
+++ b/db/migrate/20210214205545_replace_invalid_principal_references.rb
@@ -34,7 +34,7 @@ def up
say "Replacing invalid custom value user references"
CustomValue
.joins(:custom_field)
- .where("#{CustomField.table_name}.field_format" => "user")
+ .where("#{CustomField.table_name}.field_format" => 'user')
.where("value NOT IN (SELECT id::text FROM users)")
.update_all(value: deleted_user_id)
diff --git a/db/migrate/20210510193438_remove_project_setting.rb b/db/migrate/20210510193438_remove_project_setting.rb
index c6c25faa1232..99c4bb7c2d79 100644
--- a/db/migrate/20210510193438_remove_project_setting.rb
+++ b/db/migrate/20210510193438_remove_project_setting.rb
@@ -33,7 +33,7 @@ class RemoveProjectSetting < ActiveRecord::Migration[6.1]
class Project < ApplicationRecord; end
def up
- Project.where(name: "sequential_project_identifiers").delete_all
+ Project.where(name: 'sequential_project_identifiers').delete_all
end
def down
diff --git a/db/migrate/20210615150558_aggregate_journals.rb b/db/migrate/20210615150558_aggregate_journals.rb
index 6b6cd3a851cb..7f164a718393 100644
--- a/db/migrate/20210615150558_aggregate_journals.rb
+++ b/db/migrate/20210615150558_aggregate_journals.rb
@@ -26,8 +26,8 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "20200924085508_cleanup_orphaned_journal_data"
-require_relative "migration_utils/utils"
+require_relative '20200924085508_cleanup_orphaned_journal_data'
+require_relative 'migration_utils/utils'
class AggregateJournals < ActiveRecord::Migration[6.1]
include ::Migration::Utils
@@ -368,11 +368,11 @@ def notes_projection
def raw_journals_subselect(journable, sql, until_version)
if sql
- raise "until_version used together with sql" if until_version
+ raise 'until_version used together with sql' if until_version
"(#{sql})"
elsif journable
- limit = until_version ? "AND journals.version <= #{until_version}" : ""
+ limit = until_version ? "AND journals.version <= #{until_version}" : ''
<<~SQL.squish
(
@@ -383,7 +383,7 @@ def raw_journals_subselect(journable, sql, until_version)
)
SQL
else
- where = until_version ? "WHERE journals.version <= #{until_version}" : ""
+ where = until_version ? "WHERE journals.version <= #{until_version}" : ''
<<~SQL.squish
(SELECT * from journals #{where})
@@ -399,7 +399,7 @@ def beyond_aggregation_time_condition
if aggregation_time_seconds == 0
# if aggregation is disabled, we consider everything to be beyond aggregation time
# even if creation dates are exactly equal
- return "(true = true)"
+ return '(true = true)'
end
difference = "(successor.created_at - predecessor.created_at)"
diff --git a/db/migrate/20210616145324_polymorphic_journal_data.rb b/db/migrate/20210616145324_polymorphic_journal_data.rb
index 45169574f3a1..4bfb8b05bd0e 100644
--- a/db/migrate/20210616145324_polymorphic_journal_data.rb
+++ b/db/migrate/20210616145324_polymorphic_journal_data.rb
@@ -29,7 +29,7 @@
class PolymorphicJournalData < ActiveRecord::Migration[6.1]
# The wiki content table got renamed after writing the migration initially.
class WikiContentJournal < ApplicationRecord
- self.table_name = "wiki_content_journals"
+ self.table_name = 'wiki_content_journals'
end
def up
diff --git a/db/migrate/20210618132206_add_notification_settings.rb b/db/migrate/20210618132206_add_notification_settings.rb
index d91a287018d4..3275f6f02c84 100644
--- a/db/migrate/20210618132206_add_notification_settings.rb
+++ b/db/migrate/20210618132206_add_notification_settings.rb
@@ -37,17 +37,17 @@ def up
t.boolean :mentioned, default: false
t.boolean :all, default: false
- t.timestamps default: -> { "CURRENT_TIMESTAMP" }
+ t.timestamps default: -> { 'CURRENT_TIMESTAMP' }
t.index %i[user_id channel],
unique: true,
where: "project_id IS NULL",
- name: "index_notification_settings_unique_project_null"
+ name: 'index_notification_settings_unique_project_null'
t.index %i[user_id project_id channel],
unique: true,
where: "project_id IS NOT NULL",
- name: "index_notification_settings_unique_project"
+ name: 'index_notification_settings_unique_project'
end
remove_column :members, :mail_notification
@@ -56,11 +56,11 @@ def up
def down
add_column :members, :mail_notification, :boolean, default: false, null: false
- add_column :users, :mail_notification, :string, default: "", null: false
+ add_column :users, :mail_notification, :string, default: '', null: false
drop_table :notification_settings
User.reset_column_information
- User.update_all(mail_notification: "only_assigned")
+ User.update_all(mail_notification: 'only_assigned')
end
end
diff --git a/db/migrate/20210726070813_remove_journal_versions.rb b/db/migrate/20210726070813_remove_journal_versions.rb
index b7a10ea60603..96d7a52d2d94 100644
--- a/db/migrate/20210726070813_remove_journal_versions.rb
+++ b/db/migrate/20210726070813_remove_journal_versions.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "20190724093332_add_journal_versions_table"
+require_relative '20190724093332_add_journal_versions_table'
# db/migrate/20200522140244_remove_journal_versions_table.rb
# incorrectly removes journal_versions
diff --git a/db/migrate/20210825183540_make_user_preferences_json.rb b/db/migrate/20210825183540_make_user_preferences_json.rb
index 38a9b40029ce..b03141633ed9 100644
--- a/db/migrate/20210825183540_make_user_preferences_json.rb
+++ b/db/migrate/20210825183540_make_user_preferences_json.rb
@@ -26,13 +26,13 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "migration_utils/utils"
+require_relative 'migration_utils/utils'
class MakeUserPreferencesJson < ActiveRecord::Migration[6.1]
include ::Migration::Utils
class UserPreferenceWithOthers < ::UserPreference
- self.table_name = "user_preferences"
+ self.table_name = 'user_preferences'
serialize :others, type: Hash
serialize :settings, coder: ::Serializers::IndifferentHashSerializer
end
diff --git a/db/migrate/20210914065555_cleanup_notifications.rb b/db/migrate/20210914065555_cleanup_notifications.rb
index 9941e8f2925f..b0a74aa61860 100644
--- a/db/migrate/20210914065555_cleanup_notifications.rb
+++ b/db/migrate/20210914065555_cleanup_notifications.rb
@@ -36,23 +36,23 @@ def up
end
change_table :notification_settings, bulk: true do |t|
- t.remove_index name: "index_notification_settings_unique_project_null"
- t.remove_index name: "index_notification_settings_unique_project"
+ t.remove_index name: 'index_notification_settings_unique_project_null'
+ t.remove_index name: 'index_notification_settings_unique_project'
# Delete all non in-app
- NotificationSetting.where("channel > 0").delete_all
+ NotificationSetting.where('channel > 0').delete_all
t.remove :channel, :all
t.index %i[user_id],
unique: true,
where: "project_id IS NULL",
- name: "index_notification_settings_unique_project_null"
+ name: 'index_notification_settings_unique_project_null'
t.index %i[user_id project_id],
unique: true,
where: "project_id IS NOT NULL",
- name: "index_notification_settings_unique_project"
+ name: 'index_notification_settings_unique_project'
end
end
@@ -69,18 +69,18 @@ def down
t.integer :channel, limit: 1
t.boolean :all, default: false
- t.remove_index name: "index_notification_settings_unique_project_null"
- t.remove_index name: "index_notification_settings_unique_project"
+ t.remove_index name: 'index_notification_settings_unique_project_null'
+ t.remove_index name: 'index_notification_settings_unique_project'
t.index %i[user_id channel],
unique: true,
where: "project_id IS NULL",
- name: "index_notification_settings_unique_project_null"
+ name: 'index_notification_settings_unique_project_null'
t.index %i[user_id project_id channel],
unique: true,
where: "project_id IS NOT NULL",
- name: "index_notification_settings_unique_project"
+ name: 'index_notification_settings_unique_project'
end
end
end
diff --git a/db/migrate/20210915154656_add_user_preference_settings_indices.rb b/db/migrate/20210915154656_add_user_preference_settings_indices.rb
index f83d8d50995b..e688edef5e19 100644
--- a/db/migrate/20210915154656_add_user_preference_settings_indices.rb
+++ b/db/migrate/20210915154656_add_user_preference_settings_indices.rb
@@ -31,16 +31,16 @@ def change
add_index :user_preferences,
"(settings->'daily_reminders'->'enabled')",
using: :gin,
- name: "index_user_prefs_settings_daily_reminders_enabled"
+ name: 'index_user_prefs_settings_daily_reminders_enabled'
add_index :user_preferences,
"(settings->'daily_reminders'->'times')",
using: :gin,
- name: "index_user_prefs_settings_daily_reminders_times"
+ name: 'index_user_prefs_settings_daily_reminders_times'
add_index :user_preferences,
"(settings->'time_zone')",
using: :gin,
- name: "index_user_prefs_settings_time_zone"
+ name: 'index_user_prefs_settings_time_zone'
end
end
diff --git a/db/migrate/20210928133538_add_reminder_workdays.rb b/db/migrate/20210928133538_add_reminder_workdays.rb
index da4feef12fbd..2372fce4de02 100644
--- a/db/migrate/20210928133538_add_reminder_workdays.rb
+++ b/db/migrate/20210928133538_add_reminder_workdays.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "migration_utils/utils"
+require_relative 'migration_utils/utils'
class AddReminderWorkdays < ActiveRecord::Migration[6.1]
include ::Migration::Utils
diff --git a/db/migrate/20211026061420_add_indexes_for_email_reminder_pause.rb b/db/migrate/20211026061420_add_indexes_for_email_reminder_pause.rb
index 60620b7719a0..b4116f669fa4 100644
--- a/db/migrate/20211026061420_add_indexes_for_email_reminder_pause.rb
+++ b/db/migrate/20211026061420_add_indexes_for_email_reminder_pause.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "migration_utils/utils"
+require_relative 'migration_utils/utils'
class AddIndexesForEmailReminderPause < ActiveRecord::Migration[6.1]
include ::Migration::Utils
diff --git a/db/migrate/20211101152840_redistribute_edit_project_permission.rb b/db/migrate/20211101152840_redistribute_edit_project_permission.rb
index 630584eca4fb..73c52dc9a644 100644
--- a/db/migrate/20211101152840_redistribute_edit_project_permission.rb
+++ b/db/migrate/20211101152840_redistribute_edit_project_permission.rb
@@ -28,13 +28,13 @@
class RedistributeEditProjectPermission < ActiveRecord::Migration[6.1]
def up
- add_permission("select_custom_fields")
- add_permission("select_done_status")
+ add_permission('select_custom_fields')
+ add_permission('select_done_status')
end
def down
- remove_permission("select_custom_fields")
- remove_permission("select_done_status")
+ remove_permission('select_custom_fields')
+ remove_permission('select_done_status')
end
private
diff --git a/db/migrate/20211102161932_remove_custom_field_types.rb b/db/migrate/20211102161932_remove_custom_field_types.rb
index f1b6389a86b3..2da68f215401 100644
--- a/db/migrate/20211102161932_remove_custom_field_types.rb
+++ b/db/migrate/20211102161932_remove_custom_field_types.rb
@@ -28,9 +28,9 @@
class RemoveCustomFieldTypes < ActiveRecord::Migration[6.1]
def up
- delete_custom_field("TimeEntryActivityCustomField")
- delete_custom_field("DocumentCategoryCustomField")
- delete_custom_field("IssuePriorityCustomField")
+ delete_custom_field('TimeEntryActivityCustomField')
+ delete_custom_field('DocumentCategoryCustomField')
+ delete_custom_field('IssuePriorityCustomField')
delete_custom_values
end
diff --git a/db/migrate/20211103120946_clean_emails_footer.rb b/db/migrate/20211103120946_clean_emails_footer.rb
index abad1e984e7d..89e2a0519e35 100644
--- a/db/migrate/20211103120946_clean_emails_footer.rb
+++ b/db/migrate/20211103120946_clean_emails_footer.rb
@@ -28,7 +28,7 @@
class CleanEmailsFooter < ActiveRecord::Migration[6.1]
def up
- return unless Setting.where(name: "emails_footer").exists? # rubocop:disable Rails/WhereExists
+ return unless Setting.where(name: 'emails_footer').exists? # rubocop:disable Rails/WhereExists
Setting.reset_column_information
filtered_footer = Setting
@@ -53,11 +53,11 @@ def down
def assumed_notification_text?(text)
[
- "You have received this notification because of your notification settings",
- "You have received this notification because you have either subscribed to it, or are involved in it.",
- "Sie erhalten diese E-Mail aufgrund Ihrer Benachrichtungseinstellungen",
- "/my/account",
- "/my/notifications",
+ 'You have received this notification because of your notification settings',
+ 'You have received this notification because you have either subscribed to it, or are involved in it.',
+ 'Sie erhalten diese E-Mail aufgrund Ihrer Benachrichtungseinstellungen',
+ '/my/account',
+ '/my/notifications',
'/my/mail\_notifications'
].any? { |val| text.include?(val) }
end
diff --git a/db/migrate/20211105142202_queue_notification_update_mail.rb b/db/migrate/20211105142202_queue_notification_update_mail.rb
index 8ab5d59d742e..945b15e64744 100644
--- a/db/migrate/20211105142202_queue_notification_update_mail.rb
+++ b/db/migrate/20211105142202_queue_notification_update_mail.rb
@@ -33,9 +33,9 @@ def up
return unless User.not_builtin.exists?
::Announcements::SchedulerJob
- .perform_later subject: :"notifications.update_info_mail.subject",
- body: :"notifications.update_info_mail.body",
- body_header: :"notifications.update_info_mail.body_header",
- body_subheader: :"notifications.update_info_mail.body_subheader"
+ .perform_later subject: :'notifications.update_info_mail.subject',
+ body: :'notifications.update_info_mail.body',
+ body_header: :'notifications.update_info_mail.body_header',
+ body_subheader: :'notifications.update_info_mail.body_subheader'
end
end
diff --git a/db/migrate/20220202140507_reorder_project_children.rb b/db/migrate/20220202140507_reorder_project_children.rb
index 760467ec60f9..d964d0d077e8 100644
--- a/db/migrate/20220202140507_reorder_project_children.rb
+++ b/db/migrate/20220202140507_reorder_project_children.rb
@@ -27,54 +27,7 @@
#++
class ReorderProjectChildren < ActiveRecord::Migration[6.1]
- class ProjectMigration < ApplicationRecord
- include ::Projects::Hierarchy
- self.table_name = "projects"
- end
-
def up
- Rails.logger.info { "Resorting siblings by name in the project's nested set." }
- ProjectMigration.transaction { reorder! }
- end
-
- def down
- # Nothing to do
- end
-
- private
-
- def reorder!
- # Reorder the project roots
- reorder_siblings ProjectMigration.roots
-
- # Reorder every project hierarchy
- ProjectMigration
- .where(id: unique_parent_ids)
- .find_each { |project| reorder_siblings(project.children) }
- end
-
- def unique_parent_ids
- ProjectMigration
- .where.not(parent_id: nil)
- .select(:parent_id)
- .distinct
- end
-
- def reorder_siblings(siblings)
- return unless siblings.many?
-
- # Resort children manually
- sorted = siblings.sort_by { |project| project.name.downcase }
-
- # Get the current first child
- first = siblings.first
-
- sorted.each_with_index do |child, i|
- if i == 0
- child.move_to_left_of(first) unless child == first
- else
- child.move_to_right_of(sorted[i - 1])
- end
- end
+ ::Projects::ReorderHierarchyJob.perform_later
end
end
diff --git a/db/migrate/20220319211253_add_parent_id_to_wp.rb b/db/migrate/20220319211253_add_parent_id_to_wp.rb
index be79605ab36c..cc235f6d5884 100644
--- a/db/migrate/20220319211253_add_parent_id_to_wp.rb
+++ b/db/migrate/20220319211253_add_parent_id_to_wp.rb
@@ -247,7 +247,7 @@ def remove_closure_tree_columns_on_foreign_tables
end
def build_typed_dag
- require_relative "20180105130053_rebuild_dag"
+ require_relative '20180105130053_rebuild_dag'
::RebuildDag.new.up
end
@@ -265,7 +265,7 @@ def insert_hierarchy_relation_for_parent
# rubocop:disable Rails/ApplicationRecord
class ClosureTreeWorkPackage < ActiveRecord::Base
- self.table_name = "work_packages"
+ self.table_name = 'work_packages'
has_closure_tree
end
diff --git a/db/migrate/20220426132637_refix_inherited_group_member_roles.rb b/db/migrate/20220426132637_refix_inherited_group_member_roles.rb
index 25ba7173120a..b60b03f51d52 100644
--- a/db/migrate/20220426132637_refix_inherited_group_member_roles.rb
+++ b/db/migrate/20220426132637_refix_inherited_group_member_roles.rb
@@ -31,7 +31,7 @@ def up
# When the FixInheritedGroupMemberRoles ran initially, Members
# where the MemberRoles were inherited from more than one Group where
# applied incorrectly. Only the MemberRoles of the last Group where kept.
- require Rails.root.join("db/migrate/20200625133727_fix_inherited_group_member_roles.rb")
+ require Rails.root.join('db/migrate/20200625133727_fix_inherited_group_member_roles.rb')
# created_on has been renamed to created_at
Member.reset_column_information
diff --git a/db/migrate/20220428071221_restore_defaults_on_empty_settings.rb b/db/migrate/20220428071221_restore_defaults_on_empty_settings.rb
index ba31fe2fe3be..34643140a82f 100644
--- a/db/migrate/20220428071221_restore_defaults_on_empty_settings.rb
+++ b/db/migrate/20220428071221_restore_defaults_on_empty_settings.rb
@@ -28,7 +28,7 @@
class RestoreDefaultsOnEmptySettings < ActiveRecord::Migration[6.1]
def up
- settings = Setting.where(value: "")
+ settings = Setting.where(value: '')
settings.find_each do |setting|
definition = Settings::Definition[setting.name]
@@ -38,7 +38,7 @@ def up
next
end
- next if definition.value == ""
+ next if definition.value == ''
if definition.writable?
setting.update_attribute(:value, definition.value)
diff --git a/db/migrate/20220615213015_migrate_log_time_to_log_own_time_in_role_permissions.rb b/db/migrate/20220615213015_migrate_log_time_to_log_own_time_in_role_permissions.rb
index 590ea5780fe5..29fe69536032 100644
--- a/db/migrate/20220615213015_migrate_log_time_to_log_own_time_in_role_permissions.rb
+++ b/db/migrate/20220615213015_migrate_log_time_to_log_own_time_in_role_permissions.rb
@@ -28,6 +28,6 @@
class MigrateLogTimeToLogOwnTimeInRolePermissions < ActiveRecord::Migration[7.0]
def change
- RolePermission.where(permission: "log_time").update_all(permission: "log_own_time")
+ RolePermission.where(permission: 'log_time').update_all(permission: 'log_own_time')
end
end
diff --git a/db/migrate/20220707192304_backfill_time_entries_with_logged_by_id.rb b/db/migrate/20220707192304_backfill_time_entries_with_logged_by_id.rb
index a6dc47b3bffe..f667737f5cd1 100644
--- a/db/migrate/20220707192304_backfill_time_entries_with_logged_by_id.rb
+++ b/db/migrate/20220707192304_backfill_time_entries_with_logged_by_id.rb
@@ -32,7 +32,7 @@ def up
.where.not(user_id: User.select(:id))
.update_all(user_id: DeletedUser.first.id)
- TimeEntry.all.update_all("logged_by_id = user_id")
+ TimeEntry.all.update_all('logged_by_id = user_id')
end
def down
diff --git a/db/migrate/20220804112533_remove_notification_cleanup_job.rb b/db/migrate/20220804112533_remove_notification_cleanup_job.rb
index a041d7bdd07a..956032ddad79 100644
--- a/db/migrate/20220804112533_remove_notification_cleanup_job.rb
+++ b/db/migrate/20220804112533_remove_notification_cleanup_job.rb
@@ -28,9 +28,14 @@
class RemoveNotificationCleanupJob < ActiveRecord::Migration[7.0]
def up
- execute("DELETE FROM delayed_jobs WHERE handler LIKE '%job_class: Notifications::CleanupJob%'")
+ # Remove the cron job no longer desired.
+ # The code itself is removed but keeping it in the database would lead to UninitializedConstant errors.
+ Delayed::Job
+ .where('handler LIKE ?', "%job_class: Notifications::CleanupJob%")
+ .delete_all
+
Setting
- .where(name: "notification_retention_period_days")
+ .where(name: 'notification_retention_period_days')
.delete_all
end
end
diff --git a/db/migrate/20220811061024_rename_work_package_export_limit.rb b/db/migrate/20220811061024_rename_work_package_export_limit.rb
index 685c45d9c908..277529873560 100644
--- a/db/migrate/20220811061024_rename_work_package_export_limit.rb
+++ b/db/migrate/20220811061024_rename_work_package_export_limit.rb
@@ -28,20 +28,20 @@
class RenameWorkPackageExportLimit < ActiveRecord::Migration[7.0]
def up
- if Setting.where(name: "work_packages_projects_export_limit").exists? # rubocop:disable Rails/WhereExists
+ if Setting.where(name: 'work_packages_projects_export_limit').exists? # rubocop:disable Rails/WhereExists
Setting
- .where(name: "work_packages_export_limit")
+ .where(name: 'work_packages_export_limit')
.delete_all
else
Setting
- .where(name: "work_packages_export_limit")
- .update_all(name: "work_packages_projects_export_limit")
+ .where(name: 'work_packages_export_limit')
+ .update_all(name: 'work_packages_projects_export_limit')
end
end
def down
Setting
- .where(name: "work_packages_projects_export_limit")
- .update_all(name: "work_packages_export_limit")
+ .where(name: 'work_packages_projects_export_limit')
+ .update_all(name: 'work_packages_export_limit')
end
end
diff --git a/db/migrate/20220817154403_remove_work_packages_duration_field_active_setting.rb b/db/migrate/20220817154403_remove_work_packages_duration_field_active_setting.rb
index 62a1c931100a..5667e3581346 100644
--- a/db/migrate/20220817154403_remove_work_packages_duration_field_active_setting.rb
+++ b/db/migrate/20220817154403_remove_work_packages_duration_field_active_setting.rb
@@ -28,6 +28,6 @@
class RemoveWorkPackagesDurationFieldActiveSetting < ActiveRecord::Migration[7.0]
def change
- Setting.where(name: "work_packages_duration_field_active").destroy_all
+ Setting.where(name: 'work_packages_duration_field_active').destroy_all
end
end
diff --git a/db/migrate/20220818074150_fix_invalid_journals.rb b/db/migrate/20220818074150_fix_invalid_journals.rb
index 28fb789f9545..9ddb18688331 100644
--- a/db/migrate/20220818074150_fix_invalid_journals.rb
+++ b/db/migrate/20220818074150_fix_invalid_journals.rb
@@ -62,7 +62,7 @@ def destroy_journals(journals)
def get_broken_journals
Journal
- .pluck("DISTINCT(journable_type)")
+ .pluck('DISTINCT(journable_type)')
.compact
.to_h do |journable_type|
relation = Journal
diff --git a/db/migrate/20220818074159_fix_deleted_data_journals.rb b/db/migrate/20220818074159_fix_deleted_data_journals.rb
index 68bc67073849..e639e302ee2e 100644
--- a/db/migrate/20220818074159_fix_deleted_data_journals.rb
+++ b/db/migrate/20220818074159_fix_deleted_data_journals.rb
@@ -43,7 +43,7 @@ def down
end
def unfixed_journals_found(journable_type, relation, count)
- unless ENV["SKIP_MISSING_JOURNALS"] == "true"
+ unless ENV['SKIP_MISSING_JOURNALS'] == 'true'
warning = <<~WARNING
There shouldn't be any missing data left for #{journable_type}, but found #{count}.
@@ -95,7 +95,7 @@ def fix_journal_data(journal)
def insert_journal_data(journal, write_message: false)
service = Journals::CreateService.new(journal.journable, User.system)
- insert_sql = service.instance_eval { insert_data_sql("placeholder", nil) }
+ insert_sql = service.instance_eval { insert_data_sql('placeholder', nil) }
result = Journal.connection.uncached do
::Journal
@@ -103,18 +103,18 @@ def insert_journal_data(journal, write_message: false)
.select_one(insert_sql)
end
- raise "ID is missing #{result.inspect}" unless result["id"]
+ raise "ID is missing #{result.inspect}" unless result['id']
if write_message
- update_with_new_data!(journal, result["id"])
+ update_with_new_data!(journal, result['id'])
else
- journal.update_column(:data_id, result["id"])
+ journal.update_column(:data_id, result['id'])
end
end
def get_missing_journals
Journal
- .pluck("DISTINCT(journable_type)")
+ .pluck('DISTINCT(journable_type)')
.to_h do |journable_type|
journal_class = journable_type.constantize.journal_class
table_name = journal_class.table_name
@@ -124,7 +124,7 @@ def get_missing_journals
.where("#{table_name}.id IS NULL")
.where(journable_type:)
.where.not(data_type: nil) # Ignore special tenants with data_type nil errors
- .order("journals.version ASC")
+ .order('journals.version ASC')
.includes(:journable)
[journable_type, relation]
@@ -153,7 +153,7 @@ def take_over_from_source(journal, source)
end
def update_with_new_data!(journal, data_id)
- notes = journal.notes || ""
+ notes = journal.notes || ''
notes << "\n" unless notes.empty?
notes << "_(This activity had to be modified by the system and may be missing some changes or contain changes from previous or following activities.)_"
diff --git a/db/migrate/20220926124435_constrain_work_package_dates.rb b/db/migrate/20220926124435_constrain_work_package_dates.rb
index cf7b3af7f5bf..81688e3d71fb 100644
--- a/db/migrate/20220926124435_constrain_work_package_dates.rb
+++ b/db/migrate/20220926124435_constrain_work_package_dates.rb
@@ -34,13 +34,13 @@ def change
User.execute_as(User.system) do
work_package.start_date = work_package.due_date
work_package.duration = 1
- work_package.journal_notes = "_Resetting the start date automatically to fix inconsistent dates._"
+ work_package.journal_notes = '_Resetting the start date automatically to fix inconsistent dates._'
work_package.save!(validate: false)
end
end
end
end
- add_check_constraint :work_packages, "due_date >= start_date", name: "work_packages_due_larger_start_date"
+ add_check_constraint :work_packages, 'due_date >= start_date', name: 'work_packages_due_larger_start_date'
end
end
diff --git a/db/migrate/20221018160449_add_logged_by_to_cost_entries.rb b/db/migrate/20221018160449_add_logged_by_to_cost_entries.rb
index 346e3b3be546..78ed9b8a1b16 100644
--- a/db/migrate/20221018160449_add_logged_by_to_cost_entries.rb
+++ b/db/migrate/20221018160449_add_logged_by_to_cost_entries.rb
@@ -36,7 +36,7 @@ def change
.where.not(user_id: User.select(:id))
.update_all(user_id: DeletedUser.first.id)
- CostEntry.update_all("logged_by_id = user_id")
+ CostEntry.update_all('logged_by_id = user_id')
end
end
end
diff --git a/db/migrate/20221026132134_bigint_primary_and_foreign_keys.rb b/db/migrate/20221026132134_bigint_primary_and_foreign_keys.rb
index 795c3473c559..c641d892044f 100644
--- a/db/migrate/20221026132134_bigint_primary_and_foreign_keys.rb
+++ b/db/migrate/20221026132134_bigint_primary_and_foreign_keys.rb
@@ -60,8 +60,8 @@ class BigintPrimaryAndForeignKeys < ActiveRecord::Migration[7.0]
CustomStyle => [:id],
CustomValue => %i[id customized_id custom_field_id],
Journal::CustomizableJournal => %i[id journal_id custom_field_id],
+ Delayed::Job => [:id],
DesignColor => [:id],
- :delayed_jobs => [:id], # delayed job removed in favour of good_job see WP #42 or PR #42
Journal::DocumentJournal => %i[id project_id category_id],
Document => %i[id project_id category_id],
:done_statuses_for_project => %i[project_id status_id],
diff --git a/db/migrate/20221027151959_remove_plaintext_tokens.rb b/db/migrate/20221027151959_remove_plaintext_tokens.rb
index 8b85eb09e1b2..2d678071dd7b 100644
--- a/db/migrate/20221027151959_remove_plaintext_tokens.rb
+++ b/db/migrate/20221027151959_remove_plaintext_tokens.rb
@@ -30,11 +30,11 @@ class RemovePlaintextTokens < ActiveRecord::Migration[7.0]
def change
drop_table :plaintext_tokens do |t|
t.integer :user_id, default: 0, null: false
- t.string :action, limit: 30, default: "", null: false
- t.string :value, limit: 40, default: "", null: false
+ t.string :action, limit: 30, default: '', null: false
+ t.string :value, limit: 40, default: '', null: false
t.datetime :created_on, null: false
- t.index :user_id, name: "index_plaintext_tokens_on_user_id"
+ t.index :user_id, name: 'index_plaintext_tokens_on_user_id'
end
end
end
diff --git a/db/migrate/20221115082403_add_ldap_tls_options.rb b/db/migrate/20221115082403_add_ldap_tls_options.rb
index eda3d679f5e3..03850cfdaa19 100644
--- a/db/migrate/20221115082403_add_ldap_tls_options.rb
+++ b/db/migrate/20221115082403_add_ldap_tls_options.rb
@@ -28,7 +28,7 @@
class AddLdapTlsOptions < ActiveRecord::Migration[7.0]
class MigratingAuthSource < ApplicationRecord
- self.table_name = "auth_sources"
+ self.table_name = 'auth_sources'
end
def change
diff --git a/db/migrate/20221213092910_remove_default_values_from_journal_tables_definition.rb b/db/migrate/20221213092910_remove_default_values_from_journal_tables_definition.rb
index 5a49bfc8e656..8e0db8218529 100644
--- a/db/migrate/20221213092910_remove_default_values_from_journal_tables_definition.rb
+++ b/db/migrate/20221213092910_remove_default_values_from_journal_tables_definition.rb
@@ -30,36 +30,36 @@ class RemoveDefaultValuesFromJournalTablesDefinition < ActiveRecord::Migration[7
# rubocop:disable Metrics/AbcSize
def change
change_table :attachable_journals, bulk: true do |t|
- t.change_default :filename, from: "", to: nil
+ t.change_default :filename, from: '', to: nil
end
change_table :attachment_journals, bulk: true do |t|
- t.change_default :filename, from: "", to: nil
- t.change_default :disk_filename, from: "", to: nil
+ t.change_default :filename, from: '', to: nil
+ t.change_default :disk_filename, from: '', to: nil
t.change_default :filesize, from: 0, to: nil
- t.change_default :content_type, from: "", to: nil
- t.change_default :digest, from: "", to: nil
+ t.change_default :content_type, from: '', to: nil
+ t.change_default :digest, from: '', to: nil
t.change_default :downloads, from: 0, to: nil
end
change_table :document_journals, bulk: true do |t|
- t.change_default :title, from: "", to: nil
+ t.change_default :title, from: '', to: nil
end
change_table :message_journals, bulk: true do |t|
- t.change_default :subject, from: "", to: nil
+ t.change_default :subject, from: '', to: nil
t.change_default :locked, from: false, to: nil
t.change_default :sticky, from: 0, to: nil
end
change_table :news_journals, bulk: true do |t|
- t.change_default :title, from: "", to: nil
- t.change_default :summary, from: "", to: nil
+ t.change_default :title, from: '', to: nil
+ t.change_default :summary, from: '', to: nil
t.change_default :comments_count, from: 0, to: nil
end
change_table :work_package_journals, bulk: true do |t|
- t.change_default :subject, from: "", to: nil
+ t.change_default :subject, from: '', to: nil
t.change_default :done_ratio, from: 0, to: nil
t.change_default :schedule_manually, from: false, to: nil
end
diff --git a/db/migrate/20230105073117_remove_renamed_date_alert_job.rb b/db/migrate/20230105073117_remove_renamed_date_alert_job.rb
index e59bc347aa68..9ae61bc1923b 100644
--- a/db/migrate/20230105073117_remove_renamed_date_alert_job.rb
+++ b/db/migrate/20230105073117_remove_renamed_date_alert_job.rb
@@ -30,6 +30,8 @@ class RemoveRenamedDateAlertJob < ActiveRecord::Migration[6.0]
def up
# The job has been renamed to Notifications::ScheduleDateAlertsNotificationsJob.
# The new job will be added on restarting the application.
- execute("DELETE FROM delayed_jobs WHERE handler LIKE '%job_class: Notifications::CreateDateAlertsNotificationsJob%'")
+ Delayed::Job
+ .where('handler LIKE ?', "%job_class: Notifications::CreateDateAlertsNotificationsJob%")
+ .delete_all
end
end
diff --git a/db/migrate/20230315103437_add_foreign_keys_to_workflows.rb b/db/migrate/20230315103437_add_foreign_keys_to_workflows.rb
index 51b58599edd6..e0674071b4e2 100644
--- a/db/migrate/20230315103437_add_foreign_keys_to_workflows.rb
+++ b/db/migrate/20230315103437_add_foreign_keys_to_workflows.rb
@@ -30,8 +30,8 @@ def up
Workflow.where.not(type: Type.all).destroy_all
add_foreign_key :workflows, :types, on_delete: :cascade, on_update: :cascade
Workflow.where.not(old_status_id: Status.all).or(Workflow.where.not(new_status_id: Status.all)).destroy_all
- add_foreign_key :workflows, :statuses, column: "old_status_id", on_delete: :cascade, on_update: :cascade
- add_foreign_key :workflows, :statuses, column: "new_status_id", on_delete: :cascade, on_update: :cascade
+ add_foreign_key :workflows, :statuses, column: 'old_status_id', on_delete: :cascade, on_update: :cascade
+ add_foreign_key :workflows, :statuses, column: 'new_status_id', on_delete: :cascade, on_update: :cascade
Workflow.where.not(role: Role.all).destroy_all
add_foreign_key :workflows, :roles, on_delete: :cascade, on_update: :cascade
end
diff --git a/db/migrate/20230322135932_merge_wiki_content_into_page.rb b/db/migrate/20230322135932_merge_wiki_content_into_page.rb
index a1fd45aacfe5..d97b2536fabf 100644
--- a/db/migrate/20230322135932_merge_wiki_content_into_page.rb
+++ b/db/migrate/20230322135932_merge_wiki_content_into_page.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "migration_utils/utils"
+require_relative 'migration_utils/utils'
class MergeWikiContentIntoPage < ActiveRecord::Migration[7.0]
include ::Migration::Utils
@@ -75,8 +75,8 @@ def drop_wiki_contents
t.datetime :updated_at, null: false
t.integer :lock_version, null: false
- t.index :author_id, name: "index_wiki_contents_on_author_id"
- t.index :page_id, name: "wiki_contents_page_id"
+ t.index :author_id, name: 'index_wiki_contents_on_author_id'
+ t.index :page_id, name: 'wiki_contents_page_id'
t.index %i[page_id updated_at]
end
end
diff --git a/db/migrate/20230328154645_add_gin_trgm_index_on_journals_and_custom_values.rb b/db/migrate/20230328154645_add_gin_trgm_index_on_journals_and_custom_values.rb
index 22c1d74a3ec7..ba11f3233880 100644
--- a/db/migrate/20230328154645_add_gin_trgm_index_on_journals_and_custom_values.rb
+++ b/db/migrate/20230328154645_add_gin_trgm_index_on_journals_and_custom_values.rb
@@ -30,9 +30,9 @@ class AddGinTrgmIndexOnJournalsAndCustomValues < ActiveRecord::Migration[7.0]
def up
safe_enable_pg_trgm_extension
- if extensions.include?("pg_trgm")
- add_index(:journals, :notes, using: "gin", opclass: :gin_trgm_ops)
- add_index(:custom_values, :value, using: "gin", opclass: :gin_trgm_ops)
+ if extensions.include?('pg_trgm')
+ add_index(:journals, :notes, using: 'gin', opclass: :gin_trgm_ops)
+ add_index(:custom_values, :value, using: 'gin', opclass: :gin_trgm_ops)
end
end
@@ -47,10 +47,10 @@ def down
def safe_enable_pg_trgm_extension
ActiveRecord::Base.connection.execute("CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA pg_catalog;")
rescue StandardError => e
- raise unless e.message.include?("pg_trgm")
+ raise unless e.message.include?('pg_trgm')
# Rollback the transaction in order to recover from the error.
- ActiveRecord::Base.connection.execute "ROLLBACK"
+ ActiveRecord::Base.connection.execute 'ROLLBACK'
warn <<~MESSAGE
diff --git a/db/migrate/20230531093004_remove_default_from_query_name.rb b/db/migrate/20230531093004_remove_default_from_query_name.rb
index f974e9ec9ff7..8f7f0c634665 100644
--- a/db/migrate/20230531093004_remove_default_from_query_name.rb
+++ b/db/migrate/20230531093004_remove_default_from_query_name.rb
@@ -1,5 +1,5 @@
class RemoveDefaultFromQueryName < ActiveRecord::Migration[7.0]
def change
- change_column_default :queries, :name, to: nil, from: ""
+ change_column_default :queries, :name, to: nil, from: ''
end
end
diff --git a/db/migrate/20230608151123_add_validity_period_to_journals.rb b/db/migrate/20230608151123_add_validity_period_to_journals.rb
index 40c97406f6c3..6a65e62ab879 100644
--- a/db/migrate/20230608151123_add_validity_period_to_journals.rb
+++ b/db/migrate/20230608151123_add_validity_period_to_journals.rb
@@ -12,12 +12,12 @@ def change
end
add_check_constraint :journals,
- "NOT isempty(validity_period) AND validity_period IS NOT NULL",
+ 'NOT isempty(validity_period) AND validity_period IS NOT NULL',
name: "journals_validity_period_not_empty"
end
def fix_all_journal_timestamps
- max_attempts = attempts = (ENV["MAX_JOURNAL_TIMESTAMPS_ATTEMPTS"].presence && ENV["MAX_JOURNAL_TIMESTAMPS_ATTEMPTS"].to_i) ||
+ max_attempts = attempts = (ENV['MAX_JOURNAL_TIMESTAMPS_ATTEMPTS'].presence && ENV['MAX_JOURNAL_TIMESTAMPS_ATTEMPTS'].to_i) ||
Journal.all.maximum(:version)
invalid_journables = nil
diff --git a/db/migrate/20230718084649_add_create_user_permission_to_roles.rb b/db/migrate/20230718084649_add_create_user_permission_to_roles.rb
index b91e0ceb4bd1..0819c3d03b32 100644
--- a/db/migrate/20230718084649_add_create_user_permission_to_roles.rb
+++ b/db/migrate/20230718084649_add_create_user_permission_to_roles.rb
@@ -1,17 +1,17 @@
class AddCreateUserPermissionToRoles < ActiveRecord::Migration[7.0]
class MigrationRolePermission < ApplicationRecord
- self.table_name = "role_permissions"
+ self.table_name = 'role_permissions'
end
def up
- role_ids = MigrationRolePermission.where(permission: "manage_user").pluck(:role_id)
+ role_ids = MigrationRolePermission.where(permission: 'manage_user').pluck(:role_id)
role_ids.each do |role_id|
- MigrationRolePermission.create(permission: "create_user", role_id:)
+ MigrationRolePermission.create(permission: 'create_user', role_id:)
end
end
def down
- MigrationRolePermission.where(permission: "create_user").delete_all
+ MigrationRolePermission.where(permission: 'create_user').delete_all
end
end
diff --git a/db/migrate/20230810074642_add_optional_entity_to_members.rb b/db/migrate/20230810074642_add_optional_entity_to_members.rb
index 95fa693d3d5a..1ba9a51a8ae0 100644
--- a/db/migrate/20230810074642_add_optional_entity_to_members.rb
+++ b/db/migrate/20230810074642_add_optional_entity_to_members.rb
@@ -6,11 +6,11 @@ def change
add_index :members, %i[user_id project_id],
unique: true,
where: "entity_type IS NULL AND entity_id IS NULL",
- name: "index_members_on_user_id_and_project_without_entity"
+ name: 'index_members_on_user_id_and_project_without_entity'
add_index :members, %i[user_id project_id entity_type entity_id],
unique: true,
where: "entity_type IS NOT NULL AND entity_id IS NOT NULL",
- name: "index_members_on_user_id_and_project_with_entity"
+ name: 'index_members_on_user_id_and_project_with_entity'
end
end
diff --git a/db/migrate/20230829151629_add_copy_work_packages_permission_to_roles.rb b/db/migrate/20230829151629_add_copy_work_packages_permission_to_roles.rb
index 2b214a967034..2ef9ba3c1898 100644
--- a/db/migrate/20230829151629_add_copy_work_packages_permission_to_roles.rb
+++ b/db/migrate/20230829151629_add_copy_work_packages_permission_to_roles.rb
@@ -28,12 +28,12 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "migration_utils/permission_adder"
+require_relative 'migration_utils/permission_adder'
class AddCopyWorkPackagesPermissionToRoles < ActiveRecord::Migration[7.0]
# Decouple ActiveRecord model from Migration
class MigrationRolePermission < ApplicationRecord
- self.table_name = "role_permissions"
+ self.table_name = 'role_permissions'
end
def up
@@ -43,6 +43,6 @@ def up
end
def down
- MigrationRolePermission.where(permission: "copy_work_packages").delete_all
+ MigrationRolePermission.where(permission: 'copy_work_packages').delete_all
end
end
diff --git a/db/migrate/20230905090205_add_share_workpackages_permission.rb b/db/migrate/20230905090205_add_share_workpackages_permission.rb
index 84b28bb9d439..2e7ee6bd5237 100644
--- a/db/migrate/20230905090205_add_share_workpackages_permission.rb
+++ b/db/migrate/20230905090205_add_share_workpackages_permission.rb
@@ -28,12 +28,12 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "migration_utils/permission_adder"
+require_relative 'migration_utils/permission_adder'
class AddShareWorkpackagesPermission < ActiveRecord::Migration[7.0]
# Decouple ActiveRecord model from Migration
class MigrationRolePermission < ApplicationRecord
- self.table_name = "role_permissions"
+ self.table_name = 'role_permissions'
end
def up
@@ -42,6 +42,6 @@ def up
end
def down
- MigrationRolePermission.where(permission: "share_work_packages").delete_all
+ MigrationRolePermission.where(permission: 'share_work_packages').delete_all
end
end
diff --git a/db/migrate/20230912185647_add_view_shared_work_packages_permission.rb b/db/migrate/20230912185647_add_view_shared_work_packages_permission.rb
index 1e55b42832aa..cfcaede77826 100644
--- a/db/migrate/20230912185647_add_view_shared_work_packages_permission.rb
+++ b/db/migrate/20230912185647_add_view_shared_work_packages_permission.rb
@@ -26,12 +26,12 @@
# See COPYRIGHT and LICENSE files for more details.
# ++
-require_relative "migration_utils/permission_adder"
+require_relative 'migration_utils/permission_adder'
class AddViewSharedWorkPackagesPermission < ActiveRecord::Migration[7.0]
# Decouple ActiveRecord model from Migration
class MigrationRolePermission < ApplicationRecord
- self.table_name = "role_permissions"
+ self.table_name = 'role_permissions'
end
def up
@@ -39,6 +39,6 @@ def up
end
def down
- MigrationRolePermission.where(permission: "share_work_packages").delete_all
+ MigrationRolePermission.where(permission: 'share_work_packages').delete_all
end
end
diff --git a/db/migrate/20231002141527_fix_default_language_value_for_chinese_simplified.rb b/db/migrate/20231002141527_fix_default_language_value_for_chinese_simplified.rb
index 384677737c93..72d40d8cb900 100644
--- a/db/migrate/20231002141527_fix_default_language_value_for_chinese_simplified.rb
+++ b/db/migrate/20231002141527_fix_default_language_value_for_chinese_simplified.rb
@@ -1,5 +1,5 @@
class FixDefaultLanguageValueForChineseSimplified < ActiveRecord::Migration[7.0]
def up
- Setting.where(name: "default_language", value: "zh").update_all(value: "zh-CN")
+ Setting.where(name: 'default_language', value: 'zh').update_all(value: 'zh-CN')
end
end
diff --git a/db/migrate/20231005113307_role_to_project_role.rb b/db/migrate/20231005113307_role_to_project_role.rb
index 0b1e101c34d9..64b86d53ccd2 100644
--- a/db/migrate/20231005113307_role_to_project_role.rb
+++ b/db/migrate/20231005113307_role_to_project_role.rb
@@ -1,10 +1,10 @@
class RoleToProjectRole < ActiveRecord::Migration[7.0]
def up
- rename_role("Role", "ProjectRole")
+ rename_role('Role', 'ProjectRole')
end
def down
- rename_role("ProjectRole", "Role")
+ rename_role('ProjectRole', 'Role')
end
private
diff --git a/db/migrate/20231020154219_add_trgm_index_to_meeting_agenda_item_notes.rb b/db/migrate/20231020154219_add_trgm_index_to_meeting_agenda_item_notes.rb
index f5e2630b8b5d..3bd4837286de 100644
--- a/db/migrate/20231020154219_add_trgm_index_to_meeting_agenda_item_notes.rb
+++ b/db/migrate/20231020154219_add_trgm_index_to_meeting_agenda_item_notes.rb
@@ -4,8 +4,8 @@ def change
# already enabled on the extension. Hence we do not attempt to enable it here, just
# to use it if it's available.
- if extensions.include?("pg_trgm")
- add_index(:meeting_agenda_items, :notes, using: "gin", opclass: :gin_trgm_ops)
+ if extensions.include?('pg_trgm')
+ add_index(:meeting_agenda_items, :notes, using: 'gin', opclass: :gin_trgm_ops)
end
end
end
diff --git a/db/migrate/20231025144701_migrate_agenda_item_permissions.rb b/db/migrate/20231025144701_migrate_agenda_item_permissions.rb
index 78265bc7ee7b..4b7bddb9b5d6 100644
--- a/db/migrate/20231025144701_migrate_agenda_item_permissions.rb
+++ b/db/migrate/20231025144701_migrate_agenda_item_permissions.rb
@@ -28,10 +28,10 @@
class MigrateAgendaItemPermissions < ActiveRecord::Migration[7.0]
def up
- RolePermission.where(permission: "create_meeting_agendas").update_all(permission: "manage_agendas")
+ RolePermission.where(permission: 'create_meeting_agendas').update_all(permission: 'manage_agendas')
end
def down
- RolePermission.where(permission: "manage_agendas").update_all(permission: "create_meeting_agendas")
+ RolePermission.where(permission: 'manage_agendas').update_all(permission: 'create_meeting_agendas')
end
end
diff --git a/db/migrate/20231027102747_rollback_create_meeting_agendas_and_split_edit_meeting_role.rb b/db/migrate/20231027102747_rollback_create_meeting_agendas_and_split_edit_meeting_role.rb
index 4d52c0e2ffd5..3310d0e675a9 100644
--- a/db/migrate/20231027102747_rollback_create_meeting_agendas_and_split_edit_meeting_role.rb
+++ b/db/migrate/20231027102747_rollback_create_meeting_agendas_and_split_edit_meeting_role.rb
@@ -31,7 +31,7 @@
class RollbackCreateMeetingAgendasAndSplitEditMeetingRole < ActiveRecord::Migration[7.0]
def up
# Rollback the create_meeting_agendas permission
- RolePermission.where(permission: "manage_agendas").update_all(permission: "create_meeting_agendas")
+ RolePermission.where(permission: 'manage_agendas').update_all(permission: 'create_meeting_agendas')
# Introduce manage_agendas permission, that is being split from the edit_meeting permission
::Migration::MigrationUtils::PermissionAdder
@@ -40,7 +40,7 @@ def up
end
def down
- RolePermission.where(permission: "manage_agendas").destroy_all
- RolePermission.where(permission: "create_meeting_agendas").update_all(permission: "manage_agendas")
+ RolePermission.where(permission: 'manage_agendas').destroy_all
+ RolePermission.where(permission: 'create_meeting_agendas').update_all(permission: 'manage_agendas')
end
end
diff --git a/db/migrate/20231128080650_add_work_package_roles.rb b/db/migrate/20231128080650_add_work_package_roles.rb
index 4143842141ac..859a3c488d34 100644
--- a/db/migrate/20231128080650_add_work_package_roles.rb
+++ b/db/migrate/20231128080650_add_work_package_roles.rb
@@ -1,13 +1,13 @@
class AddWorkPackageRoles < ActiveRecord::Migration[7.0]
def up
# This is how the role was seeded in the first iteration of seeds
- editor_role = WorkPackageRole.find_by(builtin: Role::NON_BUILTIN, name: "Work Package Editor")
+ editor_role = WorkPackageRole.find_by(builtin: Role::NON_BUILTIN, name: 'Work Package Editor')
# If we couldn't find a WP from the first iteration of the seeds, find it by the builtin
editor_role ||= WorkPackageRole.find_or_initialize_by(builtin: Role::BUILTIN_WORK_PACKAGE_EDITOR)
editor_role.update!(
builtin: Role::BUILTIN_WORK_PACKAGE_EDITOR,
- name: I18n.t("seeds.common.work_package_roles.item_0.name", default: "Work package editor"),
+ name: I18n.t('seeds.common.work_package_roles.item_0.name', default: 'Work package editor'),
permissions: %i[
view_work_packages
edit_work_packages
@@ -26,12 +26,12 @@ def up
)
# This is how the role was seeded in the first iteration of seeds
- commenter_role = WorkPackageRole.find_by(builtin: Role::NON_BUILTIN, name: "Work Package Commenter")
+ commenter_role = WorkPackageRole.find_by(builtin: Role::NON_BUILTIN, name: 'Work Package Commenter')
# If we couldn't find a WP from the first iteration of the seeds, find it by the builtin
commenter_role ||= WorkPackageRole.find_or_initialize_by(builtin: Role::BUILTIN_WORK_PACKAGE_COMMENTER)
commenter_role.update!(
builtin: Role::BUILTIN_WORK_PACKAGE_COMMENTER,
- name: I18n.t("seeds.common.work_package_roles.item_1.name", default: "Work package commenter"),
+ name: I18n.t('seeds.common.work_package_roles.item_1.name', default: 'Work package commenter'),
permissions: %i[
view_work_packages
work_package_assigned
@@ -48,13 +48,13 @@ def up
)
# This is how the role was seeded in the first iteration of seeds
- viewer_role = WorkPackageRole.find_by(builtin: Role::NON_BUILTIN, name: "Work Package Viewer")
+ viewer_role = WorkPackageRole.find_by(builtin: Role::NON_BUILTIN, name: 'Work Package Viewer')
# If we couldn't find a WP from the first iteration of the seeds, find it by the builtin
viewer_role ||= WorkPackageRole.find_or_initialize_by(builtin: Role::BUILTIN_WORK_PACKAGE_VIEWER)
# Set up attributes
viewer_role.update!(
builtin: Role::BUILTIN_WORK_PACKAGE_VIEWER,
- name: I18n.t("seeds.common.work_package_roles.item_2.name", default: "Work package viewer"),
+ name: I18n.t('seeds.common.work_package_roles.item_2.name', default: 'Work package viewer'),
permissions: %i[
view_work_packages
export_work_packages
diff --git a/db/migrate/20231201085450_change_view_of_queries_with_timeline_to_gantt.rb b/db/migrate/20231201085450_change_view_of_queries_with_timeline_to_gantt.rb
index d8d220a7a589..0cf2b11907b8 100644
--- a/db/migrate/20231201085450_change_view_of_queries_with_timeline_to_gantt.rb
+++ b/db/migrate/20231201085450_change_view_of_queries_with_timeline_to_gantt.rb
@@ -1,23 +1,23 @@
class ChangeViewOfQueriesWithTimelineToGantt < ActiveRecord::Migration[7.0]
class MigrationQuery < ApplicationRecord
- self.table_name = "queries"
+ self.table_name = 'queries'
end
class MigrationView < ApplicationRecord
- self.table_name = "views"
+ self.table_name = 'views'
# disable STI
self.inheritance_column = :_type_disabled
- belongs_to :query, class_name: "MigrationQuery"
+ belongs_to :query, class_name: 'MigrationQuery'
end
def up
- update_view_type_for_timeline_queries(from_view_type: "work_packages_table", to_view_type: "gantt")
+ update_view_type_for_timeline_queries(from_view_type: 'work_packages_table', to_view_type: 'gantt')
end
def down
- update_view_type_for_timeline_queries(from_view_type: "gantt", to_view_type: "work_packages_table")
+ update_view_type_for_timeline_queries(from_view_type: 'gantt', to_view_type: 'work_packages_table')
end
private
@@ -25,7 +25,7 @@ def down
def update_view_type_for_timeline_queries(from_view_type:, to_view_type:)
MigrationView
.joins(:query)
- .where("queries.timeline_visible": true)
+ .where('queries.timeline_visible': true)
.where(type: from_view_type)
.update_all(type: to_view_type)
end
diff --git a/db/migrate/20240123151246_create_good_jobs.rb b/db/migrate/20240123151246_create_good_jobs.rb
deleted file mode 100644
index 83cb7893fae8..000000000000
--- a/db/migrate/20240123151246_create_good_jobs.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# frozen_string_literal: true
-
-class CreateGoodJobs < ActiveRecord::Migration[7.0]
- def change
- # Uncomment for Postgres v12 or earlier to enable gen_random_uuid() support
- # enable_extension 'pgcrypto'
-
- create_table :good_jobs, id: :uuid do |t|
- t.text :queue_name
- t.integer :priority
- t.jsonb :serialized_params
- t.datetime :scheduled_at
- t.datetime :performed_at
- t.datetime :finished_at
- t.text :error
-
- t.timestamps
-
- t.uuid :active_job_id
- t.text :concurrency_key
- t.text :cron_key
- t.uuid :retried_good_job_id
- t.datetime :cron_at
- end
-
- create_table :good_job_processes, id: :uuid do |t|
- t.timestamps
- t.jsonb :state
- end
-
- add_index :good_jobs, :scheduled_at, where: "(finished_at IS NULL)", name: :index_good_jobs_on_scheduled_at
- add_index :good_jobs, [:queue_name, :scheduled_at], where: "(finished_at IS NULL)", name: :index_good_jobs_on_queue_name_and_scheduled_at
- add_index :good_jobs, [:active_job_id, :created_at], name: :index_good_jobs_on_active_job_id_and_created_at
- add_index :good_jobs, :concurrency_key, where: "(finished_at IS NULL)", name: :index_good_jobs_on_concurrency_key_when_unfinished
- add_index :good_jobs, [:cron_key, :created_at], name: :index_good_jobs_on_cron_key_and_created_at
- add_index :good_jobs, [:cron_key, :cron_at], name: :index_good_jobs_on_cron_key_and_cron_at, unique: true
- add_index :good_jobs, [:active_job_id], name: :index_good_jobs_on_active_job_id
- add_index :good_jobs, [:finished_at], where: "retried_good_job_id IS NULL AND finished_at IS NOT NULL", name: :index_good_jobs_jobs_on_finished_at
- end
-end
diff --git a/db/migrate/20240123151247_create_good_job_settings.rb b/db/migrate/20240123151247_create_good_job_settings.rb
deleted file mode 100644
index fa3540174a62..000000000000
--- a/db/migrate/20240123151247_create_good_job_settings.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# frozen_string_literal: true
-
-class CreateGoodJobSettings < ActiveRecord::Migration[7.0]
- def change
- reversible do |dir|
- dir.up do
- # Ensure this incremental update migration is idempotent
- # with monolithic install migration.
- return if connection.table_exists?(:good_job_settings)
- end
- end
-
- create_table :good_job_settings, id: :uuid do |t|
- t.timestamps
- t.text :key
- t.jsonb :value
- t.index :key, unique: true
- end
- end
-end
diff --git a/db/migrate/20240123151248_create_index_good_jobs_jobs_on_priority_created_at_when_unfinished.rb b/db/migrate/20240123151248_create_index_good_jobs_jobs_on_priority_created_at_when_unfinished.rb
deleted file mode 100644
index 7b9dbab3816f..000000000000
--- a/db/migrate/20240123151248_create_index_good_jobs_jobs_on_priority_created_at_when_unfinished.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-class CreateIndexGoodJobsJobsOnPriorityCreatedAtWhenUnfinished < ActiveRecord::Migration[7.0]
- disable_ddl_transaction!
-
- def change
- reversible do |dir|
- dir.up do
- # Ensure this incremental update migration is idempotent
- # with monolithic install migration.
- return if connection.index_name_exists?(:good_jobs, :index_good_jobs_jobs_on_priority_created_at_when_unfinished)
- end
- end
-
- add_index :good_jobs, [:priority, :created_at], order: { priority: "DESC NULLS LAST", created_at: :asc },
- where: "finished_at IS NULL", name: :index_good_jobs_jobs_on_priority_created_at_when_unfinished,
- algorithm: :concurrently
- end
-end
diff --git a/db/migrate/20240123151249_create_good_job_batches.rb b/db/migrate/20240123151249_create_good_job_batches.rb
deleted file mode 100644
index ac6c5b37e982..000000000000
--- a/db/migrate/20240123151249_create_good_job_batches.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# frozen_string_literal: true
-
-class CreateGoodJobBatches < ActiveRecord::Migration[7.0]
- def change
- reversible do |dir|
- dir.up do
- # Ensure this incremental update migration is idempotent
- # with monolithic install migration.
- return if connection.table_exists?(:good_job_batches)
- end
- end
-
- create_table :good_job_batches, id: :uuid do |t|
- t.timestamps
- t.text :description
- t.jsonb :serialized_properties
- t.text :on_finish
- t.text :on_success
- t.text :on_discard
- t.text :callback_queue_name
- t.integer :callback_priority
- t.datetime :enqueued_at
- t.datetime :discarded_at
- t.datetime :finished_at
- end
-
- change_table :good_jobs do |t|
- t.uuid :batch_id
- t.uuid :batch_callback_id
-
- t.index :batch_id, where: "batch_id IS NOT NULL"
- t.index :batch_callback_id, where: "batch_callback_id IS NOT NULL"
- end
- end
-end
diff --git a/db/migrate/20240123151250_create_good_job_executions.rb b/db/migrate/20240123151250_create_good_job_executions.rb
deleted file mode 100644
index 32723220ccec..000000000000
--- a/db/migrate/20240123151250_create_good_job_executions.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-# frozen_string_literal: true
-
-class CreateGoodJobExecutions < ActiveRecord::Migration[7.0]
- def change
- reversible do |dir|
- dir.up do
- # Ensure this incremental update migration is idempotent
- # with monolithic install migration.
- return if connection.table_exists?(:good_job_executions)
- end
- end
-
- create_table :good_job_executions, id: :uuid do |t|
- t.timestamps
-
- t.uuid :active_job_id, null: false
- t.text :job_class
- t.text :queue_name
- t.jsonb :serialized_params
- t.datetime :scheduled_at
- t.datetime :finished_at
- t.text :error
-
- t.index [:active_job_id, :created_at], name: :index_good_job_executions_on_active_job_id_and_created_at
- end
-
- change_table :good_jobs do |t|
- t.boolean :is_discrete
- t.integer :executions_count
- t.text :job_class
- end
- end
-end
diff --git a/db/migrate/20240123151251_create_good_jobs_error_event.rb b/db/migrate/20240123151251_create_good_jobs_error_event.rb
deleted file mode 100644
index b07e0f14e7f1..000000000000
--- a/db/migrate/20240123151251_create_good_jobs_error_event.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# frozen_string_literal: true
-
-class CreateGoodJobsErrorEvent < ActiveRecord::Migration[7.0]
- def change
- reversible do |dir|
- dir.up do
- # Ensure this incremental update migration is idempotent
- # with monolithic install migration.
- return if connection.column_exists?(:good_jobs, :error_event)
- end
- end
-
- add_column :good_jobs, :error_event, :integer, limit: 2
- add_column :good_job_executions, :error_event, :integer, limit: 2
- end
-end
diff --git a/db/migrate/20240123151252_recreate_good_job_cron_indexes_with_conditional.rb b/db/migrate/20240123151252_recreate_good_job_cron_indexes_with_conditional.rb
deleted file mode 100644
index aff2d4eae9a8..000000000000
--- a/db/migrate/20240123151252_recreate_good_job_cron_indexes_with_conditional.rb
+++ /dev/null
@@ -1,45 +0,0 @@
-# frozen_string_literal: true
-
-class RecreateGoodJobCronIndexesWithConditional < ActiveRecord::Migration[7.0]
- disable_ddl_transaction!
-
- def change
- reversible do |dir|
- dir.up do
- unless connection.index_name_exists?(:good_jobs, :index_good_jobs_on_cron_key_and_created_at_cond)
- add_index :good_jobs, [:cron_key, :created_at], where: "(cron_key IS NOT NULL)",
- name: :index_good_jobs_on_cron_key_and_created_at_cond, algorithm: :concurrently
- end
- unless connection.index_name_exists?(:good_jobs, :index_good_jobs_on_cron_key_and_cron_at_cond)
- add_index :good_jobs, [:cron_key, :cron_at], where: "(cron_key IS NOT NULL)", unique: true,
- name: :index_good_jobs_on_cron_key_and_cron_at_cond, algorithm: :concurrently
- end
-
- if connection.index_name_exists?(:good_jobs, :index_good_jobs_on_cron_key_and_created_at)
- remove_index :good_jobs, name: :index_good_jobs_on_cron_key_and_created_at
- end
- if connection.index_name_exists?(:good_jobs, :index_good_jobs_on_cron_key_and_cron_at)
- remove_index :good_jobs, name: :index_good_jobs_on_cron_key_and_cron_at
- end
- end
-
- dir.down do
- unless connection.index_name_exists?(:good_jobs, :index_good_jobs_on_cron_key_and_created_at)
- add_index :good_jobs, [:cron_key, :created_at],
- name: :index_good_jobs_on_cron_key_and_created_at, algorithm: :concurrently
- end
- unless connection.index_name_exists?(:good_jobs, :index_good_jobs_on_cron_key_and_cron_at)
- add_index :good_jobs, [:cron_key, :cron_at], unique: true,
- name: :index_good_jobs_on_cron_key_and_cron_at, algorithm: :concurrently
- end
-
- if connection.index_name_exists?(:good_jobs, :index_good_jobs_on_cron_key_and_created_at_cond)
- remove_index :good_jobs, name: :index_good_jobs_on_cron_key_and_created_at_cond
- end
- if connection.index_name_exists?(:good_jobs, :index_good_jobs_on_cron_key_and_cron_at_cond)
- remove_index :good_jobs, name: :index_good_jobs_on_cron_key_and_cron_at_cond
- end
- end
- end
- end
-end
diff --git a/db/migrate/20240131130149_enable_gantt_module_for_all_projects.rb b/db/migrate/20240131130149_enable_gantt_module_for_all_projects.rb
index ef7c1484219d..ef5951220d64 100644
--- a/db/migrate/20240131130149_enable_gantt_module_for_all_projects.rb
+++ b/db/migrate/20240131130149_enable_gantt_module_for_all_projects.rb
@@ -1,4 +1,4 @@
-require_relative "migration_utils/utils"
+require_relative 'migration_utils/utils'
class EnableGanttModuleForAllProjects < ActiveRecord::Migration[7.0]
include ::Migration::Utils
diff --git a/db/migrate/20240201115019_add_gantt_module_to_default_modules.rb b/db/migrate/20240201115019_add_gantt_module_to_default_modules.rb
index 80ce0a01129c..53dc268ee379 100644
--- a/db/migrate/20240201115019_add_gantt_module_to_default_modules.rb
+++ b/db/migrate/20240201115019_add_gantt_module_to_default_modules.rb
@@ -1,7 +1,7 @@
class AddGanttModuleToDefaultModules < ActiveRecord::Migration[7.0]
def up
- unless Setting.default_projects_modules.include?("gantt")
- Setting.default_projects_modules = Setting.default_projects_modules + ["gantt"]
+ unless Setting.default_projects_modules.include?('gantt')
+ Setting.default_projects_modules = Setting.default_projects_modules + ['gantt']
end
end
diff --git a/db/migrate/20240206085104_remove_enums.rb b/db/migrate/20240206085104_remove_enums.rb
index c89706010449..a991f7b1c522 100644
--- a/db/migrate/20240206085104_remove_enums.rb
+++ b/db/migrate/20240206085104_remove_enums.rb
@@ -1,24 +1,24 @@
class RemoveEnums < ActiveRecord::Migration[7.1]
def up
- change_column(:storages, :health_status, :string, default: "pending")
+ change_column(:storages, :health_status, :string, default: 'pending')
add_check_constraint(:storages,
- "health_status IN ('pending', 'healthy', 'unhealthy')",
- name: "storages_health_status_check")
+ 'health_status IN (\'pending\', \'healthy\', \'unhealthy\')',
+ name: 'storages_health_status_check')
- change_column(:last_project_folders, :mode, :string, default: "inactive")
+ change_column(:last_project_folders, :mode, :string, default: 'inactive')
add_check_constraint(:last_project_folders,
- "mode IN ('inactive', 'manual', 'automatic')",
- name: "last_project_folders_mode_check")
+ 'mode IN (\'inactive\', \'manual\', \'automatic\')',
+ name: 'last_project_folders_mode_check')
change_column(:project_storages, :project_folder_mode, :string)
add_check_constraint(:project_storages,
- "project_folder_mode IN ('inactive', 'manual', 'automatic')",
- name: "project_storages_project_folder_mode_check")
+ 'project_folder_mode IN (\'inactive\', \'manual\', \'automatic\')',
+ name: 'project_storages_project_folder_mode_check')
- change_column(:delayed_job_statuses, :status, :string, default: "in_queue")
+ change_column(:delayed_job_statuses, :status, :string, default: 'in_queue')
add_check_constraint(:delayed_job_statuses,
- "status IS NULL OR status IN ('in_queue', 'error', 'in_process', 'success', 'failure', 'cancelled')",
- name: "delayed_job_statuses_status_check")
+ 'status IS NULL OR status IN (\'in_queue\', \'error\', \'in_process\', \'success\', \'failure\', \'cancelled\')',
+ name: 'delayed_job_statuses_status_check')
execute <<~SQL.squish
DROP TYPE delayed_job_status RESTRICT;
@@ -51,23 +51,23 @@ def down
);
SQL
- remove_check_constraint(:storages, name: "storages_health_status_check")
+ remove_check_constraint(:storages, name: 'storages_health_status_check')
change_column(:storages, :health_status, :storage_health_statuses, default: nil,
- using: "health_status::storage_health_statuses")
+ using: 'health_status::storage_health_statuses')
- remove_check_constraint(:last_project_folders, name: "last_project_folders_mode_check")
+ remove_check_constraint(:last_project_folders, name: 'last_project_folders_mode_check')
- change_column_default(:storages, :health_status, "pending")
+ change_column_default(:storages, :health_status, 'pending')
- change_column(:last_project_folders, :mode, :project_folder_modes, default: nil, using: "mode::project_folder_modes")
- change_column_default(:last_project_folders, :mode, "inactive")
+ change_column(:last_project_folders, :mode, :project_folder_modes, default: nil, using: 'mode::project_folder_modes')
+ change_column_default(:last_project_folders, :mode, 'inactive')
- remove_check_constraint(:project_storages, name: "project_storages_project_folder_mode_check")
+ remove_check_constraint(:project_storages, name: 'project_storages_project_folder_mode_check')
change_column(:project_storages, :project_folder_mode, :project_folder_modes, default: nil,
- using: "project_folder_mode::project_folder_modes")
+ using: 'project_folder_mode::project_folder_modes')
- remove_check_constraint(:delayed_job_statuses, name: "delayed_job_statuses_status_check")
- change_column(:delayed_job_statuses, :status, :delayed_job_status, default: nil, using: "status::delayed_job_status")
- change_column_default(:delayed_job_statuses, :status, "in_queue")
+ remove_check_constraint(:delayed_job_statuses, name: 'delayed_job_statuses_status_check')
+ change_column(:delayed_job_statuses, :status, :delayed_job_status, default: nil, using: 'status::delayed_job_status')
+ change_column_default(:delayed_job_statuses, :status, 'in_queue')
end
end
diff --git a/db/migrate/20240206173841_fix_untranslated_work_package_roles.rb b/db/migrate/20240206173841_fix_untranslated_work_package_roles.rb
index 5e4856811558..b6d119b1c1d7 100644
--- a/db/migrate/20240206173841_fix_untranslated_work_package_roles.rb
+++ b/db/migrate/20240206173841_fix_untranslated_work_package_roles.rb
@@ -7,7 +7,7 @@ def up
end
def seed_work_package_roles_data
- seed_data = RootSeeder.new.translated_seed_data_for("work_package_roles", "modules_permissions")
+ seed_data = RootSeeder.new.translated_seed_data_for('work_package_roles', 'modules_permissions')
seeder = BasicData::WorkPackageRoleSeeder.new(seed_data)
seeder.mapped_models_data
end
diff --git a/db/migrate/20240227154544_remove_delayed_jobs.rb b/db/migrate/20240227154544_remove_delayed_jobs.rb
deleted file mode 100644
index cc47c1c9d066..000000000000
--- a/db/migrate/20240227154544_remove_delayed_jobs.rb
+++ /dev/null
@@ -1,89 +0,0 @@
-#-- copyright
-# OpenProject is an open source project management software.
-# Copyright (C) 2012-2024 the OpenProject GmbH
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License version 3.
-#
-# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
-# Copyright (C) 2006-2013 Jean-Philippe Lang
-# Copyright (C) 2010-2013 the ChiliProject Team
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# See COPYRIGHT and LICENSE files for more details.
-#++
-
-class RemoveDelayedJobs < ActiveRecord::Migration[7.1]
- # it is needed, because ActiveJob::QueueAdapters::DelayedJobAdapter::JobWrapper
- # can not be used without required delayed_job
- # See https://github.com/rails/rails/blob/6f0d1ad14b92b9f5906e44740fce8b4f1c7075dc/activejob/lib/active_job/queue_adapters/delayed_job_adapter.rb
- class JobWrapperDeserializationMock
- attr_accessor :job_data
-
- def initialize(job_data)
- @job_data = job_data
- end
- end
-
- def change
- reversible do |direction|
- direction.up do
- tuples = execute <<~SQL
- select * from delayed_jobs
- where locked_by is null -- not in progress
- and handler NOT LIKE '%job_class: Storages::ManageNextcloudIntegrationEventsJob%' -- no need to migrate. It will be run later with cron.
- and cron is null -- not cron schedule
- FOR UPDATE; -- to prevent potentialy running delayed_job process working on these jobs(delayed_job uses SELECT FOR UPDATE to get workable jobs)
- SQL
- tuples.each do |tuple|
- handler = tuple["handler"].gsub("ruby/object:ActiveJob::QueueAdapters::DelayedJobAdapter::JobWrapper",
- "ruby/object:#{RemoveDelayedJobs::JobWrapperDeserializationMock.name}")
- job_data = YAML.load(handler, permitted_classes: [RemoveDelayedJobs::JobWrapperDeserializationMock])
- .job_data
- new_uuid = SecureRandom.uuid
- good_job_record = GoodJob::BaseExecution.new
- good_job_record.id = new_uuid
- good_job_record.serialized_params = job_data
- good_job_record.serialized_params["job_id"] = new_uuid
- good_job_record.queue_name = job_data["queue_name"]
- good_job_record.priority = job_data["priority"]
- good_job_record.scheduled_at = job_data["scheduled_at"]
- good_job_record.active_job_id = new_uuid
- good_job_record.concurrency_key = nil
- good_job_record.job_class = job_data["job_class"]
- good_job_record.save!
- end
- end
- direction.down {}
- end
-
- drop_table :delayed_jobs do |t|
- t.integer :priority, default: 0
- t.integer :attempts, default: 0
- t.text :handler
- t.text :last_error
- t.datetime :run_at
- t.datetime :locked_at
- t.datetime :failed_at
- t.string :locked_by
- t.timestamps null: true
- t.string :queue
- t.string :cron
-
- t.index %i[priority run_at], name: "delayed_jobs_priority"
- end
- end
-end
diff --git a/db/migrate/20240306083241_change_default_value_of_alternative_color.rb b/db/migrate/20240306083241_change_default_value_of_alternative_color.rb
index 5b6c6a90bcec..118de5da5488 100644
--- a/db/migrate/20240306083241_change_default_value_of_alternative_color.rb
+++ b/db/migrate/20240306083241_change_default_value_of_alternative_color.rb
@@ -1,17 +1,17 @@
class ChangeDefaultValueOfAlternativeColor < ActiveRecord::Migration[7.1]
class MigrationDesignColor < ApplicationRecord
- self.table_name = "design_colors"
+ self.table_name = 'design_colors'
end
def up
- alternative_color = MigrationDesignColor.find_by(variable: "alternative-color")
+ alternative_color = MigrationDesignColor.find_by(variable: 'alternative-color')
if alternative_color&.hexcode == OpenProject::CustomStyles::ColorThemes::DEPRECATED_ALTERNATIVE_COLOR
alternative_color.update(hexcode: OpenProject::CustomStyles::ColorThemes::PRIMER_PRIMARY_BUTTON_COLOR)
end
end
def down
- alternative_color = MigrationDesignColor.find_by(variable: "alternative-color")
+ alternative_color = MigrationDesignColor.find_by(variable: 'alternative-color')
if alternative_color&.hexcode == OpenProject::CustomStyles::ColorThemes::PRIMER_PRIMARY_BUTTON_COLOR
alternative_color.update(hexcode: OpenProject::CustomStyles::ColorThemes::DEPRECATED_ALTERNATIVE_COLOR)
end
diff --git a/db/migrate/20240306154734_create_good_job_labels.rb b/db/migrate/20240306154734_create_good_job_labels.rb
deleted file mode 100644
index 48e9770eedb4..000000000000
--- a/db/migrate/20240306154734_create_good_job_labels.rb
+++ /dev/null
@@ -1,43 +0,0 @@
-# frozen_string_literal: true
-
-#-- copyright
-# OpenProject is an open source project management software.
-# Copyright (C) 2012-2024 the OpenProject GmbH
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License version 3.
-#
-# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
-# Copyright (C) 2006-2013 Jean-Philippe Lang
-# Copyright (C) 2010-2013 the ChiliProject Team
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# See COPYRIGHT and LICENSE files for more details.
-#++
-
-class CreateGoodJobLabels < ActiveRecord::Migration[7.1]
- def change
- reversible do |dir|
- dir.up do
- # Ensure this incremental update migration is idempotent
- # with monolithic install migration.
- return if connection.column_exists?(:good_jobs, :labels)
- end
- end
-
- add_column :good_jobs, :labels, :text, array: true
- end
-end
diff --git a/db/migrate/20240307102541_reduce_configurable_design_variables.rb b/db/migrate/20240307102541_reduce_configurable_design_variables.rb
deleted file mode 100644
index bf0ac9a36aed..000000000000
--- a/db/migrate/20240307102541_reduce_configurable_design_variables.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-class ReduceConfigurableDesignVariables < ActiveRecord::Migration[7.1]
- class MigrationDesignColor < ApplicationRecord
- self.table_name = "design_colors"
- end
-
- def up
- # Delete "primary-color" and "primary-color-dark"
- MigrationDesignColor
- .where(variable: %w(primary-color primary-color-dark))
- .delete_all
-
- # Rename "alternative-color" to "primary-button-color"
- MigrationDesignColor
- .where(variable: "alternative-color")
- .update(variable: "primary-button-color")
-
- # Rename "content-link-color" to "accent-color"
- MigrationDesignColor
- .where(variable: "content-link-color")
- .update(variable: "accent-color")
- end
-
- def down
- MigrationDesignColor
- .create(variable: "primary-color", hexcode: OpenProject::CustomStyles::ColorThemes::DEPRECATED_PRIMARY_COLOR)
- MigrationDesignColor
- .create(variable: "primary-color-dark", hexcode: OpenProject::CustomStyles::ColorThemes::DEPRECATED_PRIMARY_DARK_COLOR)
-
- MigrationDesignColor
- .where(variable: "primary-button-color")
- .update(variable: "alternative-color")
-
- MigrationDesignColor
- .where(variable: "accent-color")
- .update(variable: "content-link-color")
- end
-end
diff --git a/db/migrate/20240307190126_rename_portuguese_locale.rb b/db/migrate/20240307190126_rename_portuguese_locale.rb
index 32fed764f80b..4dd89c474ec4 100644
--- a/db/migrate/20240307190126_rename_portuguese_locale.rb
+++ b/db/migrate/20240307190126_rename_portuguese_locale.rb
@@ -2,13 +2,13 @@ class RenamePortugueseLocale < ActiveRecord::Migration[7.1]
def up
execute "UPDATE users SET language = 'pt-BR' WHERE language = 'pt'"
execute "UPDATE settings SET value = 'pt-BR' WHERE name = 'default_language' AND value = 'pt'"
- modify_available_languages!("pt", "pt-BR")
+ modify_available_languages!('pt', 'pt-BR')
end
def down
execute "UPDATE users SET language = 'pt' WHERE language = 'pt-BR'"
execute "UPDATE settings SET value = 'pt' WHERE name = 'default_language' AND value = 'pt-BR'"
- modify_available_languages!("pt-BR", "pt")
+ modify_available_languages!('pt-BR', 'pt')
end
private
diff --git a/db/migrate/20240311111957_enable_unaccent_extension.rb b/db/migrate/20240311111957_enable_unaccent_extension.rb
deleted file mode 100644
index cec572b5918b..000000000000
--- a/db/migrate/20240311111957_enable_unaccent_extension.rb
+++ /dev/null
@@ -1,47 +0,0 @@
- #-- copyright
- # OpenProject is an open source project management software.
- # Copyright (C) 2012-2024 the OpenProject GmbH
- #
- # This program is free software; you can redistribute it and/or
- # modify it under the terms of the GNU General Public License version 3.
- #
- # OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
- # Copyright (C) 2006-2013 Jean-Philippe Lang
- # Copyright (C) 2010-2013 the ChiliProject Team
- #
- # This program is free software; you can redistribute it and/or
- # modify it under the terms of the GNU General Public License
- # as published by the Free Software Foundation; either version 2
- # of the License, or (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program; if not, write to the Free Software
- # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- #
- # See COPYRIGHT and LICENSE files for more details.
- #++
-
- class EnableUnaccentExtension < ActiveRecord::Migration[7.1]
- def up
- ActiveRecord::Base.connection.execute("CREATE EXTENSION IF NOT EXISTS unaccent WITH SCHEMA pg_catalog;")
- rescue StandardError => e
- raise unless e.message.include?("unaccent")
-
- raise <<~MESSAGE
- \e[33mWARNING:\e[0m Could not find or enable the `unaccent` extension for PostgreSQL.
- This is needed for filtering users with accents, please install the postgresql-contrib module
- for your PostgreSQL installation and re-run this migration.
-
- Read more about the contrib module at `https://www.postgresql.org/docs/current/contrib.html`.
- MESSAGE
- end
-
- def down
- ActiveRecord::Base.connection.execute("DROP EXTENSION IF EXISTS unaccent CASCADE;")
- end
- end
diff --git a/db/migrate/aggregated/base.rb b/db/migrate/aggregated/base.rb
index 372f3f333da6..aad20d12c193 100644
--- a/db/migrate/aggregated/base.rb
+++ b/db/migrate/aggregated/base.rb
@@ -35,7 +35,7 @@ def self.migrations
def self.normalized_migrations
migrations.split.map do |m|
- m.gsub(/_.*\z/, "").to_i
+ m.gsub(/_.*\z/, '').to_i
end
end
end
diff --git a/db/migrate/aggregated/to_3_0.rb b/db/migrate/aggregated/to_3_0.rb
index 860a5b544682..efbb459c3ced 100644
--- a/db/migrate/aggregated/to_3_0.rb
+++ b/db/migrate/aggregated/to_3_0.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
# rubocop:disable Naming/ClassAndModuleCamelCase
class Aggregated::To_3_0 < Aggregated::Base
diff --git a/db/migrate/aggregated/to_7_1.rb b/db/migrate/aggregated/to_7_1.rb
index 9af58c14063a..fc0607a9a8f1 100644
--- a/db/migrate/aggregated/to_7_1.rb
+++ b/db/migrate/aggregated/to_7_1.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
# rubocop:disable Naming/ClassAndModuleCamelCase
class Aggregated::To_7_1 < Aggregated::Base
diff --git a/db/migrate/migration_utils/migration_squasher.rb b/db/migrate/migration_utils/migration_squasher.rb
index 23d0dd5eae83..29e9d7751ccb 100644
--- a/db/migrate/migration_utils/migration_squasher.rb
+++ b/db/migrate/migration_utils/migration_squasher.rb
@@ -49,7 +49,7 @@ def squash(aggregated_versions)
# All migrations that this migration aggregates have already
# been applied. In this case, remove the information about those
# migrations from the schema_migrations table and we're done.
- ActiveRecord::Base.connection.execute <<-SQL + (intersection.map { |version| <<-CONDITIONS }).join(" OR ")
+ ActiveRecord::Base.connection.execute <<-SQL + (intersection.map { |version| <<-CONDITIONS }).join(' OR ')
DELETE FROM
#{quoted_schema_migrations_table_name}
WHERE
@@ -63,7 +63,7 @@ def squash(aggregated_versions)
# Only a part of the migrations that this migration aggregates
# have already been applied. In this case, fail miserably.
- raise IncompleteMigrationsError, <<-MESSAGE.split("\n").map(&:strip!).join(" ") + "\n"
+ raise IncompleteMigrationsError, <<-MESSAGE.split("\n").map(&:strip!).join(' ') + "\n"
It appears you are migrating from an incompatible version.
Your database has only some migrations to be squashed.
Please update your installation to a version including all the
@@ -78,7 +78,7 @@ def squash(aggregated_versions)
def all_versions
table = Arel::Table.new(schema_migrations_table_name)
- ActiveRecord::Base.connection.select_values(table.project(table["version"]))
+ ActiveRecord::Base.connection.select_values(table.project(table['version']))
end
def schema_migrations_table_name
@@ -90,7 +90,7 @@ def quoted_schema_migrations_table_name
end
def quoted_version_column_name
- ActiveRecord::Base.connection.quote_table_name("version")
+ ActiveRecord::Base.connection.quote_table_name('version')
end
def version_column_for_comparison
diff --git a/db/migrate/migration_utils/module_renamer.rb b/db/migrate/migration_utils/module_renamer.rb
index 81ce589fbb4f..1fa3874579cf 100644
--- a/db/migrate/migration_utils/module_renamer.rb
+++ b/db/migrate/migration_utils/module_renamer.rb
@@ -58,7 +58,7 @@ def remove_from_enabled(modules)
def add_to_default(new_modules, old_modules)
# avoid creating the settings implicitly on new installations
- setting = Setting.find_by(name: "default_projects_modules")
+ setting = Setting.find_by(name: 'default_projects_modules')
return unless setting
@@ -80,7 +80,7 @@ def execute(string)
end
def comma_separated_strings(array)
- Array(array).map { |i| "'#{i}'" }.join(", ")
+ Array(array).map { |i| "'#{i}'" }.join(', ')
end
end
end
diff --git a/db/migrate/migration_utils/setting_renamer.rb b/db/migrate/migration_utils/setting_renamer.rb
index 0b34f82a2c89..88c93f6af2ab 100644
--- a/db/migrate/migration_utils/setting_renamer.rb
+++ b/db/migrate/migration_utils/setting_renamer.rb
@@ -41,7 +41,7 @@ def rename(source_name, target_name)
private
def settings_table
- @settings_table ||= ActiveRecord::Base.connection.quote_table_name("settings")
+ @settings_table ||= ActiveRecord::Base.connection.quote_table_name('settings')
end
def quote_value(s)
diff --git a/db/migrate/migration_utils/typed_dag.rb b/db/migrate/migration_utils/typed_dag.rb
index df06bfbeb3ff..74b5b4ae89a0 100644
--- a/db/migrate/migration_utils/typed_dag.rb
+++ b/db/migrate/migration_utils/typed_dag.rb
@@ -26,26 +26,26 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require "typed_dag"
+require 'typed_dag'
module Migration
module MigrationUtils
module TypedDag
# rubocop:disable Rails/ApplicationRecord
class WorkPackage < ActiveRecord::Base
- self.table_name = "work_packages"
+ self.table_name = 'work_packages'
end
class Relation < ActiveRecord::Base
- self.table_name = "relations"
+ self.table_name = 'relations'
end
# rubocop:enable Rails/ApplicationRecord
def self.configure
- ::TypedDag::Configuration.set node_class_name: "Migration::MigrationUtils::TypedDag::WorkPackage",
- edge_class_name: "Migration::MigrationUtils::TypedDag::Relation",
- ancestor_column: "from_id",
- descendant_column: "to_id",
+ ::TypedDag::Configuration.set node_class_name: 'Migration::MigrationUtils::TypedDag::WorkPackage',
+ edge_class_name: 'Migration::MigrationUtils::TypedDag::Relation',
+ ancestor_column: 'from_id',
+ descendant_column: 'to_id',
types: {
hierarchy: { from: { name: :parent, limit: 1 },
to: :children,
diff --git a/db/migrate/tables/announcements.rb b/db/migrate/tables/announcements.rb
index 9fbd0c0d4a16..600f277e2b02 100644
--- a/db/migrate/tables/announcements.rb
+++ b/db/migrate/tables/announcements.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Announcements < Tables::Base
def self.table(migration)
diff --git a/db/migrate/tables/attachable_journals.rb b/db/migrate/tables/attachable_journals.rb
index 149e82549391..b74fbdbdc6ef 100644
--- a/db/migrate/tables/attachable_journals.rb
+++ b/db/migrate/tables/attachable_journals.rb
@@ -26,14 +26,14 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::AttachableJournals < Tables::Base
def self.table(migration)
create_table migration do |t|
t.integer :journal_id, null: false
t.integer :attachment_id, null: false
- t.string :filename, default: "", null: false
+ t.string :filename, default: '', null: false
t.index :journal_id
t.index :attachment_id
diff --git a/db/migrate/tables/attachment_journals.rb b/db/migrate/tables/attachment_journals.rb
index cabc163bcd32..cd8fd11b0470 100644
--- a/db/migrate/tables/attachment_journals.rb
+++ b/db/migrate/tables/attachment_journals.rb
@@ -26,19 +26,19 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::AttachmentJournals < Tables::Base
def self.table(migration)
create_table migration do |t|
t.integer :journal_id, null: false
t.integer :container_id, default: 0, null: false
- t.string :container_type, limit: 30, default: "", null: false
- t.string :filename, default: "", null: false
- t.string :disk_filename, default: "", null: false
+ t.string :container_type, limit: 30, default: '', null: false
+ t.string :filename, default: '', null: false
+ t.string :disk_filename, default: '', null: false
t.integer :filesize, default: 0, null: false
- t.string :content_type, default: ""
- t.string :digest, limit: 40, default: "", null: false
+ t.string :content_type, default: ''
+ t.string :digest, limit: 40, default: '', null: false
t.integer :downloads, default: 0, null: false
t.integer :author_id, default: 0, null: false
t.text :description
diff --git a/db/migrate/tables/attachments.rb b/db/migrate/tables/attachments.rb
index e15e068de949..db06f34153b1 100644
--- a/db/migrate/tables/attachments.rb
+++ b/db/migrate/tables/attachments.rb
@@ -26,27 +26,27 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Attachments < Tables::Base
def self.table(migration)
create_table migration do |t|
t.integer :container_id, default: 0, null: false
- t.string :container_type, limit: 30, default: "", null: false
- t.string :filename, default: "", null: false
- t.string :disk_filename, default: "", null: false
+ t.string :container_type, limit: 30, default: '', null: false
+ t.string :filename, default: '', null: false
+ t.string :disk_filename, default: '', null: false
t.integer :filesize, default: 0, null: false
- t.string :content_type, default: ""
- t.string :digest, limit: 40, default: "", null: false
+ t.string :content_type, default: ''
+ t.string :digest, limit: 40, default: '', null: false
t.integer :downloads, default: 0, null: false
t.integer :author_id, default: 0, null: false
t.datetime :created_on
t.string :description
t.string :file
- t.index :author_id, name: "index_attachments_on_author_id"
- t.index %i[container_id container_type], name: "index_attachments_on_container_id_and_container_type"
- t.index :created_on, name: "index_attachments_on_created_on"
+ t.index :author_id, name: 'index_attachments_on_author_id'
+ t.index %i[container_id container_type], name: 'index_attachments_on_container_id_and_container_type'
+ t.index :created_on, name: 'index_attachments_on_created_on'
end
end
end
diff --git a/db/migrate/tables/auth_sources.rb b/db/migrate/tables/auth_sources.rb
index bc7bbc6b5251..a5e572e4b7d5 100644
--- a/db/migrate/tables/auth_sources.rb
+++ b/db/migrate/tables/auth_sources.rb
@@ -26,17 +26,17 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::AuthSources < Tables::Base
def self.table(migration)
create_table migration do |t|
- t.string :type, limit: 30, default: "", null: false
- t.string :name, limit: 60, default: "", null: false
+ t.string :type, limit: 30, default: '', null: false
+ t.string :name, limit: 60, default: '', null: false
t.string :host, limit: 60
t.integer :port
t.string :account
- t.string :account_password, default: ""
+ t.string :account_password, default: ''
t.string :base_dn
t.string :attr_login, limit: 30
t.string :attr_firstname, limit: 30
@@ -46,7 +46,7 @@ def self.table(migration)
t.boolean :tls, default: false, null: false
t.string :attr_admin
- t.index %i[id type], name: "index_auth_sources_on_id_and_type"
+ t.index %i[id type], name: 'index_auth_sources_on_id_and_type'
end
end
end
diff --git a/db/migrate/tables/available_project_statuses.rb b/db/migrate/tables/available_project_statuses.rb
index 1852fc4558a8..250f6a2c07bc 100644
--- a/db/migrate/tables/available_project_statuses.rb
+++ b/db/migrate/tables/available_project_statuses.rb
@@ -26,13 +26,13 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::AvailableProjectStatuses < Tables::Base
def self.table(migration)
create_table migration do |t|
t.belongs_to :project_type, type: :int
- t.belongs_to :reported_project_status, type: :int, index: { name: "index_avail_project_statuses_on_rep_project_status_id" }
+ t.belongs_to :reported_project_status, type: :int, index: { name: 'index_avail_project_statuses_on_rep_project_status_id' }
t.timestamps null: true # compatibility to pre 5.1 migrations
end
diff --git a/db/migrate/tables/boards.rb b/db/migrate/tables/boards.rb
index 489bd29365b2..70a3e51dadb9 100644
--- a/db/migrate/tables/boards.rb
+++ b/db/migrate/tables/boards.rb
@@ -26,13 +26,13 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Boards < Tables::Base
def self.table(migration)
create_table migration do |t|
t.integer :project_id, null: false
- t.string :name, default: "", null: false
+ t.string :name, default: '', null: false
t.string :description
t.integer :position, default: 1
t.integer :topics_count, default: 0, null: false
diff --git a/db/migrate/tables/categories.rb b/db/migrate/tables/categories.rb
index e45d4801cb63..b941b68f4d35 100644
--- a/db/migrate/tables/categories.rb
+++ b/db/migrate/tables/categories.rb
@@ -26,17 +26,17 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Categories < Tables::Base
def self.table(migration)
create_table migration do |t|
t.integer :project_id, default: 0, null: false
- t.string :name, limit: 256, null: false, default: ""
+ t.string :name, limit: 256, null: false, default: ''
t.integer :assigned_to_id
- t.index :assigned_to_id, name: "index_categories_on_assigned_to_id"
- t.index :project_id, name: "issue_categories_project_id"
+ t.index :assigned_to_id, name: 'index_categories_on_assigned_to_id'
+ t.index :project_id, name: 'issue_categories_project_id'
end
end
end
diff --git a/db/migrate/tables/changes.rb b/db/migrate/tables/changes.rb
index eb643c6a6392..ff2ad8103017 100644
--- a/db/migrate/tables/changes.rb
+++ b/db/migrate/tables/changes.rb
@@ -26,20 +26,20 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Changes < Tables::Base
def self.table(migration)
create_table migration do |t|
t.integer :changeset_id, null: false
- t.string :action, limit: 1, default: "", null: false
+ t.string :action, limit: 1, default: '', null: false
t.text :path, null: false
t.text :from_path
t.string :from_revision
t.string :revision
t.string :branch
- t.index :changeset_id, name: "changesets_changeset_id"
+ t.index :changeset_id, name: 'changesets_changeset_id'
end
end
end
diff --git a/db/migrate/tables/changeset_journals.rb b/db/migrate/tables/changeset_journals.rb
index a9aa43acb0d1..92f17eb5654b 100644
--- a/db/migrate/tables/changeset_journals.rb
+++ b/db/migrate/tables/changeset_journals.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::ChangesetJournals < Tables::Base
def self.table(migration)
diff --git a/db/migrate/tables/changesets.rb b/db/migrate/tables/changesets.rb
index 2d77b7dd0d37..105182316541 100644
--- a/db/migrate/tables/changesets.rb
+++ b/db/migrate/tables/changesets.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Changesets < Tables::Base
def self.table(migration)
@@ -40,11 +40,11 @@ def self.table(migration)
t.string :scmid
t.integer :user_id
- t.index :committed_on, name: "index_changesets_on_committed_on"
- t.index %i[repository_id revision], name: "changesets_repos_rev", unique: true
- t.index %i[repository_id scmid], name: "changesets_repos_scmid"
- t.index :repository_id, name: "index_changesets_on_repository_id"
- t.index :user_id, name: "index_changesets_on_user_id"
+ t.index :committed_on, name: 'index_changesets_on_committed_on'
+ t.index %i[repository_id revision], name: 'changesets_repos_rev', unique: true
+ t.index %i[repository_id scmid], name: 'changesets_repos_scmid'
+ t.index :repository_id, name: 'index_changesets_on_repository_id'
+ t.index :user_id, name: 'index_changesets_on_user_id'
t.index %i[repository_id committed_on]
end
end
diff --git a/db/migrate/tables/changesets_work_packages.rb b/db/migrate/tables/changesets_work_packages.rb
index 17e348272194..eddc9c10865a 100644
--- a/db/migrate/tables/changesets_work_packages.rb
+++ b/db/migrate/tables/changesets_work_packages.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::ChangesetsWorkPackages < Tables::Base
def self.id_options
diff --git a/db/migrate/tables/comments.rb b/db/migrate/tables/comments.rb
index 59c19f4c5638..2af97f861f88 100644
--- a/db/migrate/tables/comments.rb
+++ b/db/migrate/tables/comments.rb
@@ -26,20 +26,20 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Comments < Tables::Base
def self.table(migration)
create_table migration do |t|
- t.string :commented_type, limit: 30, default: "", null: false
+ t.string :commented_type, limit: 30, default: '', null: false
t.integer :commented_id, default: 0, null: false
t.integer :author_id, default: 0, null: false
t.text :comments
t.datetime :created_on, null: false
t.datetime :updated_on, null: false
- t.index :author_id, name: "index_comments_on_author_id"
- t.index %i[commented_id commented_type], name: "index_comments_on_commented_id_and_commented_type"
+ t.index :author_id, name: 'index_comments_on_author_id'
+ t.index %i[commented_id commented_type], name: 'index_comments_on_commented_id_and_commented_type'
end
end
end
diff --git a/db/migrate/tables/custom_fields.rb b/db/migrate/tables/custom_fields.rb
index 89181272876c..152acee355bd 100644
--- a/db/migrate/tables/custom_fields.rb
+++ b/db/migrate/tables/custom_fields.rb
@@ -26,15 +26,15 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::CustomFields < Tables::Base
# rubocop:disable Metrics/AbcSize
def self.table(migration)
create_table migration do |t|
- t.string :type, limit: 30, default: "", null: false
- t.string :field_format, limit: 30, default: "", null: false
- t.string :regexp, default: ""
+ t.string :type, limit: 30, default: '', null: false
+ t.string :field_format, limit: 30, default: '', null: false
+ t.string :regexp, default: ''
t.integer :min_length, default: 0, null: false
t.integer :max_length, default: 0, null: false
t.boolean :is_required, default: false, null: false
@@ -50,7 +50,7 @@ def self.table(migration)
t.datetime :created_at
t.datetime :updated_at
- t.index %i[id type], name: "index_custom_fields_on_id_and_type"
+ t.index %i[id type], name: 'index_custom_fields_on_id_and_type'
end
end
# rubocop:enable Metrics/AbcSize
diff --git a/db/migrate/tables/custom_fields_projects.rb b/db/migrate/tables/custom_fields_projects.rb
index 6272c782db30..6259d895b5b4 100644
--- a/db/migrate/tables/custom_fields_projects.rb
+++ b/db/migrate/tables/custom_fields_projects.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::CustomFieldsProjects < Tables::Base
def self.id_options
@@ -39,7 +39,7 @@ def self.table(migration)
t.integer :project_id, default: 0, null: false
t.index %i[custom_field_id project_id],
- name: "index_custom_fields_projects_on_custom_field_id_and_project_id"
+ name: 'index_custom_fields_projects_on_custom_field_id_and_project_id'
end
end
end
diff --git a/db/migrate/tables/custom_fields_types.rb b/db/migrate/tables/custom_fields_types.rb
index 76ac44f248c5..ccc225ec44fd 100644
--- a/db/migrate/tables/custom_fields_types.rb
+++ b/db/migrate/tables/custom_fields_types.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::CustomFieldsTypes < Tables::Base
def self.id_options
diff --git a/db/migrate/tables/custom_options.rb b/db/migrate/tables/custom_options.rb
index 50f3be270f56..502b05c6d700 100644
--- a/db/migrate/tables/custom_options.rb
+++ b/db/migrate/tables/custom_options.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::CustomOptions < Tables::Base
def self.table(migration)
diff --git a/db/migrate/tables/custom_styles.rb b/db/migrate/tables/custom_styles.rb
index c0991d813f21..a6e176a8a0d6 100644
--- a/db/migrate/tables/custom_styles.rb
+++ b/db/migrate/tables/custom_styles.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::CustomStyles < Tables::Base
def self.table(migration)
diff --git a/db/migrate/tables/custom_values.rb b/db/migrate/tables/custom_values.rb
index 5aceedc1ffe7..e9c08d0311d0 100644
--- a/db/migrate/tables/custom_values.rb
+++ b/db/migrate/tables/custom_values.rb
@@ -26,18 +26,18 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::CustomValues < Tables::Base
def self.table(migration)
create_table migration do |t|
- t.string :customized_type, limit: 30, default: "", null: false
+ t.string :customized_type, limit: 30, default: '', null: false
t.integer :customized_id, default: 0, null: false
t.integer :custom_field_id, default: 0, null: false
t.text :value
- t.index :custom_field_id, name: "index_custom_values_on_custom_field_id"
- t.index %i[customized_type customized_id], name: "custom_values_customized"
+ t.index :custom_field_id, name: 'index_custom_values_on_custom_field_id'
+ t.index %i[customized_type customized_id], name: 'custom_values_customized'
end
end
end
diff --git a/db/migrate/tables/customizable_journals_table.rb b/db/migrate/tables/customizable_journals_table.rb
index ad58c5531d17..4d9cee2d72aa 100644
--- a/db/migrate/tables/customizable_journals_table.rb
+++ b/db/migrate/tables/customizable_journals_table.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::CustomizableJournals < Tables::Base
def self.table(migration)
diff --git a/db/migrate/tables/delayed_jobs.rb b/db/migrate/tables/delayed_jobs.rb
index 9448acf567f9..08520082054f 100644
--- a/db/migrate/tables/delayed_jobs.rb
+++ b/db/migrate/tables/delayed_jobs.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::DelayedJobs < Tables::Base
def self.table(migration)
@@ -42,7 +42,7 @@ def self.table(migration)
t.timestamps null: true
t.string :queue
- t.index %i[priority run_at], name: "delayed_jobs_priority"
+ t.index %i[priority run_at], name: 'delayed_jobs_priority'
end
end
end
diff --git a/db/migrate/tables/design_colors.rb b/db/migrate/tables/design_colors.rb
index ac0a1384d6d0..8e0f747c4832 100644
--- a/db/migrate/tables/design_colors.rb
+++ b/db/migrate/tables/design_colors.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::DesignColors < Tables::Base
def self.table(migration)
diff --git a/db/migrate/tables/enabled_modules.rb b/db/migrate/tables/enabled_modules.rb
index 45e73111375f..e6b2585dc4f0 100644
--- a/db/migrate/tables/enabled_modules.rb
+++ b/db/migrate/tables/enabled_modules.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::EnabledModules < Tables::Base
def self.table(migration)
@@ -34,7 +34,7 @@ def self.table(migration)
t.integer :project_id
t.string :name, null: false
- t.index :project_id, name: "enabled_modules_project_id"
+ t.index :project_id, name: 'enabled_modules_project_id'
t.index :name, length: 8
end
end
diff --git a/db/migrate/tables/enterprise_tokens.rb b/db/migrate/tables/enterprise_tokens.rb
index 5302a47b679e..e7dc71db2384 100644
--- a/db/migrate/tables/enterprise_tokens.rb
+++ b/db/migrate/tables/enterprise_tokens.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::EnterpriseTokens < Tables::Base
def self.table(migration)
diff --git a/db/migrate/tables/enumerations.rb b/db/migrate/tables/enumerations.rb
index 99cf7bc02ed9..7f03c65358b9 100644
--- a/db/migrate/tables/enumerations.rb
+++ b/db/migrate/tables/enumerations.rb
@@ -26,12 +26,12 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Enumerations < Tables::Base
def self.table(migration)
create_table migration do |t|
- t.string :name, limit: 30, default: "", null: false
+ t.string :name, limit: 30, default: '', null: false
t.integer :position, default: 1
t.boolean :is_default, default: false, null: false
t.string :type
@@ -39,8 +39,8 @@ def self.table(migration)
t.integer :project_id
t.integer :parent_id
- t.index %i[id type], name: "index_enumerations_on_id_and_type"
- t.index :project_id, name: "index_enumerations_on_project_id"
+ t.index %i[id type], name: 'index_enumerations_on_id_and_type'
+ t.index :project_id, name: 'index_enumerations_on_project_id'
end
end
end
diff --git a/db/migrate/tables/forums.rb b/db/migrate/tables/forums.rb
index 18260a7002f6..8b1da2a8d7ce 100644
--- a/db/migrate/tables/forums.rb
+++ b/db/migrate/tables/forums.rb
@@ -26,8 +26,8 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
-require_relative "boards"
+require_relative 'base'
+require_relative 'boards'
class Tables::Forums < Tables::Boards
end
diff --git a/db/migrate/tables/group_users.rb b/db/migrate/tables/group_users.rb
index f0339ab48ed5..12b8d56ca203 100644
--- a/db/migrate/tables/group_users.rb
+++ b/db/migrate/tables/group_users.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::GroupUsers < Tables::Base
def self.id_options
diff --git a/db/migrate/tables/journals.rb b/db/migrate/tables/journals.rb
index c189d64e3139..0cdfefb7107e 100644
--- a/db/migrate/tables/journals.rb
+++ b/db/migrate/tables/journals.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Journals < Tables::Base
def self.table(migration)
diff --git a/db/migrate/tables/member_roles.rb b/db/migrate/tables/member_roles.rb
index 69bb318b6512..1242f3e3a5c9 100644
--- a/db/migrate/tables/member_roles.rb
+++ b/db/migrate/tables/member_roles.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::MemberRoles < Tables::Base
def self.table(migration)
@@ -35,8 +35,8 @@ def self.table(migration)
t.integer :role_id, null: false
t.integer :inherited_from
- t.index :member_id, name: "index_member_roles_on_member_id"
- t.index :role_id, name: "index_member_roles_on_role_id"
+ t.index :member_id, name: 'index_member_roles_on_member_id'
+ t.index :role_id, name: 'index_member_roles_on_role_id'
t.index :inherited_from
end
end
diff --git a/db/migrate/tables/members.rb b/db/migrate/tables/members.rb
index a265ff15bc35..e8e41b8e1084 100644
--- a/db/migrate/tables/members.rb
+++ b/db/migrate/tables/members.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Members < Tables::Base
def self.table(migration)
@@ -36,9 +36,9 @@ def self.table(migration)
t.datetime :created_on
t.boolean :mail_notification, default: false, null: false
- t.index :project_id, name: "index_members_on_project_id"
- t.index %i[user_id project_id], name: "index_members_on_user_id_and_project_id", unique: true
- t.index :user_id, name: "index_members_on_user_id"
+ t.index :project_id, name: 'index_members_on_project_id'
+ t.index %i[user_id project_id], name: 'index_members_on_user_id_and_project_id', unique: true
+ t.index :user_id, name: 'index_members_on_user_id'
end
end
end
diff --git a/db/migrate/tables/menu_items.rb b/db/migrate/tables/menu_items.rb
index 565756559471..65b385749504 100644
--- a/db/migrate/tables/menu_items.rb
+++ b/db/migrate/tables/menu_items.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::MenuItems < Tables::Base
def self.table(migration)
diff --git a/db/migrate/tables/message_journals.rb b/db/migrate/tables/message_journals.rb
index 3359b4e3250d..7f5aaffaa522 100644
--- a/db/migrate/tables/message_journals.rb
+++ b/db/migrate/tables/message_journals.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::MessageJournals < Tables::Base
def self.table(migration)
@@ -34,7 +34,7 @@ def self.table(migration)
t.integer :journal_id, null: false
t.integer :board_id, null: false
t.integer :parent_id
- t.string :subject, default: "", null: false
+ t.string :subject, default: '', null: false
t.text :content
t.integer :author_id
t.integer :replies_count, default: 0, null: false
diff --git a/db/migrate/tables/messages.rb b/db/migrate/tables/messages.rb
index 8bccf557a09a..1ccd345af5d4 100644
--- a/db/migrate/tables/messages.rb
+++ b/db/migrate/tables/messages.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Messages < Tables::Base
# rubocop:disable Metrics/AbcSize
@@ -34,7 +34,7 @@ def self.table(migration)
create_table migration do |t|
t.integer :board_id, null: false
t.integer :parent_id
- t.string :subject, default: "", null: false
+ t.string :subject, default: '', null: false
t.text :content
t.integer :author_id
t.integer :replies_count, default: 0, null: false
@@ -45,11 +45,11 @@ def self.table(migration)
t.integer :sticky, default: 0
t.datetime :sticked_on, default: nil, null: true
- t.index :author_id, name: "index_messages_on_author_id"
- t.index :board_id, name: "messages_board_id"
- t.index :created_on, name: "index_messages_on_created_on"
- t.index :last_reply_id, name: "index_messages_on_last_reply_id"
- t.index :parent_id, name: "messages_parent_id"
+ t.index :author_id, name: 'index_messages_on_author_id'
+ t.index :board_id, name: 'messages_board_id'
+ t.index :created_on, name: 'index_messages_on_created_on'
+ t.index :last_reply_id, name: 'index_messages_on_last_reply_id'
+ t.index :parent_id, name: 'messages_parent_id'
t.index %i[board_id updated_on]
end
end
diff --git a/db/migrate/tables/news.rb b/db/migrate/tables/news.rb
index e68cfb880a80..f37d95cd05fa 100644
--- a/db/migrate/tables/news.rb
+++ b/db/migrate/tables/news.rb
@@ -26,22 +26,22 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::News < Tables::Base
def self.table(migration)
create_table migration do |t|
t.integer :project_id
- t.string :title, limit: 60, default: "", null: false
- t.string :summary, default: ""
+ t.string :title, limit: 60, default: '', null: false
+ t.string :summary, default: ''
t.text :description
t.integer :author_id, default: 0, null: false
t.datetime :created_on
t.integer :comments_count, default: 0, null: false
- t.index :author_id, name: "index_news_on_author_id"
- t.index :created_on, name: "index_news_on_created_on"
- t.index :project_id, name: "news_project_id"
+ t.index :author_id, name: 'index_news_on_author_id'
+ t.index :created_on, name: 'index_news_on_created_on'
+ t.index :project_id, name: 'news_project_id'
t.index %i[project_id created_on]
end
end
diff --git a/db/migrate/tables/news_journals.rb b/db/migrate/tables/news_journals.rb
index 3be5d12b28c3..c9c04326ff0e 100644
--- a/db/migrate/tables/news_journals.rb
+++ b/db/migrate/tables/news_journals.rb
@@ -26,15 +26,15 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::NewsJournals < Tables::Base
def self.table(migration)
create_table migration do |t|
t.integer :journal_id, null: false
t.integer :project_id
- t.string :title, limit: 60, default: "", null: false
- t.string :summary, default: ""
+ t.string :title, limit: 60, default: '', null: false
+ t.string :summary, default: ''
t.text :description
t.integer :author_id, default: 0, null: false
t.integer :comments_count, default: 0, null: false
diff --git a/db/migrate/tables/planning_element_type_colors.rb b/db/migrate/tables/planning_element_type_colors.rb
index 306c487ceba7..4fa4e6aedd48 100644
--- a/db/migrate/tables/planning_element_type_colors.rb
+++ b/db/migrate/tables/planning_element_type_colors.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::PlanningElementTypeColors < Tables::Base
def self.table(migration)
diff --git a/db/migrate/tables/project_associations.rb b/db/migrate/tables/project_associations.rb
index 6f14db81a91d..b619e97b7bcc 100644
--- a/db/migrate/tables/project_associations.rb
+++ b/db/migrate/tables/project_associations.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::ProjectAssociations < Tables::Base
def self.table(migration)
diff --git a/db/migrate/tables/project_types.rb b/db/migrate/tables/project_types.rb
index 19748a6ef8c8..433b6ca182cc 100644
--- a/db/migrate/tables/project_types.rb
+++ b/db/migrate/tables/project_types.rb
@@ -26,12 +26,12 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::ProjectTypes < Tables::Base
def self.table(migration)
create_table migration do |t|
- t.column :name, :string, default: "", null: false
+ t.column :name, :string, default: '', null: false
t.column :allows_association, :boolean, default: true, null: false
t.column :position, :integer, default: 1, null: true
diff --git a/db/migrate/tables/projects.rb b/db/migrate/tables/projects.rb
index f224d2415180..c7e3806aabca 100644
--- a/db/migrate/tables/projects.rb
+++ b/db/migrate/tables/projects.rb
@@ -26,13 +26,13 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Projects < Tables::Base
# rubocop:disable Metrics/AbcSize
def self.table(migration)
create_table migration do |t|
- t.string :name, default: "", null: false
+ t.string :name, default: '', null: false
t.text :description
t.boolean :is_public, default: true, null: false
t.integer :parent_id
@@ -46,8 +46,8 @@ def self.table(migration)
t.belongs_to :responsible, type: :int
t.belongs_to :work_packages_responsible, type: :int
- t.index :lft, name: "index_projects_on_lft"
- t.index :rgt, name: "index_projects_on_rgt"
+ t.index :lft, name: 'index_projects_on_lft'
+ t.index :rgt, name: 'index_projects_on_rgt'
t.index :identifier
end
end
diff --git a/db/migrate/tables/projects_types.rb b/db/migrate/tables/projects_types.rb
index fbd42ecfed43..6b4e72f80c15 100644
--- a/db/migrate/tables/projects_types.rb
+++ b/db/migrate/tables/projects_types.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::ProjectsTypes < Tables::Base
def self.id_options
diff --git a/db/migrate/tables/queries.rb b/db/migrate/tables/queries.rb
index a9859081d05d..e58079d27692 100644
--- a/db/migrate/tables/queries.rb
+++ b/db/migrate/tables/queries.rb
@@ -26,13 +26,13 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Queries < Tables::Base
def self.table(migration)
create_table migration do |t|
t.integer :project_id
- t.string :name, default: "", null: false
+ t.string :name, default: '', null: false
t.text :filters
t.integer :user_id, default: 0, null: false
t.boolean :is_public, default: false, null: false
@@ -44,8 +44,8 @@ def self.table(migration)
t.boolean :show_hierarchies, default: false
t.integer :timeline_zoom_level, default: 0
- t.index :project_id, name: "index_queries_on_project_id"
- t.index :user_id, name: "index_queries_on_user_id"
+ t.index :project_id, name: 'index_queries_on_project_id'
+ t.index :user_id, name: 'index_queries_on_user_id'
end
end
end
diff --git a/db/migrate/tables/relations.rb b/db/migrate/tables/relations.rb
index 8d5dfe56a3cb..042d2f848a34 100644
--- a/db/migrate/tables/relations.rb
+++ b/db/migrate/tables/relations.rb
@@ -26,19 +26,19 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Relations < Tables::Base
def self.table(migration)
create_table migration do |t|
t.integer :from_id, null: false
t.integer :to_id, null: false
- t.string :relation_type, default: "", null: false
+ t.string :relation_type, default: '', null: false
t.integer :delay
t.text :description
- t.index :from_id, name: "index_relations_on_from_id"
- t.index :to_id, name: "index_relations_on_to_id"
+ t.index :from_id, name: 'index_relations_on_from_id'
+ t.index :to_id, name: 'index_relations_on_to_id'
end
end
end
diff --git a/db/migrate/tables/reportings.rb b/db/migrate/tables/reportings.rb
index 3edbe20a5d99..7545654bd7a9 100644
--- a/db/migrate/tables/reportings.rb
+++ b/db/migrate/tables/reportings.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Reportings < Tables::Base
def self.table(migration)
diff --git a/db/migrate/tables/repositories.rb b/db/migrate/tables/repositories.rb
index da1be57acd04..d9751892d198 100644
--- a/db/migrate/tables/repositories.rb
+++ b/db/migrate/tables/repositories.rb
@@ -26,16 +26,16 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Repositories < Tables::Base
def self.table(migration)
create_table migration do |t|
t.integer :project_id, default: 0, null: false
- t.string :url, default: "", null: false
- t.string :login, limit: 60, default: ""
- t.string :password, default: ""
- t.string :root_url, default: ""
+ t.string :url, default: '', null: false
+ t.string :login, limit: 60, default: ''
+ t.string :password, default: ''
+ t.string :root_url, default: ''
t.string :type
t.string :path_encoding, limit: 64
t.string :log_encoding, limit: 64
@@ -43,7 +43,7 @@ def self.table(migration)
t.integer :required_storage_bytes, limit: 8, null: false, default: 0
t.datetime :storage_updated_at
- t.index :project_id, name: "index_repositories_on_project_id"
+ t.index :project_id, name: 'index_repositories_on_project_id'
end
end
end
diff --git a/db/migrate/tables/role_permissions.rb b/db/migrate/tables/role_permissions.rb
index 25b3bcce0da7..d8315ec7a0b7 100644
--- a/db/migrate/tables/role_permissions.rb
+++ b/db/migrate/tables/role_permissions.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::RolePermissions < Tables::Base
def self.table(migration)
diff --git a/db/migrate/tables/roles.rb b/db/migrate/tables/roles.rb
index 2f5129c99f56..598103a6104f 100644
--- a/db/migrate/tables/roles.rb
+++ b/db/migrate/tables/roles.rb
@@ -26,12 +26,12 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Roles < Tables::Base
def self.table(migration)
create_table migration do |t|
- t.string :name, limit: 30, default: "", null: false
+ t.string :name, limit: 30, default: '', null: false
t.integer :position, default: 1
t.boolean :assignable, default: true
t.integer :builtin, default: 0, null: false
diff --git a/db/migrate/tables/sessions.rb b/db/migrate/tables/sessions.rb
index 410f1c7314bc..28f3a309ad73 100644
--- a/db/migrate/tables/sessions.rb
+++ b/db/migrate/tables/sessions.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Sessions < Tables::Base
def self.table(migration)
diff --git a/db/migrate/tables/settings.rb b/db/migrate/tables/settings.rb
index 47f7e176f1a8..bc73881c242e 100644
--- a/db/migrate/tables/settings.rb
+++ b/db/migrate/tables/settings.rb
@@ -26,16 +26,16 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Settings < Tables::Base
def self.table(migration)
create_table migration do |t|
- t.string :name, default: "", null: false
+ t.string :name, default: '', null: false
t.text :value
t.datetime :updated_on
- t.index :name, name: "index_settings_on_name"
+ t.index :name, name: 'index_settings_on_name'
end
end
end
diff --git a/db/migrate/tables/statuses.rb b/db/migrate/tables/statuses.rb
index 53a0e2b7d3bc..082ee00f4b19 100644
--- a/db/migrate/tables/statuses.rb
+++ b/db/migrate/tables/statuses.rb
@@ -26,20 +26,20 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Statuses < Tables::Base
def self.table(migration)
create_table migration do |t|
- t.string :name, limit: 30, default: "", null: false
+ t.string :name, limit: 30, default: '', null: false
t.boolean :is_closed, default: false, null: false
t.boolean :is_default, default: false, null: false
t.integer :position, default: 1
t.integer :default_done_ratio
- t.index :is_closed, name: "index_statuses_on_is_closed"
- t.index :is_default, name: "index_statuses_on_is_default"
- t.index :position, name: "index_statuses_on_position"
+ t.index :is_closed, name: 'index_statuses_on_is_closed'
+ t.index :is_default, name: 'index_statuses_on_is_default'
+ t.index :position, name: 'index_statuses_on_position'
end
end
end
diff --git a/db/migrate/tables/time_entries.rb b/db/migrate/tables/time_entries.rb
index deb1b44f222b..9902438c6d3b 100644
--- a/db/migrate/tables/time_entries.rb
+++ b/db/migrate/tables/time_entries.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::TimeEntries < Tables::Base
# rubocop:disable Metrics/AbcSize
@@ -45,11 +45,11 @@ def self.table(migration)
t.datetime :created_on, null: false
t.datetime :updated_on, null: false
- t.index :activity_id, name: "index_time_entries_on_activity_id"
- t.index :created_on, name: "index_time_entries_on_created_on"
- t.index :work_package_id, name: "time_entries_issue_id" # issue_id for backwards compatibility
- t.index :project_id, name: "time_entries_project_id"
- t.index :user_id, name: "index_time_entries_on_user_id"
+ t.index :activity_id, name: 'index_time_entries_on_activity_id'
+ t.index :created_on, name: 'index_time_entries_on_created_on'
+ t.index :work_package_id, name: 'time_entries_issue_id' # issue_id for backwards compatibility
+ t.index :project_id, name: 'time_entries_project_id'
+ t.index :user_id, name: 'index_time_entries_on_user_id'
t.index %i[project_id updated_on]
end
end
diff --git a/db/migrate/tables/time_entry_journals.rb b/db/migrate/tables/time_entry_journals.rb
index 2364896ef7fb..f7df9bc28faa 100644
--- a/db/migrate/tables/time_entry_journals.rb
+++ b/db/migrate/tables/time_entry_journals.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::TimeEntryJournals < Tables::Base
def self.table(migration)
diff --git a/db/migrate/tables/timelines.rb b/db/migrate/tables/timelines.rb
index 5551092c2a75..ba75fa069231 100644
--- a/db/migrate/tables/timelines.rb
+++ b/db/migrate/tables/timelines.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Timelines < Tables::Base
def self.table(migration)
diff --git a/db/migrate/tables/tokens.rb b/db/migrate/tables/tokens.rb
index 3d1cb9c49820..f814f8de75c6 100644
--- a/db/migrate/tables/tokens.rb
+++ b/db/migrate/tables/tokens.rb
@@ -26,17 +26,17 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Tokens < Tables::Base
def self.table(migration)
create_table migration do |t|
t.integer :user_id, default: 0, null: false
- t.string :action, limit: 30, default: "", null: false
- t.string :value, limit: 40, default: "", null: false
+ t.string :action, limit: 30, default: '', null: false
+ t.string :value, limit: 40, default: '', null: false
t.datetime :created_on, null: false
- t.index :user_id, name: "index_tokens_on_user_id"
+ t.index :user_id, name: 'index_tokens_on_user_id'
end
end
end
diff --git a/db/migrate/tables/types.rb b/db/migrate/tables/types.rb
index 08717ff6fd76..23ef705b0d29 100644
--- a/db/migrate/tables/types.rb
+++ b/db/migrate/tables/types.rb
@@ -26,12 +26,12 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Types < Tables::Base
def self.table(migration)
create_table migration do |t|
- t.string :name, default: "", null: false
+ t.string :name, default: '', null: false
t.integer :position, default: 1
t.boolean :is_in_roadmap, default: true, null: false
t.boolean :in_aggregation, default: true, null: false
diff --git a/db/migrate/tables/user_passwords.rb b/db/migrate/tables/user_passwords.rb
index 427f4d56e3ee..e773ab782cc4 100644
--- a/db/migrate/tables/user_passwords.rb
+++ b/db/migrate/tables/user_passwords.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::UserPasswords < Tables::Base
def self.table(migration)
diff --git a/db/migrate/tables/user_preferences.rb b/db/migrate/tables/user_preferences.rb
index bb3a098de45f..8265e5b6a013 100644
--- a/db/migrate/tables/user_preferences.rb
+++ b/db/migrate/tables/user_preferences.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::UserPreferences < Tables::Base
def self.table(migration)
@@ -37,7 +37,7 @@ def self.table(migration)
t.string :time_zone
t.boolean :impaired, default: false
- t.index :user_id, name: "index_user_preferences_on_user_id"
+ t.index :user_id, name: 'index_user_preferences_on_user_id'
end
end
end
diff --git a/db/migrate/tables/users.rb b/db/migrate/tables/users.rb
index b6151ed8c9d7..8cbb6e745b23 100644
--- a/db/migrate/tables/users.rb
+++ b/db/migrate/tables/users.rb
@@ -26,34 +26,34 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Users < Tables::Base
# rubocop:disable Metrics/AbcSize
def self.table(migration)
create_table migration do |t|
- t.string :login, limit: 256, default: "", null: false
- t.string :firstname, limit: 30, default: "", null: false
- t.string :lastname, limit: 30, default: "", null: false
- t.string :mail, limit: 60, default: "", null: false
+ t.string :login, limit: 256, default: '', null: false
+ t.string :firstname, limit: 30, default: '', null: false
+ t.string :lastname, limit: 30, default: '', null: false
+ t.string :mail, limit: 60, default: '', null: false
t.boolean :admin, default: false, null: false
t.integer :status, default: 1, null: false
t.datetime :last_login_on
- t.string :language, limit: 5, default: ""
+ t.string :language, limit: 5, default: ''
t.integer :auth_source_id
t.datetime :created_on
t.datetime :updated_on
t.string :type
t.string :identity_url
- t.string :mail_notification, default: "", null: false
+ t.string :mail_notification, default: '', null: false
t.boolean :first_login, null: false, default: true
t.boolean :force_password_change, default: false
t.integer :failed_login_count, default: 0
t.datetime :last_failed_login_on, null: true
- t.index %i[auth_source_id], name: "index_users_on_auth_source_id"
- t.index %i[id type], name: "index_users_on_id_and_type"
- t.index %i[type], name: "index_users_on_type"
+ t.index %i[auth_source_id], name: 'index_users_on_auth_source_id'
+ t.index %i[id type], name: 'index_users_on_id_and_type'
+ t.index %i[type], name: 'index_users_on_type'
t.index %i[type login], length: { type: 255, login: 255 }
t.index %i[type status]
end
diff --git a/db/migrate/tables/versions.rb b/db/migrate/tables/versions.rb
index 27651683e3d7..30e6f77a4bf5 100644
--- a/db/migrate/tables/versions.rb
+++ b/db/migrate/tables/versions.rb
@@ -26,14 +26,14 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Versions < Tables::Base
def self.table(migration)
create_table migration do |t|
t.integer :project_id, default: 0, null: false
- t.string :name, default: "", null: false
- t.string :description, default: ""
+ t.string :name, default: '', null: false
+ t.string :description, default: ''
t.date :effective_date
t.datetime :created_on
t.datetime :updated_on
@@ -42,8 +42,8 @@ def self.table(migration)
t.string :sharing, default: :none, null: false
t.date :start_date
- t.index :project_id, name: "versions_project_id"
- t.index :sharing, name: "index_versions_on_sharing"
+ t.index :project_id, name: 'versions_project_id'
+ t.index :sharing, name: 'index_versions_on_sharing'
end
end
end
diff --git a/db/migrate/tables/watchers.rb b/db/migrate/tables/watchers.rb
index 0b61a2f546e3..1999a8c800f9 100644
--- a/db/migrate/tables/watchers.rb
+++ b/db/migrate/tables/watchers.rb
@@ -26,18 +26,18 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Watchers < Tables::Base
def self.table(migration)
create_table migration do |t|
- t.string :watchable_type, default: "", null: false
+ t.string :watchable_type, default: '', null: false
t.integer :watchable_id, default: 0, null: false
t.integer :user_id
- t.index %i(user_id watchable_type), name: "watchers_user_id_type"
- t.index :user_id, name: "index_watchers_on_user_id"
- t.index %i(watchable_id watchable_type), name: "index_watchers_on_watchable_id_and_watchable_type"
+ t.index %i(user_id watchable_type), name: 'watchers_user_id_type'
+ t.index :user_id, name: 'index_watchers_on_user_id'
+ t.index %i(watchable_id watchable_type), name: 'index_watchers_on_watchable_id_and_watchable_type'
end
end
end
diff --git a/db/migrate/tables/wiki_content_journals.rb b/db/migrate/tables/wiki_content_journals.rb
index 566b08cb0b7a..a1b62394c517 100644
--- a/db/migrate/tables/wiki_content_journals.rb
+++ b/db/migrate/tables/wiki_content_journals.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::WikiContentJournals < Tables::Base
def self.table(migration)
diff --git a/db/migrate/tables/wiki_content_versions.rb b/db/migrate/tables/wiki_content_versions.rb
index 3e6fa66b488e..3b9ac4561880 100644
--- a/db/migrate/tables/wiki_content_versions.rb
+++ b/db/migrate/tables/wiki_content_versions.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::WikiContentVersions < Tables::Base
def self.table(migration)
@@ -35,13 +35,13 @@ def self.table(migration)
t.integer :page_id, null: false
t.integer :author_id
t.binary :data, limit: 16.megabytes
- t.string :compression, limit: 6, default: ""
- t.string :comments, default: ""
+ t.string :compression, limit: 6, default: ''
+ t.string :comments, default: ''
t.datetime :updated_on, null: false
t.integer :version, null: false
- t.index :updated_on, name: "index_wiki_content_versions_on_updated_on"
- t.index :wiki_content_id, name: "wiki_content_versions_wcid"
+ t.index :updated_on, name: 'index_wiki_content_versions_on_updated_on'
+ t.index :wiki_content_id, name: 'wiki_content_versions_wcid'
end
end
end
diff --git a/db/migrate/tables/wiki_contents.rb b/db/migrate/tables/wiki_contents.rb
index 79766d3e4624..02f835c60c8a 100644
--- a/db/migrate/tables/wiki_contents.rb
+++ b/db/migrate/tables/wiki_contents.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::WikiContents < Tables::Base
def self.table(migration)
@@ -37,8 +37,8 @@ def self.table(migration)
t.datetime :updated_on, null: false
t.integer :lock_version, null: false
- t.index :author_id, name: "index_wiki_contents_on_author_id"
- t.index :page_id, name: "wiki_contents_page_id"
+ t.index :author_id, name: 'index_wiki_contents_on_author_id'
+ t.index :page_id, name: 'wiki_contents_page_id'
t.index %i[page_id updated_on]
end
end
diff --git a/db/migrate/tables/wiki_pages.rb b/db/migrate/tables/wiki_pages.rb
index d017e6a47fd0..52c9e332bedb 100644
--- a/db/migrate/tables/wiki_pages.rb
+++ b/db/migrate/tables/wiki_pages.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::WikiPages < Tables::Base
def self.table(migration)
@@ -38,10 +38,10 @@ def self.table(migration)
t.integer :parent_id
t.string :slug, null: false
- t.index %i[wiki_id slug], name: "wiki_pages_wiki_id_slug", unique: true
- t.index :parent_id, name: "index_wiki_pages_on_parent_id"
- t.index %i[wiki_id title], name: "wiki_pages_wiki_id_title"
- t.index :wiki_id, name: "index_wiki_pages_on_wiki_id"
+ t.index %i[wiki_id slug], name: 'wiki_pages_wiki_id_slug', unique: true
+ t.index :parent_id, name: 'index_wiki_pages_on_parent_id'
+ t.index %i[wiki_id title], name: 'wiki_pages_wiki_id_title'
+ t.index :wiki_id, name: 'index_wiki_pages_on_wiki_id'
end
end
end
diff --git a/db/migrate/tables/wiki_redirects.rb b/db/migrate/tables/wiki_redirects.rb
index 3b8a2decede4..bd90fca19c40 100644
--- a/db/migrate/tables/wiki_redirects.rb
+++ b/db/migrate/tables/wiki_redirects.rb
@@ -26,18 +26,18 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::WikiRedirects < Tables::Base
def self.table(migration)
create_table migration do |t|
- t.integer "wiki_id", null: false
- t.string "title"
- t.string "redirects_to"
- t.datetime "created_on", null: false
+ t.integer 'wiki_id', null: false
+ t.string 'title'
+ t.string 'redirects_to'
+ t.datetime 'created_on', null: false
- t.index %i[wiki_id title], name: "wiki_redirects_wiki_id_title"
- t.index :wiki_id, name: "index_wiki_redirects_on_wiki_id"
+ t.index %i[wiki_id title], name: 'wiki_redirects_wiki_id_title'
+ t.index :wiki_id, name: 'index_wiki_redirects_on_wiki_id'
end
end
end
diff --git a/db/migrate/tables/wikis.rb b/db/migrate/tables/wikis.rb
index 9f219b55e355..a6e737ac665b 100644
--- a/db/migrate/tables/wikis.rb
+++ b/db/migrate/tables/wikis.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Wikis < Tables::Base
def self.table(migration)
@@ -35,7 +35,7 @@ def self.table(migration)
t.string :start_page, null: false
t.integer :status, default: 1, null: false
- t.index :project_id, name: "wikis_project_id"
+ t.index :project_id, name: 'wikis_project_id'
end
end
end
diff --git a/db/migrate/tables/work_package_journals.rb b/db/migrate/tables/work_package_journals.rb
index 51333e4b0bb9..d8095fb3f700 100644
--- a/db/migrate/tables/work_package_journals.rb
+++ b/db/migrate/tables/work_package_journals.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::WorkPackageJournals < Tables::Base
# rubocop:disable Metrics/AbcSize
@@ -35,7 +35,7 @@ def self.table(migration)
t.integer :journal_id, null: false
t.integer :type_id, default: 0, null: false
t.integer :project_id, default: 0, null: false
- t.string :subject, default: "", null: false
+ t.string :subject, default: '', null: false
t.text :description
t.date :due_date
t.integer :category_id
diff --git a/db/migrate/tables/work_packages.rb b/db/migrate/tables/work_packages.rb
index 47e0a9d50f2a..67e0a7e97b4e 100644
--- a/db/migrate/tables/work_packages.rb
+++ b/db/migrate/tables/work_packages.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::WorkPackages < Tables::Base
# rubocop:disable Metrics/AbcSize
@@ -34,7 +34,7 @@ def self.table(migration)
create_table migration do |t|
t.integer :type_id, default: 0, null: false
t.belongs_to :project, default: 0, null: false, type: :int
- t.string :subject, default: "", null: false
+ t.string :subject, default: '', null: false
t.text :description
t.date :due_date
t.integer :category_id
diff --git a/db/migrate/tables/workflows.rb b/db/migrate/tables/workflows.rb
index fc103ecc8ea6..236c80a5da58 100644
--- a/db/migrate/tables/workflows.rb
+++ b/db/migrate/tables/workflows.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-require_relative "base"
+require_relative 'base'
class Tables::Workflows < Tables::Base
def self.table(migration)
@@ -38,10 +38,10 @@ def self.table(migration)
t.boolean :assignee, default: false, null: false
t.boolean :author, default: false, null: false
- t.index :new_status_id, name: "index_workflows_on_new_status_id"
- t.index :old_status_id, name: "index_workflows_on_old_status_id"
- t.index :role_id, name: "index_workflows_on_role_id"
- t.index %i[role_id type_id old_status_id], name: "wkfs_role_type_old_status"
+ t.index :new_status_id, name: 'index_workflows_on_new_status_id'
+ t.index :old_status_id, name: 'index_workflows_on_old_status_id'
+ t.index :role_id, name: 'index_workflows_on_role_id'
+ t.index %i[role_id type_id old_status_id], name: 'wkfs_role_type_old_status'
end
end
end
diff --git a/docker-compose.yml b/docker-compose.yml
index 6ee045bc57e2..5c77c0aa4a30 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,3 +1,5 @@
+version: '3.8'
+
networks:
network:
testing:
@@ -66,7 +68,7 @@ services:
worker:
<<: *backend
- command: bundle exec good_job start
+ command: bundle exec rake jobs:work
depends_on:
- db
- cache
diff --git a/docker/prod/bimworker b/docker/prod/bimworker
index 01b7766a1b57..a63e2777dbc1 100755
--- a/docker/prod/bimworker
+++ b/docker/prod/bimworker
@@ -1,3 +1,3 @@
#!/bin/bash -e
export QUEUE=bim,ifc_conversion
-exec bundle exec good_job start
+exec bundle exec rake jobs:work
diff --git a/docker/prod/seeder b/docker/prod/seeder
index 751ba6dec915..f8e78f91fb0f 100755
--- a/docker/prod/seeder
+++ b/docker/prod/seeder
@@ -7,8 +7,7 @@ if [[ "$OUTPUT" = "No relations found." ]]; then
DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:structure:load db:seed
else
echo "Executing database migration and database seed..."
- bundle exec rake db:migrate
- bundle exec rake db:seed
+ bundle exec rake db:migrate db:seed
fi
if [ "$1" = "--set" ]; then
diff --git a/docker/prod/wait_for_db.rb b/docker/prod/wait_for_db.rb
index 4fc18e2afc13..971e7fafea33 100644
--- a/docker/prod/wait_for_db.rb
+++ b/docker/prod/wait_for_db.rb
@@ -1,6 +1,6 @@
-require "timeout"
+require 'timeout'
-timeout = (ENV["WAIT_FOR_DB_TIMEOUT_SECONDS"] || 120).to_i
+timeout = (ENV['WAIT_FOR_DB_TIMEOUT_SECONDS'] || 120).to_i
Timeout::timeout(timeout) do
loop do
diff --git a/docker/prod/worker b/docker/prod/worker
index 87130302b193..bc4d194cbaaf 100755
--- a/docker/prod/worker
+++ b/docker/prod/worker
@@ -5,4 +5,4 @@ if [ "$1" = "--seed" ]; then
$APP_PATH/docker/prod/seeder "$@"
fi
-QUIET=true bundle exec good_job start
+QUIET=true bundle exec rake jobs:work
diff --git a/docs/api/apiv3/components/schemas/project_model.yml b/docs/api/apiv3/components/schemas/project_model.yml
index 2e766c0c62f2..166a14575c47 100644
--- a/docs/api/apiv3/components/schemas/project_model.yml
+++ b/docs/api/apiv3/components/schemas/project_model.yml
@@ -29,7 +29,7 @@ properties:
createdAt:
type: string
format: date-time
- description: Time of creation. Can be writable by admins with the `apiv3_write_readonly_attributes` setting enabled.
+ description: Time of creation
updatedAt:
type: string
format: date-time
diff --git a/docs/api/apiv3/components/schemas/work_package_model.yml b/docs/api/apiv3/components/schemas/work_package_model.yml
index 0f364c55fb45..2e8e48a36c4b 100644
--- a/docs/api/apiv3/components/schemas/work_package_model.yml
+++ b/docs/api/apiv3/components/schemas/work_package_model.yml
@@ -104,12 +104,12 @@ properties:
createdAt:
type: string
format: date-time
- description: Time of creation. Can be writable by admins with the `apiv3_write_readonly_attributes` setting enabled.
+ description: Time of creation
readOnly: true
updatedAt:
type: string
format: date-time
- description: Time of the most recent change to the work package. Can be writable by admins with the `apiv3_write_readonly_attributes` setting enabled.
+ description: Time of the most recent change to the work package
readOnly: true
_links:
type: object
diff --git a/docs/bim-guide/revit-add-in/README.md b/docs/bim-guide/revit-add-in/README.md
index 435b81ebd668..94dada52c25d 100644
--- a/docs/bim-guide/revit-add-in/README.md
+++ b/docs/bim-guide/revit-add-in/README.md
@@ -48,7 +48,7 @@ The **OpenProject Revit AddIn** does not have any special system requirements. A
To download the setup application for the **OpenProject Revit AddIn**, click here: [DOWNLOAD](https://github.com/opf/openproject-revit-add-in/releases/download/v2.3.3/OpenProject.Revit.exe)
-You can find the latest version of our AddIn on [Github](https://github.com/opf/openproject-revit-add-in/releases/latest) as well.
+You can find the latest version of our AddIn on [GitHub](https://github.com/opf/openproject-revit-add-in/releases/latest) as well.
diff --git a/docs/development/concepts/translations/README.md b/docs/development/concepts/translations/README.md
index d4237061e9b9..f32ca3e7a1ce 100644
--- a/docs/development/concepts/translations/README.md
+++ b/docs/development/concepts/translations/README.md
@@ -115,7 +115,7 @@ public text = {
Then you can use them as below in your template:
```html
-
+
diff --git a/docs/development/contribution-documentation/documentation-process/README.md b/docs/development/contribution-documentation/documentation-process/README.md
index 1962c6a0c252..fb9b76e126af 100644
--- a/docs/development/contribution-documentation/documentation-process/README.md
+++ b/docs/development/contribution-documentation/documentation-process/README.md
@@ -32,7 +32,7 @@ You can download the installer from the [Typora website](https://typora.io). Fol
You can install the software GitHub Desktop on any [supported operating systems](https://docs.github.com/en/desktop/installing-and-configuring-github-desktop/overview/supported-operating-systems). To install GitHub Desktop navigate to [https://desktop.github.com](https://desktop.github.com) and download the appropriate version for your operating system. Follow the prompts to complete the installation.
-## Step 4: Sign in into Github.com in GitHub Desktop
+## Step 4: Sign in into GitHub.com in GitHub Desktop
To exchange data between your local repository and remote repositories you need to first sign (File -> Options -> Sign in).
@@ -196,7 +196,7 @@ In GitHub Desktop **at Current branch the old branch is visible [1]** . After yo
#### C) Change remote repository back to the forked repository (ORIGIN)
-In Github Desktop choose menu "Repository -> Repository settings". This will open a new window (screenshot below). Enter the URL of your forked OpenProject repository (e.g. https://github.com/adam-op/openproject.git). Confirm with **Save**
+In GitHub Desktop choose menu "Repository -> Repository settings". This will open a new window (screenshot below). Enter the URL of your forked OpenProject repository (e.g. https://github.com/adam-op/openproject.git). Confirm with **Save**
![rebase-your-fork-step-3](rebase-your-fork-step-3.png)
diff --git a/docs/development/development-environment-docker/README.md b/docs/development/development-environment-docker/README.md
index dbfe1b08f6cb..191755e3dcf2 100644
--- a/docs/development/development-environment-docker/README.md
+++ b/docs/development/development-environment-docker/README.md
@@ -141,8 +141,15 @@ system's resources.
```shell
# Start the worker service and let it run continuously
docker compose up -d worker
+
+# Start the worker service to work off all delayed jobs and shut it down afterwards
+docker compose run --rm worker rake jobs:workoff
```
+The testing containers are excluded as well, while they are harmless to start, but take up system resources again and
+clog your logs while running. The delayed_job background worker reloads the application for every job in development
+mode. This is a know issue and documented here: https://github.com/collectiveidea/delayed_job/issues/823
+
This process can take quite a long time on the first run where all gems are installed for the first time. However, these
are cached in a docker volume. Meaning that from the 2nd run onwards it will start a lot quicker.
@@ -389,7 +396,7 @@ docker compose --project-directory docker/dev/tls up -d
## GitLab CE Service
-Within `docker/dev/gitlab` a compose file is provided for running local Gitlab instance with TLS support. This provides
+Within `docker/dev/gitlab` a compose file is provided for running local GitLab instance with TLS support. This provides
a production like environment for testing the OpenProject GitLab integration against a community edition GitLab instance
accessible on `https://gitlab.local`.
diff --git a/docs/development/development-environment-osx/README.md b/docs/development/development-environment-osx/README.md
index 8a6e2a77c9bd..c484e6ea84f3 100644
--- a/docs/development/development-environment-osx/README.md
+++ b/docs/development/development-environment-osx/README.md
@@ -250,7 +250,7 @@ You can then access the application either through `localhost:3000` (Rails serve
### Delayed Job background worker
```shell
-RAILS_ENV=development bundle exec good_job start
+RAILS_ENV=development bin/rails jobs:work
```
This will start a Delayed::Job worker to perform asynchronous jobs like sending emails.
@@ -298,6 +298,12 @@ brew install git
## Known issues
+### Memory management
+
+The delayed_job background worker reloads the application for every job in development mode. This is a know issue and documented here: https://github.com/collectiveidea/delayed_job/issues/823
+
+
+
### Spawning a lot of browser tabs
If you haven't run this command for a while, chances are that a lot of background jobs have queued up and might cause a significant amount of open tabs (due to the way we deliver mails with the letter_opener gem). To get rid of the jobs before starting the worker, use the following command. **This will remove all currently scheduled jobs, never use this in a production setting.**
diff --git a/docs/development/development-environment-ubuntu/README.md b/docs/development/development-environment-ubuntu/README.md
index 52ed199ef6e6..25c551a6adb1 100644
--- a/docs/development/development-environment-ubuntu/README.md
+++ b/docs/development/development-environment-ubuntu/README.md
@@ -301,7 +301,7 @@ You can then access the application either through `localhost:3000` (Rails serve
### Background job worker
```shell
-RAILS_ENV=development bundle exec good_job start
+RAILS_ENV=development bin/rails jobs:work
```
This will start a Delayed::Job worker to perform asynchronous jobs like sending emails.
@@ -310,6 +310,12 @@ This will start a Delayed::Job worker to perform asynchronous jobs like sending
## Known issues
+### Memory management
+
+The delayed_job background worker reloads the application for every job in development mode. This is a know issue and documented here: https://github.com/collectiveidea/delayed_job/issues/823
+
+
+
### Spawning a lot of browser tabs
If you haven't run this command for a while, chances are that a lot of background jobs have queued up and might cause a significant amount of open tabs (due to the way we deliver mails with the letter_opener gem). To get rid of the jobs before starting the worker, use the following command. **This will remove all currently scheduled jobs, never use this in a production setting.**
diff --git a/docs/development/running-tests/README.md b/docs/development/running-tests/README.md
index 0eebfa67defc..79e39b8fc71a 100644
--- a/docs/development/running-tests/README.md
+++ b/docs/development/running-tests/README.md
@@ -837,7 +837,7 @@ OPENPROJECT_CLI_PROXY='http://:4200' ./bin/rails s -b 0.0.0.0 -p
# Now access your server from http://:3000 with code reloading
```
-You might have to also update your host name setting `bundle exec rake setting:set[host_name=yourip]`.
+You might have to also update your host name setting `bundle exec rake setting:set[host_name=your-ip]`.
## Legacy LDAP tests
diff --git a/docs/getting-started/gantt-chart-introduction/openproject-user-guide-create-project-plan.gif b/docs/getting-started/gantt-chart-introduction/openproject-user-guide-create-project-plan.gif
index 86bdb3c00e5b..5a57e841797d 100644
Binary files a/docs/getting-started/gantt-chart-introduction/openproject-user-guide-create-project-plan.gif and b/docs/getting-started/gantt-chart-introduction/openproject-user-guide-create-project-plan.gif differ
diff --git a/docs/getting-started/gantt-chart-introduction/openproject-user-guide-edit-project-plan.gif b/docs/getting-started/gantt-chart-introduction/openproject-user-guide-edit-project-plan.gif
index 1e3e21b26a77..b95c45a764f0 100644
Binary files a/docs/getting-started/gantt-chart-introduction/openproject-user-guide-edit-project-plan.gif and b/docs/getting-started/gantt-chart-introduction/openproject-user-guide-edit-project-plan.gif differ
diff --git a/docs/getting-started/gantt-chart-introduction/openproject-user-guide-select-gantt-charts-module.png b/docs/getting-started/gantt-chart-introduction/openproject-user-guide-select-gantt-charts-module.png
index 138e078a430b..466e10d66b95 100644
Binary files a/docs/getting-started/gantt-chart-introduction/openproject-user-guide-select-gantt-charts-module.png and b/docs/getting-started/gantt-chart-introduction/openproject-user-guide-select-gantt-charts-module.png differ
diff --git a/docs/getting-started/invite-members/create-project-button.png b/docs/getting-started/invite-members/create-project-button.png
index 1e7579161468..be98dc258f64 100644
Binary files a/docs/getting-started/invite-members/create-project-button.png and b/docs/getting-started/invite-members/create-project-button.png differ
diff --git a/docs/getting-started/invite-members/invite-new-member-email.png b/docs/getting-started/invite-members/invite-new-member-email.png
index 9244cac0fd30..7e2611ffb631 100644
Binary files a/docs/getting-started/invite-members/invite-new-member-email.png and b/docs/getting-started/invite-members/invite-new-member-email.png differ
diff --git a/docs/getting-started/invite-members/invite-new-member.png b/docs/getting-started/invite-members/invite-new-member.png
index ca3187700312..7598a2717d33 100644
Binary files a/docs/getting-started/invite-members/invite-new-member.png and b/docs/getting-started/invite-members/invite-new-member.png differ
diff --git a/docs/getting-started/invite-members/invite-user-over-assignment.png b/docs/getting-started/invite-members/invite-user-over-assignment.png
index 2766aab005cf..ebb918fc7f8a 100644
Binary files a/docs/getting-started/invite-members/invite-user-over-assignment.png and b/docs/getting-started/invite-members/invite-user-over-assignment.png differ
diff --git a/docs/getting-started/invite-members/invite-user-pop-up.png b/docs/getting-started/invite-members/invite-user-pop-up.png
index b2c4bb75556c..5afcb4198ff5 100644
Binary files a/docs/getting-started/invite-members/invite-user-pop-up.png and b/docs/getting-started/invite-members/invite-user-pop-up.png differ
diff --git a/docs/getting-started/invite-members/project-members-module.png b/docs/getting-started/invite-members/project-members-module.png
index 2cd07dbbad43..ee6e5c648b73 100644
Binary files a/docs/getting-started/invite-members/project-members-module.png and b/docs/getting-started/invite-members/project-members-module.png differ
diff --git a/docs/getting-started/my-account/openproject_my_account_2fa_overview.png b/docs/getting-started/my-account/openproject_my_account_2fa_overview.png
index 161ca2b95701..89bd0c38fb53 100644
Binary files a/docs/getting-started/my-account/openproject_my_account_2fa_overview.png and b/docs/getting-started/my-account/openproject_my_account_2fa_overview.png differ
diff --git a/docs/getting-started/my-account/openproject_my_account_authentication_options.png b/docs/getting-started/my-account/openproject_my_account_authentication_options.png
index 465a6eaf7303..f0c5f0370da9 100644
Binary files a/docs/getting-started/my-account/openproject_my_account_authentication_options.png and b/docs/getting-started/my-account/openproject_my_account_authentication_options.png differ
diff --git a/docs/getting-started/my-account/openproject_my_account_authenticator_app.png b/docs/getting-started/my-account/openproject_my_account_authenticator_app.png
index f3cf1a9474d2..20bdf66034d5 100644
Binary files a/docs/getting-started/my-account/openproject_my_account_authenticator_app.png and b/docs/getting-started/my-account/openproject_my_account_authenticator_app.png differ
diff --git a/docs/getting-started/my-account/openproject_my_account_authenticator_webauth.png b/docs/getting-started/my-account/openproject_my_account_authenticator_webauth.png
index e02686fb1c9c..81e36f862af9 100644
Binary files a/docs/getting-started/my-account/openproject_my_account_authenticator_webauth.png and b/docs/getting-started/my-account/openproject_my_account_authenticator_webauth.png differ
diff --git a/docs/getting-started/my-account/openproject_my_account_two_factor_authentication.png b/docs/getting-started/my-account/openproject_my_account_two_factor_authentication.png
index 5a3c82644068..380de66d21b8 100644
Binary files a/docs/getting-started/my-account/openproject_my_account_two_factor_authentication.png and b/docs/getting-started/my-account/openproject_my_account_two_factor_authentication.png differ
diff --git a/docs/getting-started/my-account/openproject_my_account_two_factor_authentication_mobile.png b/docs/getting-started/my-account/openproject_my_account_two_factor_authentication_mobile.png
index 2ccc05254f5c..b38891250493 100644
Binary files a/docs/getting-started/my-account/openproject_my_account_two_factor_authentication_mobile.png and b/docs/getting-started/my-account/openproject_my_account_two_factor_authentication_mobile.png differ
diff --git a/docs/getting-started/projects/create-a-new-project-landing-page.png b/docs/getting-started/projects/create-a-new-project-landing-page.png
index d0fb8becb201..43859edcba1c 100644
Binary files a/docs/getting-started/projects/create-a-new-project-landing-page.png and b/docs/getting-started/projects/create-a-new-project-landing-page.png differ
diff --git a/docs/getting-started/projects/create-project-header.png b/docs/getting-started/projects/create-project-header.png
index 9ec6f351932e..ed89c62571f9 100644
Binary files a/docs/getting-started/projects/create-project-header.png and b/docs/getting-started/projects/create-project-header.png differ
diff --git a/docs/getting-started/projects/openproject-landing-page.png b/docs/getting-started/projects/openproject-landing-page.png
index 4392998684b5..d3d2736bf578 100644
Binary files a/docs/getting-started/projects/openproject-landing-page.png and b/docs/getting-started/projects/openproject-landing-page.png differ
diff --git a/docs/getting-started/projects/project-overview-list.png b/docs/getting-started/projects/project-overview-list.png
index e87b19b3dd2d..9a31c0706155 100644
Binary files a/docs/getting-started/projects/project-overview-list.png and b/docs/getting-started/projects/project-overview-list.png differ
diff --git a/docs/getting-started/projects/view_all_projects.png b/docs/getting-started/projects/view_all_projects.png
index 62a5f4f1be14..8240d050cfe3 100644
Binary files a/docs/getting-started/projects/view_all_projects.png and b/docs/getting-started/projects/view_all_projects.png differ
diff --git a/docs/getting-started/projects/view_all_projects_options.png b/docs/getting-started/projects/view_all_projects_options.png
index ad8cf874ccc7..5fa959b7f4b2 100644
Binary files a/docs/getting-started/projects/view_all_projects_options.png and b/docs/getting-started/projects/view_all_projects_options.png differ
diff --git a/docs/glossary/README.md b/docs/glossary/README.md
index bd18d288858d..3c3bd4d27dbf 100644
--- a/docs/glossary/README.md
+++ b/docs/glossary/README.md
@@ -274,7 +274,7 @@ Your activated plugins are listed together with your [modules](#module) in your
### Primer design system
-OpenProject started adopting [Github's Primer Design System](https://primer.style/) in 2023. New features will be developed using Primer and existing features will will be gradually revised. Relevant reusable components from Primer as well as common patterns and compositions of these components will be documented in our [Lookbook](https://qa.openproject-edge.com/lookbook/pages/how_to_use). [Read more about OpenProject's decision to use Primer](https://www.openproject.org/blog/primer-design-system/).
+OpenProject started adopting [GitHub's Primer Design System](https://primer.style/) in 2023. New features will be developed using Primer and existing features will will be gradually revised. Relevant reusable components from Primer as well as common patterns and compositions of these components will be documented in our [Lookbook](https://qa.openproject-edge.com/lookbook/pages/how_to_use). [Read more about OpenProject's decision to use Primer](https://www.openproject.org/blog/primer-design-system/).
### Project
diff --git a/docs/installation-and-operations/configuration/README.md b/docs/installation-and-operations/configuration/README.md
index 92e9234ecf47..3571d5935f80 100644
--- a/docs/installation-and-operations/configuration/README.md
+++ b/docs/installation-and-operations/configuration/README.md
@@ -758,7 +758,7 @@ OPENPROJECT_2FA_ENFORCED="true"
**Setting available strategies**
-By default, the TOTP and WebAuthn strategie are active.
+By default, the TOTP and WebAuthn strategies are active.
If you have a [MessageBird account](https://www.messagebird.com/), you can setup a SMS 2FA by activating that strategy like so:
diff --git a/docs/installation-and-operations/configuration/plugins/README.md b/docs/installation-and-operations/configuration/plugins/README.md
index 99faac1d6a5d..7282137ec9f7 100644
--- a/docs/installation-and-operations/configuration/plugins/README.md
+++ b/docs/installation-and-operations/configuration/plugins/README.md
@@ -24,7 +24,7 @@ group :opf_plugins do
end
```
-**Note:** The Gitlab plugin is usually only compatible with the latest versions. For more information, please see the respective repository: https://github.com/btey/openproject-gitlab-integration/
+**Note:** The GitLab plugin is usually only compatible with the latest versions. For more information, please see the respective repository: https://github.com/btey/openproject-gitlab-integration/
The group `:opf_plugins` is generally recommended, but only required for plugins with custom frontend code that is picked up by webpack and output into their respective bundles.
diff --git a/docs/installation-and-operations/installation-faq/README.md b/docs/installation-and-operations/installation-faq/README.md
index a086e93eec30..802e11c602c6 100644
--- a/docs/installation-and-operations/installation-faq/README.md
+++ b/docs/installation-and-operations/installation-faq/README.md
@@ -124,7 +124,7 @@ Set a higher number of web workers to allow more processes to be handled at the
There are two different types of emails in OpenProject: One sent directly within the request to the server (this includes the test mail) and one sent asynchronously, via a background job from the backend. The majority of mail sending jobs is run asynchronously to facilitate a faster response time for server request.
-Use a browser to call your domain name followed by "health_checks/all" (e.g. `https://myopenproject.com/health_checks/all`). There should be entries about "worker" and "worker_backed_up". If PASSED is written behind it, everything is good.
+Use a browser to call your domain name followed by "health_checks/all" (e.g. `https://myopenproject.com/health_checks/all`). There should be entries about "delayed_jobs_backed_up" and "delayed_jobs_never_ran". If PASSED is written behind it, everything is good.
If the health check does not return satisfying results, have a look if the background worker is running by entering `ps aux | grep jobs` on the server. If it is not running, no entry is returned. If it is running an entry with "jobs:work" at the end is displayed.
diff --git a/docs/installation-and-operations/operation/monitoring/README.md b/docs/installation-and-operations/operation/monitoring/README.md
index 145dba04978c..40d740b33464 100644
--- a/docs/installation-and-operations/operation/monitoring/README.md
+++ b/docs/installation-and-operations/operation/monitoring/README.md
@@ -124,10 +124,8 @@ We provide the following health checks:
- `https://your-hostname.example.tld/health_checks/default` - An application level check to ensure the web workers are running.
- `https://your-hostname.example.tld/health_checks/database` - A database liveliness check.
-- `https://your-hostname.example.tld/health_checks/mail` - SMTP configuration check.
-- `https://your-hostname.example.tld/health_checks/puma` - A check on Puma web server.
-- `https://your-hostname.example.tld/health_checks/worker` - A check to ensure background jobs are being processed.
-- `https://your-hostname.example.tld/health_checks/worker_backed_up` - A check to determine whether background workers are at capacity and might need to be scaled up to provide timely processing of mails and other background work.
+- `https://your-hostname.example.tld/health_checks/delayed_jobs_never_ran` - A check to ensure background jobs are being processed.
+- `https://your-hostname.example.tld/health_checks/delayed_jobs_backed_up` - A check to determine whether background workers are at capacity and might need to be scaled up to provide timely processing of mails and other background work.
- `https://your-hostname.example.tld/health_checks/all` - All of the above checks and additional checks combined as one. Not recommended as the liveliness check of a pod/container.
### Optional authentication
diff --git a/docs/release-notes/11/11-0-0/README.md b/docs/release-notes/11/11-0-0/README.md
index e3f569d5990b..1bfaa6c36e6c 100644
--- a/docs/release-notes/11/11-0-0/README.md
+++ b/docs/release-notes/11/11-0-0/README.md
@@ -229,7 +229,7 @@ There are lots and lots of new things we packed into 11.0 to tell you about.
- Fixed: Error 500 when bulk-editing work packages \[[#34588](https://community.openproject.org/wp/34588)\]
- Fixed: Year almost hidden in date picker for version \[[#34590](https://community.openproject.org/wp/34590)\]
- Fixed: Onboarding tour broken in multiple places \[[#34597](https://community.openproject.org/wp/34597)\]
-- Fixed: Github Integration \[[#34598](https://community.openproject.org/wp/34598)\]
+- Fixed: GitHub Integration \[[#34598](https://community.openproject.org/wp/34598)\]
- Fixed: Google OpenID provider image not shown in login form \[[#34601](https://community.openproject.org/wp/34601)\]
- Fixed: Parent work package in manual scheduling mode without date cannot be scheduled from Gantt chart \[[#34710](https://community.openproject.org/wp/34710)\]
- Fixed: Menu too small/completely hidden on Roadmap \[[#34712](https://community.openproject.org/wp/34712)\]
@@ -291,7 +291,7 @@ There are lots and lots of new things we packed into 11.0 to tell you about.
- Changed: Improve board creation modal \[[#34070](https://community.openproject.org/wp/34070)\]
- Changed: Hide derived (Start/Finish) Date from work package forms \[[#34122](https://community.openproject.org/wp/34122)\]
- Changed: Extend search autocompleter with useful information \[[#34132](https://community.openproject.org/wp/34132)\]
-- Changed: [all projects overview] (Add option to) show status-text in expanded view. \[[#34191](https://community.openproject.org/wp/34191)\]
+- Changed: \[all projects overview\] (Add option to) show status-text in expanded view. \[[#34191](https://community.openproject.org/wp/34191)\]
- Changed: Map board subtasks columns when copying projects \[[#34238](https://community.openproject.org/wp/34238)\]
- Changed: Having meetings as a linkable resource \[[#34256](https://community.openproject.org/wp/34256)\]
- Changed: What's new teaser OpenProject BIM 11.0 \[[#34514](https://community.openproject.org/wp/34514)\]
diff --git a/docs/release-notes/11/11-3-0/README.md b/docs/release-notes/11/11-3-0/README.md
index 3bbf6d9b53a6..bac6cff9810b 100644
--- a/docs/release-notes/11/11-3-0/README.md
+++ b/docs/release-notes/11/11-3-0/README.md
@@ -124,7 +124,7 @@ Users now have the option to **create backups of their OpenProject installation*
- Changed: Add copy project form to APIv3 \[[#37091](https://community.openproject.org/wp/37091)\]
- Changed: Attribute help text on dynamic form \[[#37092](https://community.openproject.org/wp/37092)\]
- Changed: Improve design of checkboxes in formly forms \[[#37105](https://community.openproject.org/wp/37105)\]
-- Changed: Improve design of Github tab \[[#37108](https://community.openproject.org/wp/37108)\]
+- Changed: Improve design of GitHub tab \[[#37108](https://community.openproject.org/wp/37108)\]
- Changed: Allow inviting users from project member administration for non admins \[[#37126](https://community.openproject.org/wp/37126)\]
- Changed: Handle duplicate project identifiers in the backend \[[#37140](https://community.openproject.org/wp/37140)\]
- Fixed: Unable to enter Boards module when work package module is disabled \[[#34794](https://community.openproject.org/wp/34794)\]
@@ -183,7 +183,7 @@ Users now have the option to **create backups of their OpenProject installation*
- Fixed: "(None)" option missing for parent project drop down select \[[#37398](https://community.openproject.org/wp/37398)\]
- Fixed: Multi-select fields do not adjust height (cannot see values) \[[#37404](https://community.openproject.org/wp/37404)\]
- Fixed: OpenProject backup completes partially with file permission errors \[[#37440](https://community.openproject.org/wp/37440)\]
-- Fixed: Github user avatar not rendered correctly \[[#37444](https://community.openproject.org/wp/37444)\]
+- Fixed: GitHub user avatar not rendered correctly \[[#37444](https://community.openproject.org/wp/37444)\]
- Fixed: Password confirmation during backup token reset not working \[[#37445](https://community.openproject.org/wp/37445)\]
- Fixed: Several problem with the header in mobile view \[[#37452](https://community.openproject.org/wp/37452)\]
- Fixed: allowedValues for project user custom fields result in 400 bad request \[[#37453](https://community.openproject.org/wp/37453)\]
diff --git a/docs/release-notes/11/11-4-0/README.md b/docs/release-notes/11/11-4-0/README.md
index d2690f702a75..5ba523517c25 100644
--- a/docs/release-notes/11/11-4-0/README.md
+++ b/docs/release-notes/11/11-4-0/README.md
@@ -28,7 +28,7 @@ OpenProject 11.4.0 adds packaged installation support for Debian 11 "Bullseye".
- Fixed: Wiki menu item scrolling does not work with two main wiki items \[[#38878](https://community.openproject.org/wp/38878)\]
- Fixed: Imminent user limit warning shown prematurely \[[#38893](https://community.openproject.org/wp/38893)\]
- Fixed: Custom S3 compatible upload providers blocked by CSP \[[#38900](https://community.openproject.org/wp/38900)\]
-- Fixed: [Github Integration] Webhook fails for pull_request event without body \[[#38919](https://community.openproject.org/wp/38919)\]
+- Fixed: [GitHub Integration] Webhook fails for pull_request event without body \[[#38919](https://community.openproject.org/wp/38919)\]
- Fixed: IFC upload not working since attachment whitelisting \[[#38954](https://community.openproject.org/wp/38954)\]
- Fixed: BIM seed are missing snapshots \[[#39009](https://community.openproject.org/wp/39009)\]
- Fixed: Regression: Typing S while focus in viewer opens the OP global search \[[#39029](https://community.openproject.org/wp/39029)\]
diff --git a/docs/release-notes/12/12-1-0/README.md b/docs/release-notes/12/12-1-0/README.md
index 8c457b75608c..90ce53533abb 100644
--- a/docs/release-notes/12/12-1-0/README.md
+++ b/docs/release-notes/12/12-1-0/README.md
@@ -150,7 +150,7 @@ We added a new “Files” tab in the work package details. This way, you will h
- Fixed: Users can't select public template projects in new project dialog \[[#40918](https://community.openproject.org/wp/40918)\]
- Fixed: Meeting Time in iCalendar is wrong \[[#40941](https://community.openproject.org/wp/40941)\]
- Fixed: Toolbar icons should be rendered in the "old" style and not the new rounded style (which is a work in progress) \[[#40957](https://community.openproject.org/wp/40957)\]
-- Fixed: [Docker] - Gitlab integration plugin \[[#40959](https://community.openproject.org/wp/40959)\]
+- Fixed: [Docker] - GitLab integration plugin \[[#40959](https://community.openproject.org/wp/40959)\]
- Fixed: Project dropdown no longer autofocused \[[#40978](https://community.openproject.org/wp/40978)\]
- Fixed: Not possible to copy work package to another project \[[#41005](https://community.openproject.org/wp/41005)\]
- Fixed: Changed calendar styles applied to time entries component \[[#41013](https://community.openproject.org/wp/41013)\]
diff --git a/docs/release-notes/13-3-0/README.md b/docs/release-notes/13-3-0/README.md
index c501e37adc3f..dcfbdb794101 100644
--- a/docs/release-notes/13-3-0/README.md
+++ b/docs/release-notes/13-3-0/README.md
@@ -56,7 +56,7 @@ With this release, admins of an Enterprise edition can choose between manually o
- Bugfix: Lookbook is broken \[[#51787](https://community.openproject.org/wp/51787)\]
- Bugfix: Anonymous Users (without signing in) cannot load board content \[[#51850](https://community.openproject.org/wp/51850)\]
- Bugfix: Misalignment in the dropdown on searching work packages \[[#51948](https://community.openproject.org/wp/51948)\]
-- Bugfix: Remove colour in share modal is not correct \[[#52012](https://community.openproject.org/wp/52012)\]
+- Bugfix: Remove color in share modal is not correct \[[#52012](https://community.openproject.org/wp/52012)\]
- Bugfix: Timeouts as non privileged users \[[#52022](https://community.openproject.org/wp/52022)\]
- Bugfix: WorkPackage query with baseline filter takes too much time for non-admins \[[#52156](https://community.openproject.org/wp/52156)\]
- Bugfix: Multi-select user custom field broken in table \[[#52289](https://community.openproject.org/wp/52289)\]
diff --git a/docs/release-notes/13-3-0/openproject-13-3-sharepoint-onedrive-automatically-managed-project-folders-highlighted.png b/docs/release-notes/13-3-0/openproject-13-3-sharepoint-onedrive-automatically-managed-project-folders-highlighted.png
index d2a002099aa0..c983ff779c48 100644
Binary files a/docs/release-notes/13-3-0/openproject-13-3-sharepoint-onedrive-automatically-managed-project-folders-highlighted.png and b/docs/release-notes/13-3-0/openproject-13-3-sharepoint-onedrive-automatically-managed-project-folders-highlighted.png differ
diff --git a/docs/release-notes/13-3-0/openproject-filter-project-lists.png b/docs/release-notes/13-3-0/openproject-filter-project-lists.png
index 0391b318eefc..b94140e02a09 100644
Binary files a/docs/release-notes/13-3-0/openproject-filter-project-lists.png and b/docs/release-notes/13-3-0/openproject-filter-project-lists.png differ
diff --git a/docs/release-notes/13-3-0/openproject-user-guide-select-gantt-charts-global.png b/docs/release-notes/13-3-0/openproject-user-guide-select-gantt-charts-global.png
index 3800c47c724a..d24e3625f174 100644
Binary files a/docs/release-notes/13-3-0/openproject-user-guide-select-gantt-charts-global.png and b/docs/release-notes/13-3-0/openproject-user-guide-select-gantt-charts-global.png differ
diff --git a/docs/release-notes/13-4-0/GitLab_integration.png b/docs/release-notes/13-4-0/GitLab_integration.png
index c140eaa0e9ee..a83ef84cfed7 100644
Binary files a/docs/release-notes/13-4-0/GitLab_integration.png and b/docs/release-notes/13-4-0/GitLab_integration.png differ
diff --git a/docs/release-notes/13-4-0/README.md b/docs/release-notes/13-4-0/README.md
index 813bc959c79c..ce75e15c7e43 100644
--- a/docs/release-notes/13-4-0/README.md
+++ b/docs/release-notes/13-4-0/README.md
@@ -88,7 +88,7 @@ Accessibility functionality: Convey to screenreaders when OAuth login has starte
OpenProject version 13.4 now supports PDF exports with lists in table cells that are displayed correctly. Export a work package that contains a table with lists in it into a PDF. Here is an example of how this looks from now on:
-![Work package with a table in the description field and how it looks when exportet as PDF](openproject-13-4-pdf-export-table-lists.png)
+![Work package with a table in the description field and how it looks when exported as PDF](openproject-13-4-pdf-export-table-lists.png)
### WebAuthn/FIDO/U2F is added as a second factor
@@ -139,13 +139,13 @@ Thanks to our great Community we can continuously offer more languages for OpenP
- Bugfix: LDAP user can't be created if optional attributes are not mapped \[[#53327](https://community.openproject.org/wp/53327)\]
- Bugfix: Page editor menu moves under the header \[[#53365](https://community.openproject.org/wp/53365)\]
- Bugfix: Project folder is shown in the main menu based on the wrong permission for automatically managed project folders \[[#53367](https://community.openproject.org/wp/53367)\]
-- Bugfix: Portuguese and Portuguese Brezilian should be distinct from each other \[[#53374](https://community.openproject.org/wp/53374)\]
+- Bugfix: Portuguese and Portuguese Brazilian should be distinct from each other \[[#53374](https://community.openproject.org/wp/53374)\]
- Bugfix: Blacklisted routes not working \[[#53399](https://community.openproject.org/wp/53399)\]
- Bugfix: Incorrect spelling of GitLab module under project settings \[[#53434](https://community.openproject.org/wp/53434)\]
- Bugfix: Webauthn fails on mobile Safari \[[#53442](https://community.openproject.org/wp/53442)\]
- Bugfix: Rake secret task gone in 13.3.1 (breaking scripts & diverging from docs) \[[#53447](https://community.openproject.org/wp/53447)\]
- Bugfix: WebAuth fails on iOS \[[#53494](https://community.openproject.org/wp/53494)\]
-- Bugfix: WebAuthen not selectable on mobile \[[#53495](https://community.openproject.org/wp/53495)\]
+- Bugfix: WebAuthn not selectable on mobile \[[#53495](https://community.openproject.org/wp/53495)\]
- Bugfix: Cannot delete reports in time and costs \[[#52284](https://community.openproject.org/projects/openproject/work_packages/52284/activity)\]
diff --git a/docs/release-notes/13-4-0/meetings-openproject-13-4-files.png b/docs/release-notes/13-4-0/meetings-openproject-13-4-files.png
index e5cad2c41941..ea441c0d869f 100644
Binary files a/docs/release-notes/13-4-0/meetings-openproject-13-4-files.png and b/docs/release-notes/13-4-0/meetings-openproject-13-4-files.png differ
diff --git a/docs/release-notes/13-4-0/openproject-13-4-intermediate-modal-nudging.jpg b/docs/release-notes/13-4-0/openproject-13-4-intermediate-modal-nudging.jpg
index 8af812a1a3d4..fef763895545 100644
Binary files a/docs/release-notes/13-4-0/openproject-13-4-intermediate-modal-nudging.jpg and b/docs/release-notes/13-4-0/openproject-13-4-intermediate-modal-nudging.jpg differ
diff --git a/docs/release-notes/13-4-0/openproject-13-4-meetings-copy-agenda-highlighted.png b/docs/release-notes/13-4-0/openproject-13-4-meetings-copy-agenda-highlighted.png
index 45585cd7fd61..5ac4c67b1fa6 100644
Binary files a/docs/release-notes/13-4-0/openproject-13-4-meetings-copy-agenda-highlighted.png and b/docs/release-notes/13-4-0/openproject-13-4-meetings-copy-agenda-highlighted.png differ
diff --git a/docs/release-notes/13-4-0/openproject-13-4-nudge-oauth.jpg b/docs/release-notes/13-4-0/openproject-13-4-nudge-oauth.jpg
deleted file mode 100644
index 8c2d677f8f57..000000000000
Binary files a/docs/release-notes/13-4-0/openproject-13-4-nudge-oauth.jpg and /dev/null differ
diff --git a/docs/release-notes/13-4-0/openproject-13-4-pdf-export-table-lists.png b/docs/release-notes/13-4-0/openproject-13-4-pdf-export-table-lists.png
index 8e67103b32ec..0864c8a0fca7 100644
Binary files a/docs/release-notes/13-4-0/openproject-13-4-pdf-export-table-lists.png and b/docs/release-notes/13-4-0/openproject-13-4-pdf-export-table-lists.png differ
diff --git a/docs/release-notes/13-4-0/openproject_system_settings_virus_scanning.png b/docs/release-notes/13-4-0/openproject_system_settings_virus_scanning.png
deleted file mode 100644
index cee2c77825c2..000000000000
Binary files a/docs/release-notes/13-4-0/openproject_system_settings_virus_scanning.png and /dev/null differ
diff --git a/docs/release-notes/13-4-0/openproject_virus_scanning.png b/docs/release-notes/13-4-0/openproject_virus_scanning.png
index 52bebc987c66..9cae7c1d47f9 100644
Binary files a/docs/release-notes/13-4-0/openproject_virus_scanning.png and b/docs/release-notes/13-4-0/openproject_virus_scanning.png differ
diff --git a/docs/release-notes/3/3-0-16/README.md b/docs/release-notes/3/3-0-16/README.md
index ac8cd5306918..c5ab39238e14 100644
--- a/docs/release-notes/3/3-0-16/README.md
+++ b/docs/release-notes/3/3-0-16/README.md
@@ -28,6 +28,6 @@ bugs!
For a complete list of changes, please refer to the
[Changelog v3.0.16](https://community.openproject.org/versions/544)
or have a look at
-[Github](https://github.com/opf/openproject/tree/v3.0.16).
+[GitHub](https://github.com/opf/openproject/tree/v3.0.16).
diff --git a/docs/release-notes/4/4-0-2/README.md b/docs/release-notes/4/4-0-2/README.md
index dc4c12179dca..b517b918ff79 100644
--- a/docs/release-notes/4/4-0-2/README.md
+++ b/docs/release-notes/4/4-0-2/README.md
@@ -36,4 +36,4 @@ A big thanks to everyone involved in fixing and reporting those bugs!
For a complete list of changes, please refer to the
[Changelog v4.0.2](https://community.openproject.org/versions/532)
or to
-[Github](https://github.com/opf/openproject/tree/v4.0.2).
+[GitHub](https://github.com/opf/openproject/tree/v4.0.2).
diff --git a/docs/release-notes/8/8-0-2/README.md b/docs/release-notes/8/8-0-2/README.md
index ee9d09ba74b6..bb055bfa229c 100644
--- a/docs/release-notes/8/8-0-2/README.md
+++ b/docs/release-notes/8/8-0-2/README.md
@@ -45,7 +45,7 @@ newest version.
#### Contributions
-Thanks to Github users @storm2513 and @akasparas for providing bugfixes
+Thanks to GitHub users @storm2513 and @akasparas for providing bugfixes
as pull requests [on our GitHub
project](https://github.com/opf/openproject). A big thanks to community
members for reporting bugs and helping us identifying and providing
diff --git a/docs/security-and-privacy/processing-of-personal-data/README.md b/docs/security-and-privacy/processing-of-personal-data/README.md
index e56cc6be77b9..b361b802270e 100644
--- a/docs/security-and-privacy/processing-of-personal-data/README.md
+++ b/docs/security-and-privacy/processing-of-personal-data/README.md
@@ -580,7 +580,7 @@ flowchart LR
subgraph openproject[OpenProject]
direction TB
- opgithubintegration[Github integration] --- workpackagesmodule[Work packages module]
+ opgithubintegration[GitHub integration] --- workpackagesmodule[Work packages module]
end
@@ -635,7 +635,7 @@ flowchart LR
#### Purpose
- Connect merge requests in GitLab with work packages in OpenProject.
-- Connect issues in GitLab with work packages in OpenPrject.
+- Connect issues in GitLab with work packages in OpenProject.
- Show the status of merge requests in related work packages.
#### Processed data
diff --git a/docs/system-admin-guide/attachments/openproject_system_adminstration_attachment_settings.png b/docs/system-admin-guide/attachments/openproject_system_adminstration_attachment_settings.png
index 9700924b171e..b59d032de6fe 100644
Binary files a/docs/system-admin-guide/attachments/openproject_system_adminstration_attachment_settings.png and b/docs/system-admin-guide/attachments/openproject_system_adminstration_attachment_settings.png differ
diff --git a/docs/system-admin-guide/attachments/openproject_system_adminstration_attachments.png b/docs/system-admin-guide/attachments/openproject_system_adminstration_attachments.png
index b976b79b392d..87eb08724f38 100644
Binary files a/docs/system-admin-guide/attachments/openproject_system_adminstration_attachments.png and b/docs/system-admin-guide/attachments/openproject_system_adminstration_attachments.png differ
diff --git a/docs/system-admin-guide/attachments/virus-scanning/image-20240220-iedi.png b/docs/system-admin-guide/attachments/virus-scanning/image-20240220-iedi.png
deleted file mode 100644
index 42f26c07fecc..000000000000
Binary files a/docs/system-admin-guide/attachments/virus-scanning/image-20240220-iedi.png and /dev/null differ
diff --git a/docs/system-admin-guide/attachments/virus-scanning/openproject_system_settings_virus_scanning.png b/docs/system-admin-guide/attachments/virus-scanning/openproject_system_settings_virus_scanning.png
index cee2c77825c2..ea4b533ad8bb 100644
Binary files a/docs/system-admin-guide/attachments/virus-scanning/openproject_system_settings_virus_scanning.png and b/docs/system-admin-guide/attachments/virus-scanning/openproject_system_settings_virus_scanning.png differ
diff --git a/docs/system-admin-guide/design/Sys-admin-design-favicon-1579613889024.png b/docs/system-admin-guide/design/Sys-admin-design-favicon-1579613889024.png
deleted file mode 100644
index 43972eabc841..000000000000
Binary files a/docs/system-admin-guide/design/Sys-admin-design-favicon-1579613889024.png and /dev/null differ
diff --git a/docs/system-admin-guide/design/Sys-admin-design-favicon.png b/docs/system-admin-guide/design/Sys-admin-design-favicon.png
index 25d42aa599a9..e0c4d6516e8a 100644
Binary files a/docs/system-admin-guide/design/Sys-admin-design-favicon.png and b/docs/system-admin-guide/design/Sys-admin-design-favicon.png differ
diff --git a/docs/system-admin-guide/design/Sys-admin-design-upload-logo.png b/docs/system-admin-guide/design/Sys-admin-design-upload-logo.png
index b577b6716eea..deee0aefa7ea 100644
Binary files a/docs/system-admin-guide/design/Sys-admin-design-upload-logo.png and b/docs/system-admin-guide/design/Sys-admin-design-upload-logo.png differ
diff --git a/docs/system-admin-guide/design/System-admin-guide_color-theme.png b/docs/system-admin-guide/design/System-admin-guide_color-theme.png
index ebe6e007c68e..6e0befe01cda 100644
Binary files a/docs/system-admin-guide/design/System-admin-guide_color-theme.png and b/docs/system-admin-guide/design/System-admin-guide_color-theme.png differ
diff --git a/docs/system-admin-guide/design/System-admin-guide_design.png b/docs/system-admin-guide/design/System-admin-guide_design.png
deleted file mode 100644
index 9557c4712363..000000000000
Binary files a/docs/system-admin-guide/design/System-admin-guide_design.png and /dev/null differ
diff --git a/docs/system-admin-guide/design/image-20200121143402479.png b/docs/system-admin-guide/design/image-20200121143402479.png
deleted file mode 100644
index 06225d6018fc..000000000000
Binary files a/docs/system-admin-guide/design/image-20200121143402479.png and /dev/null differ
diff --git a/docs/system-admin-guide/design/image-20200211140615090.png b/docs/system-admin-guide/design/image-20200211140615090.png
deleted file mode 100644
index f80c7c93cdc9..000000000000
Binary files a/docs/system-admin-guide/design/image-20200211140615090.png and /dev/null differ
diff --git a/docs/system-admin-guide/design/openproject_system_guide_design.png b/docs/system-admin-guide/design/openproject_system_guide_design.png
index 1fa57a9a2b7d..d5a8fc355f66 100644
Binary files a/docs/system-admin-guide/design/openproject_system_guide_design.png and b/docs/system-admin-guide/design/openproject_system_guide_design.png differ
diff --git a/docs/system-admin-guide/design/openproject_system_guide_design_advanced_settings.png b/docs/system-admin-guide/design/openproject_system_guide_design_advanced_settings.png
index 0e661eb519a2..ba6efe9d90d8 100644
Binary files a/docs/system-admin-guide/design/openproject_system_guide_design_advanced_settings.png and b/docs/system-admin-guide/design/openproject_system_guide_design_advanced_settings.png differ
diff --git a/docs/system-admin-guide/design/system_admin_logo_updated.png b/docs/system-admin-guide/design/system_admin_logo_updated.png
index b0d1f1468357..cb4768e1067a 100644
Binary files a/docs/system-admin-guide/design/system_admin_logo_updated.png and b/docs/system-admin-guide/design/system_admin_logo_updated.png differ
diff --git a/docs/system-admin-guide/file-storages/README.md b/docs/system-admin-guide/file-storages/README.md
index 5c36009d83d9..da8a50c8a7d6 100644
--- a/docs/system-admin-guide/file-storages/README.md
+++ b/docs/system-admin-guide/file-storages/README.md
@@ -3,7 +3,7 @@ sidebar_navigation:
title: File storages
priority: 830
description: File storages in OpenProject.
-keywords: file storages, Nextcloud setup, Nextcloud integration, OneDrive setup, Sharepoint setup, OneDrive, Sharepoint
+keywords: file storages, Nextcloud setup, Nextcloud integration, OneDrive setup, SharePoint setup, OneDrive, SharePoint
---
# File storages
diff --git a/docs/system-admin-guide/integrations/README.md b/docs/system-admin-guide/integrations/README.md
index d4b645ad04b4..1285fe09def6 100644
--- a/docs/system-admin-guide/integrations/README.md
+++ b/docs/system-admin-guide/integrations/README.md
@@ -46,7 +46,7 @@ OpenProject offers integration with Nextcloud for file storage and collaboration
## OneDrive/SharePoint (Enterprise add-on)
-OpenProject offers an integration with OneDrive/Sharepoint for file storage and collaboration. You can find more information about [setting up the integration with OneDrive/SharePoint](./one-drive) and [using the integration](../../user-guide/file-management/one-drive-integration/).
+OpenProject offers an integration with OneDrive/SharePoint for file storage and collaboration. You can find more information about [setting up the integration with OneDrive/SharePoint](./one-drive) and [using the integration](../../user-guide/file-management/one-drive-integration/).
> **Note**: OneDrive/SharePoint integration is an Enterprise add-on and can only be used with [Enterprise cloud](../../enterprise-guide/enterprise-cloud-guide/) or [Enterprise on-premises](../../enterprise-guide/enterprise-on-premises-guide/). An upgrade from the free Community edition is easy and helps support OpenProject.
diff --git a/docs/system-admin-guide/integrations/github-integration/README.md b/docs/system-admin-guide/integrations/github-integration/README.md
index fff564826bc6..8db04cc83cb0 100644
--- a/docs/system-admin-guide/integrations/github-integration/README.md
+++ b/docs/system-admin-guide/integrations/github-integration/README.md
@@ -28,7 +28,7 @@ Pull request activities will also show up in the Activity tab when the pull requ
* merged
* closed
-![Github comments on work package](workpackage-github-comments.png)
+![GitHub comments on work package](workpackage-github-comments.png)
## Create a pull request
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/README.md b/docs/system-admin-guide/integrations/gitlab-integration/README.md
index de18ed91a139..d4a8e2d7ffc2 100644
--- a/docs/system-admin-guide/integrations/gitlab-integration/README.md
+++ b/docs/system-admin-guide/integrations/gitlab-integration/README.md
@@ -13,7 +13,7 @@ OpenProject offers an integration with GitLab merge requests to link software de
OpenProject work packages will directly display information from GitLab in a separate tab.
-![Gitlab tab in an OpenProject work package](gitlab-tab.png)
+![GitLab tab in an OpenProject work package](gitlab-tab.png)
The tab shows all merge requests (MR) linked to a work package with the corresponding status (e.g. 'Ready' or 'Merged') as well as the state (e.g. 'success' or 'queued') of the GitLab actions configured to run for a MR. MRs and work packages are in an n:m relationship, so a work package can be linked to multiple merge requests and a merge request can be linked to multiple work packages.
@@ -100,7 +100,7 @@ You can now publish your branch (you can also do this later, after making the ch
With the branch opened, you can start the actual development work using your preferred tool to alter your codebase.
-![Gitlab changes in a merge request changes](gitlab-changes.png)
+![GitLab changes in a merge request changes](gitlab-changes.png)
Once you are satisfied with the changes you can create a commit. Within the 'Git snippets' menu, OpenProject suggests a commit message for you based on the title and the URL of the work package.
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/gitlab-changes.png b/docs/system-admin-guide/integrations/gitlab-integration/gitlab-changes.png
index 8864c8dba762..efdd00b8cb1e 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/gitlab-changes.png and b/docs/system-admin-guide/integrations/gitlab-integration/gitlab-changes.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/gitlab-tab.png b/docs/system-admin-guide/integrations/gitlab-integration/gitlab-tab.png
index b811186ef0a0..46f459406766 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/gitlab-tab.png and b/docs/system-admin-guide/integrations/gitlab-integration/gitlab-tab.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-activity-tab.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-activity-tab.png
index 1681730da097..529031251afe 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-activity-tab.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-activity-tab.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-branch-name.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-branch-name.png
index c65d82f32f31..681373ce2d9c 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-branch-name.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-branch-name.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-commit-message-in-client.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-commit-message-in-client.png
index 9bac3fa1390a..f52498d3d488 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-commit-message-in-client.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-commit-message-in-client.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-create-branch.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-create-branch.png
index 462dc662780e..f43910d175f7 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-create-branch.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-create-branch.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-create-mr-detail.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-create-mr-detail.png
index 5d3f49e00246..afb68a3d78cd 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-create-mr-detail.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-create-mr-detail.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-create-mr.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-create-mr.png
index f04bf02f8423..4191b8d03c77 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-create-mr.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-create-mr.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-git-snippets-commit-message.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-git-snippets-commit-message.png
index 45eb212ce119..ffd2762e3842 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-git-snippets-commit-message.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-git-snippets-commit-message.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-git-snippets.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-git-snippets.png
index d78823fb8f9d..2337bf9395fa 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-git-snippets.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-git-snippets.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-gitlab-actions.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-gitlab-actions.png
index e4e51696156b..300a3b5b4b39 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-gitlab-actions.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-gitlab-actions.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-gitlab-issue.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-gitlab-issue.png
index 6ddd7402d8ad..b1dfdeba59ed 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-gitlab-issue.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-gitlab-issue.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-gitlab-webhook.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-gitlab-webhook.png
index a4f751e00a68..df924dc1b4b1 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-gitlab-webhook.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-gitlab-webhook.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-mr-opened.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-mr-opened.png
index 166cc2070e4c..0e12505ea012 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-mr-opened.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-mr-opened.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-mr-status.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-mr-status.png
index c5d95b69a498..f3b2f47d80c1 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-mr-status.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-mr-status.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-new-issues.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-new-issues.png
index b8377598f355..738f4be2aedf 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-new-issues.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-new-issues.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-no-issues.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-no-issues.png
index b822b09415b0..fdb5b565babc 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-no-issues.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-no-issues.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-project-member.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-project-member.png
index 4314b43eec37..3fac0b7a57e7 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-project-member.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-project-member.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-project-modules.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-project-modules.png
index ed4b6aed38ad..f3934ff1cd09 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-project-modules.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-project-modules.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-publish-branch.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-publish-branch.png
index 36326daaa118..d345eed58812 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-publish-branch.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-publish-branch.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-push-activity.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-push-activity.png
index b7cb87b01cdb..662893a605d6 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-push-activity.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-push-activity.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-role.png b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-role.png
index 5228926ea92e..3f2035d8279c 100644
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-role.png and b/docs/system-admin-guide/integrations/gitlab-integration/openproject-system-guide-gitlab-integration-role.png differ
diff --git a/docs/system-admin-guide/integrations/gitlab-integration/workpackage-github-comments.png b/docs/system-admin-guide/integrations/gitlab-integration/workpackage-github-comments.png
deleted file mode 100644
index 833b52931ae6..000000000000
Binary files a/docs/system-admin-guide/integrations/gitlab-integration/workpackage-github-comments.png and /dev/null differ
diff --git a/docs/system-admin-guide/integrations/nextcloud/README.md b/docs/system-admin-guide/integrations/nextcloud/README.md
index aa4ea7617d89..1fc9d5a245a0 100644
--- a/docs/system-admin-guide/integrations/nextcloud/README.md
+++ b/docs/system-admin-guide/integrations/nextcloud/README.md
@@ -348,9 +348,9 @@ You have setup the *Project folder* in both environments (Nextcloud and OpenProj
a. If you have root access to the OpenProject server where your worker should be running, check if the worker processes are in fact present:
`ps aux | grep job`
- The result should show lines containing `bundle exec bundle exec good_job start`
+ The result should show lines containing `bundle exec rake jobs:work`
- b. If you don't have root access to the OpenProject server then you can check the following URL in your browser: `https:///health_checks/all` (please insert the domain name of your OpenProject server). If your background workers are running, you should see a line like that `worker_backed_up: PASSED No jobs are waiting to be picked up.`
+ b. If you don't have root access to the OpenProject server then you can check the following URL in your browser: `https:///health_checks/all` (please insert the domain name of your OpenProject server). If your background workers are running, you should see a line like that `delayed_jobs_never_ran: PASSED All previous jobs have completed within the past 5 minutes`
2. Ensure that your project is setup correctly:
1. In your browser navigate to the project for which you want the **Project folders** feature to be working.
diff --git a/docs/system-admin-guide/integrations/one-drive/openproject_system_guide_new_onedrive_storage_details.png b/docs/system-admin-guide/integrations/one-drive/openproject_system_guide_new_onedrive_storage_details.png
deleted file mode 100644
index e7406bf8eb79..000000000000
Binary files a/docs/system-admin-guide/integrations/one-drive/openproject_system_guide_new_onedrive_storage_details.png and /dev/null differ
diff --git a/docs/system-admin-guide/integrations/one-drive/openproject_system_guide_new_onedrive_storage_details_new.png b/docs/system-admin-guide/integrations/one-drive/openproject_system_guide_new_onedrive_storage_details_new.png
index 9bcd1e54830f..638e0d98fcf9 100644
Binary files a/docs/system-admin-guide/integrations/one-drive/openproject_system_guide_new_onedrive_storage_details_new.png and b/docs/system-admin-guide/integrations/one-drive/openproject_system_guide_new_onedrive_storage_details_new.png differ
diff --git a/docs/user-guide/file-management/README.md b/docs/user-guide/file-management/README.md
index 9283527bd02c..e881b5bce977 100644
--- a/docs/user-guide/file-management/README.md
+++ b/docs/user-guide/file-management/README.md
@@ -12,7 +12,7 @@ keywords: files, attachment, Nextcloud, OneDrive, SharePoint
|--------------------------------------------------------------------------------------|---------------------------------------------------------------------------|
| [Manual upload](#manual-upload) | How to manually upload files to work packages in OpenProject. |
| [Nextcloud integration](#nextcloud-integration) | How to manage files using Nextcloud integration in OpenProject. |
-| [OneDrive/SharePoint integration](#onedrivesharepoint-integration-enterprise-add-on) | How to manage files using OneDrive/Sharepoint integration in OpenProject. |
+| [OneDrive/SharePoint integration](#onedrivesharepoint-integration-enterprise-add-on) | How to manage files using OneDrive/SharePoint integration in OpenProject. |
| [File management FAQs](./file-management-faq) | Frequently asked questions on file management in OpenProject. |
There are several ways of adding or linking files to work packages in OpenProject. You can manually attach files directly to work packages or use one of the integrations with file management systems.
diff --git a/docs/user-guide/file-management/nextcloud-integration/nc-new-work-package-created.png b/docs/user-guide/file-management/nextcloud-integration/nc-new-work-package-created.png
index 062391e426ef..fd34461acbe0 100644
Binary files a/docs/user-guide/file-management/nextcloud-integration/nc-new-work-package-created.png and b/docs/user-guide/file-management/nextcloud-integration/nc-new-work-package-created.png differ
diff --git a/docs/user-guide/file-management/nextcloud-integration/nc_create_new_wp.png b/docs/user-guide/file-management/nextcloud-integration/nc_create_new_wp.png
index a189c134f9a2..d6488081dc00 100644
Binary files a/docs/user-guide/file-management/nextcloud-integration/nc_create_new_wp.png and b/docs/user-guide/file-management/nextcloud-integration/nc_create_new_wp.png differ
diff --git a/docs/user-guide/file-management/nextcloud-integration/nc_select_multiple_files.png b/docs/user-guide/file-management/nextcloud-integration/nc_select_multiple_files.png
index f17bedc2f6d2..c48dce2e9953 100644
Binary files a/docs/user-guide/file-management/nextcloud-integration/nc_select_multiple_files.png and b/docs/user-guide/file-management/nextcloud-integration/nc_select_multiple_files.png differ
diff --git a/docs/user-guide/file-management/nextcloud-integration/nc_select_wp_to_link.png b/docs/user-guide/file-management/nextcloud-integration/nc_select_wp_to_link.png
index d388e701ee9c..9201ad47bb23 100644
Binary files a/docs/user-guide/file-management/nextcloud-integration/nc_select_wp_to_link.png and b/docs/user-guide/file-management/nextcloud-integration/nc_select_wp_to_link.png differ
diff --git a/docs/user-guide/file-management/one-drive-integration/README.md b/docs/user-guide/file-management/one-drive-integration/README.md
index 9b29dce4242e..8344e260a66b 100644
--- a/docs/user-guide/file-management/one-drive-integration/README.md
+++ b/docs/user-guide/file-management/one-drive-integration/README.md
@@ -33,7 +33,7 @@ To begin using this integration, you will need to first connect your OpenProject
1. Select any work package. Go to the **Files tab** and, within the correct file storage section, click on **Storage login** button.
- ![Login to Sharepoint storage from an OpenProject work package](openproject_onedrive_login_to_storage.png)
+ ![Login to SharePoint storage from an OpenProject work package](openproject_onedrive_login_to_storage.png)
2. You will see a Microsoft login prompt asking you to log in. Enter your credentials and log in.
3. Once you have logged in, you will automatically return to the work package in OpenProject and see that you can now start uploading and linking files.
@@ -71,7 +71,7 @@ Once you have selected or dropped the files you would like to upload, you will n
> **Info**: The default location that opens in the file picker is the file root of the configured OneDrive/SharePoint drive.
-![Selection a Sharepoint location to upload a file from OpenProject](openproject_onedrive_select_location.png)
+![Selection a SharePoint location to upload a file from OpenProject](openproject_onedrive_select_location.png)
You can click on folders you see to navigate to them. Helpful breadcrumbs show you where you are in the folder hierarchy.
@@ -83,7 +83,7 @@ To save the files you uploaded to the currently open folder, click on the **Choo
The selected file is uploaded to your OneDrive/SharePoint instance and linked to the current work package. It appears under the name of the file storage.
-![File successfully uploaded to Sharepoint storage](openproject_onedrive_file_uploaded.png)
+![File successfully uploaded to SharePoint storage](openproject_onedrive_file_uploaded.png)
If a file has been deleted on the OneDrive/SharePoint file storage it will still be displayed under the **Files** tab. However it will not be selectable. If you hover over a deleted file you will see the message indicating that the file could not be found.
@@ -95,7 +95,7 @@ If a file has been deleted on the OneDrive/SharePoint file storage it will still
If you wish to unlink any linked file or folder, hover it in the list of linked files and click on the **Unlink** icon.
-![Unlink a linked Sharepoint file from an OpenProject work package](openproject_onedrive_download_file.png)
+![Unlink a linked SharePoint file from an OpenProject work package](openproject_onedrive_download_file.png)
Respectively in order to download a file, click on the **Download icon** in the context menu of the file link in the list of the linked files.
diff --git a/docs/user-guide/gantt-chart/activate-gantt.gif b/docs/user-guide/gantt-chart/activate-gantt.gif
deleted file mode 100644
index f7fb2ff6de7d..000000000000
Binary files a/docs/user-guide/gantt-chart/activate-gantt.gif and /dev/null differ
diff --git a/docs/user-guide/gantt-chart/collapse-all-expand-all.png b/docs/user-guide/gantt-chart/collapse-all-expand-all.png
deleted file mode 100644
index 1503ea060e78..000000000000
Binary files a/docs/user-guide/gantt-chart/collapse-all-expand-all.png and /dev/null differ
diff --git a/docs/user-guide/gantt-chart/dependencies-gantt-chart-1566556144225.gif b/docs/user-guide/gantt-chart/dependencies-gantt-chart-1566556144225.gif
deleted file mode 100644
index 4cfedbe4a203..000000000000
Binary files a/docs/user-guide/gantt-chart/dependencies-gantt-chart-1566556144225.gif and /dev/null differ
diff --git a/docs/user-guide/gantt-chart/image-20201211020748715.png b/docs/user-guide/gantt-chart/image-20201211020748715.png
deleted file mode 100644
index 1df2323bbb2d..000000000000
Binary files a/docs/user-guide/gantt-chart/image-20201211020748715.png and /dev/null differ
diff --git a/docs/user-guide/gantt-chart/image-20201211131511543.png b/docs/user-guide/gantt-chart/image-20201211131511543.png
deleted file mode 100644
index cf520a70c35b..000000000000
Binary files a/docs/user-guide/gantt-chart/image-20201211131511543.png and /dev/null differ
diff --git a/docs/user-guide/gantt-chart/openproject-user-guide-configure-gantt-chart.gif b/docs/user-guide/gantt-chart/openproject-user-guide-configure-gantt-chart.gif
index db5c44f302fd..52e101ff55a6 100644
Binary files a/docs/user-guide/gantt-chart/openproject-user-guide-configure-gantt-chart.gif and b/docs/user-guide/gantt-chart/openproject-user-guide-configure-gantt-chart.gif differ
diff --git a/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-auto-zoom.png b/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-auto-zoom.png
index ee499cca076d..9da602392d06 100644
Binary files a/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-auto-zoom.png and b/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-auto-zoom.png differ
diff --git a/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-collapse-all.png b/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-collapse-all.png
index 4b623faf9385..a218c8a38254 100644
Binary files a/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-collapse-all.png and b/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-collapse-all.png differ
diff --git a/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-filters.png b/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-filters.png
index f9ecfeb53596..14df5d466014 100644
Binary files a/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-filters.png and b/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-filters.png differ
diff --git a/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-views.png b/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-views.png
index d9de4df0a85f..e6617ee79d79 100644
Binary files a/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-views.png and b/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-views.png differ
diff --git a/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-zen-mode.png b/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-zen-mode.png
index 50ac0cbdf8d2..d4f2209c0735 100644
Binary files a/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-zen-mode.png and b/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-zen-mode.png differ
diff --git a/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-zoom.png b/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-zoom.png
index 8419fbf6fd25..b6e2991edbc1 100644
Binary files a/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-zoom.png and b/docs/user-guide/gantt-chart/openproject-user-guide-gantt-charts-zoom.png differ
diff --git a/docs/user-guide/gantt-chart/openproject-user-guide-select-gantt-charts-global.png b/docs/user-guide/gantt-chart/openproject-user-guide-select-gantt-charts-global.png
index 3800c47c724a..d24e3625f174 100644
Binary files a/docs/user-guide/gantt-chart/openproject-user-guide-select-gantt-charts-global.png and b/docs/user-guide/gantt-chart/openproject-user-guide-select-gantt-charts-global.png differ
diff --git a/docs/user-guide/gantt-chart/openproject-user-guide-select-gantt-charts.png b/docs/user-guide/gantt-chart/openproject-user-guide-select-gantt-charts.png
index f8706ea066eb..0d13b508bbeb 100644
Binary files a/docs/user-guide/gantt-chart/openproject-user-guide-select-gantt-charts.png and b/docs/user-guide/gantt-chart/openproject-user-guide-select-gantt-charts.png differ
diff --git a/docs/user-guide/home/global-modules/open_project_user_guide_global_modules_menu.png b/docs/user-guide/home/global-modules/open_project_user_guide_global_modules_menu.png
index 67359ff634b1..acdf764350e2 100644
Binary files a/docs/user-guide/home/global-modules/open_project_user_guide_global_modules_menu.png and b/docs/user-guide/home/global-modules/open_project_user_guide_global_modules_menu.png differ
diff --git a/docs/user-guide/home/global-modules/open_project_user_guide_global_modules_menu_grid_icon.png b/docs/user-guide/home/global-modules/open_project_user_guide_global_modules_menu_grid_icon.png
index 6b84f69164dc..917c54463bd4 100644
Binary files a/docs/user-guide/home/global-modules/open_project_user_guide_global_modules_menu_grid_icon.png and b/docs/user-guide/home/global-modules/open_project_user_guide_global_modules_menu_grid_icon.png differ
diff --git a/docs/user-guide/home/global-modules/openproject_global_modules_boards.png b/docs/user-guide/home/global-modules/openproject_global_modules_boards.png
index 224ef34f1153..9aa013f6258c 100644
Binary files a/docs/user-guide/home/global-modules/openproject_global_modules_boards.png and b/docs/user-guide/home/global-modules/openproject_global_modules_boards.png differ
diff --git a/docs/user-guide/home/global-modules/openproject_global_modules_calendars.png b/docs/user-guide/home/global-modules/openproject_global_modules_calendars.png
index 413c8b7c868f..f2241a4086db 100644
Binary files a/docs/user-guide/home/global-modules/openproject_global_modules_calendars.png and b/docs/user-guide/home/global-modules/openproject_global_modules_calendars.png differ
diff --git a/docs/user-guide/home/global-modules/openproject_global_modules_gantt_charts.png b/docs/user-guide/home/global-modules/openproject_global_modules_gantt_charts.png
index 310caf1e652a..2f8ea9291e52 100644
Binary files a/docs/user-guide/home/global-modules/openproject_global_modules_gantt_charts.png and b/docs/user-guide/home/global-modules/openproject_global_modules_gantt_charts.png differ
diff --git a/docs/user-guide/home/global-modules/openproject_global_modules_myprojects_filter.png b/docs/user-guide/home/global-modules/openproject_global_modules_myprojects_filter.png
deleted file mode 100644
index 5314ccf0b749..000000000000
Binary files a/docs/user-guide/home/global-modules/openproject_global_modules_myprojects_filter.png and /dev/null differ
diff --git a/docs/user-guide/home/global-modules/openproject_global_modules_news.png b/docs/user-guide/home/global-modules/openproject_global_modules_news.png
index c94eecab8fbc..11a381d68e0f 100644
Binary files a/docs/user-guide/home/global-modules/openproject_global_modules_news.png and b/docs/user-guide/home/global-modules/openproject_global_modules_news.png differ
diff --git a/docs/user-guide/home/global-modules/openproject_global_modules_projects.png b/docs/user-guide/home/global-modules/openproject_global_modules_projects.png
index 453183be86f5..4e395fb51f78 100644
Binary files a/docs/user-guide/home/global-modules/openproject_global_modules_projects.png and b/docs/user-guide/home/global-modules/openproject_global_modules_projects.png differ
diff --git a/docs/user-guide/home/global-modules/openproject_global_modules_team_planner.png b/docs/user-guide/home/global-modules/openproject_global_modules_team_planner.png
index 7874b02d1b33..325b08e038b1 100644
Binary files a/docs/user-guide/home/global-modules/openproject_global_modules_team_planner.png and b/docs/user-guide/home/global-modules/openproject_global_modules_team_planner.png differ
diff --git a/docs/user-guide/home/openproject_user_guide_home_page.png b/docs/user-guide/home/openproject_user_guide_home_page.png
index 000650c687da..a8da1232609e 100644
Binary files a/docs/user-guide/home/openproject_user_guide_home_page.png and b/docs/user-guide/home/openproject_user_guide_home_page.png differ
diff --git a/docs/user-guide/meetings/classic-meetings/copy-meeting.png b/docs/user-guide/meetings/classic-meetings/copy-meeting.png
index 210c72a613d0..4c0c2432faa4 100644
Binary files a/docs/user-guide/meetings/classic-meetings/copy-meeting.png and b/docs/user-guide/meetings/classic-meetings/copy-meeting.png differ
diff --git a/docs/user-guide/meetings/classic-meetings/create-new-classic-meeting.png b/docs/user-guide/meetings/classic-meetings/create-new-classic-meeting.png
index afc12ea56009..60f43708da40 100644
Binary files a/docs/user-guide/meetings/classic-meetings/create-new-classic-meeting.png and b/docs/user-guide/meetings/classic-meetings/create-new-classic-meeting.png differ
diff --git a/docs/user-guide/meetings/classic-meetings/delete-meeting.png b/docs/user-guide/meetings/classic-meetings/delete-meeting.png
index 28875a5a8334..d4806a22dead 100644
Binary files a/docs/user-guide/meetings/classic-meetings/delete-meeting.png and b/docs/user-guide/meetings/classic-meetings/delete-meeting.png differ
diff --git a/docs/user-guide/meetings/classic-meetings/download-a-meeting.png b/docs/user-guide/meetings/classic-meetings/download-a-meeting.png
index 585a7417d634..a35f86043491 100644
Binary files a/docs/user-guide/meetings/classic-meetings/download-a-meeting.png and b/docs/user-guide/meetings/classic-meetings/download-a-meeting.png differ
diff --git a/docs/user-guide/meetings/classic-meetings/edit-meeting-agenda.png b/docs/user-guide/meetings/classic-meetings/edit-meeting-agenda.png
index 8985994db0a8..b16c132d2f07 100644
Binary files a/docs/user-guide/meetings/classic-meetings/edit-meeting-agenda.png and b/docs/user-guide/meetings/classic-meetings/edit-meeting-agenda.png differ
diff --git a/docs/user-guide/meetings/classic-meetings/edit-meeting.png b/docs/user-guide/meetings/classic-meetings/edit-meeting.png
index a337bbe740f6..94b50695f163 100644
Binary files a/docs/user-guide/meetings/classic-meetings/edit-meeting.png and b/docs/user-guide/meetings/classic-meetings/edit-meeting.png differ
diff --git a/docs/user-guide/meetings/classic-meetings/edit-minutes.png b/docs/user-guide/meetings/classic-meetings/edit-minutes.png
index 34cfc122a7fa..dafb27a6b89c 100644
Binary files a/docs/user-guide/meetings/classic-meetings/edit-minutes.png and b/docs/user-guide/meetings/classic-meetings/edit-minutes.png differ
diff --git a/docs/user-guide/meetings/classic-meetings/meeting-participants.png b/docs/user-guide/meetings/classic-meetings/meeting-participants.png
index 24832bd7a1d1..59eaaf0f77c4 100644
Binary files a/docs/user-guide/meetings/classic-meetings/meeting-participants.png and b/docs/user-guide/meetings/classic-meetings/meeting-participants.png differ
diff --git a/docs/user-guide/meetings/classic-meetings/meetings.png b/docs/user-guide/meetings/classic-meetings/meetings.png
index eae8071876cc..797bef102d9d 100644
Binary files a/docs/user-guide/meetings/classic-meetings/meetings.png and b/docs/user-guide/meetings/classic-meetings/meetings.png differ
diff --git a/docs/user-guide/meetings/classic-meetings/send-email-to-participants.png b/docs/user-guide/meetings/classic-meetings/send-email-to-participants.png
index 1ee9736e329d..c853a095234b 100644
Binary files a/docs/user-guide/meetings/classic-meetings/send-email-to-participants.png and b/docs/user-guide/meetings/classic-meetings/send-email-to-participants.png differ
diff --git a/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_copy_meeting.png b/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_copy_meeting.png
index 5caa45d31422..20287abc5bce 100644
Binary files a/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_copy_meeting.png and b/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_copy_meeting.png differ
diff --git a/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_copy_meeting_details.png b/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_copy_meeting_details.png
index a7c2620e650f..48991f2d121b 100644
Binary files a/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_copy_meeting_details.png and b/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_copy_meeting_details.png differ
diff --git a/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_delete_meeting.png b/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_delete_meeting.png
index 4d8b64a91135..e9ee987262d3 100644
Binary files a/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_delete_meeting.png and b/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_delete_meeting.png differ
diff --git a/docs/user-guide/meetings/dynamic-meetings/openproject_userguid_dynamic_meeting_edit_title.png b/docs/user-guide/meetings/dynamic-meetings/openproject_userguid_dynamic_meeting_edit_title.png
index ad9ad398bf2c..469cd761baa6 100644
Binary files a/docs/user-guide/meetings/dynamic-meetings/openproject_userguid_dynamic_meeting_edit_title.png and b/docs/user-guide/meetings/dynamic-meetings/openproject_userguid_dynamic_meeting_edit_title.png differ
diff --git a/docs/user-guide/projects/delete-a-project.png b/docs/user-guide/projects/delete-a-project.png
index ba6a37d14f34..0f93a047fb5c 100644
Binary files a/docs/user-guide/projects/delete-a-project.png and b/docs/user-guide/projects/delete-a-project.png differ
diff --git a/docs/user-guide/projects/new-subproject-project-list.png b/docs/user-guide/projects/new-subproject-project-list.png
deleted file mode 100644
index aa02969491a0..000000000000
Binary files a/docs/user-guide/projects/new-subproject-project-list.png and /dev/null differ
diff --git a/docs/user-guide/projects/project-information-copy-project.png b/docs/user-guide/projects/project-information-copy-project.png
index f7e0b1b60bd1..8e0854525fa2 100644
Binary files a/docs/user-guide/projects/project-information-copy-project.png and b/docs/user-guide/projects/project-information-copy-project.png differ
diff --git a/docs/user-guide/projects/project-list-filter.png b/docs/user-guide/projects/project-list-filter.png
index 816ec641625b..3f782e95d2c5 100644
Binary files a/docs/user-guide/projects/project-list-filter.png and b/docs/user-guide/projects/project-list-filter.png differ
diff --git a/docs/user-guide/projects/project-lists/Filter-projects-list.png b/docs/user-guide/projects/project-lists/Filter-projects-list.png
deleted file mode 100644
index 10151c4d2ed3..000000000000
Binary files a/docs/user-guide/projects/project-lists/Filter-projects-list.png and /dev/null differ
diff --git a/docs/user-guide/projects/project-lists/Name-private-projects-filter.png b/docs/user-guide/projects/project-lists/Name-private-projects-filter.png
index 6e3e89e4479c..0b228bf09c86 100644
Binary files a/docs/user-guide/projects/project-lists/Name-private-projects-filter.png and b/docs/user-guide/projects/project-lists/Name-private-projects-filter.png differ
diff --git a/docs/user-guide/projects/project-lists/Project-list-button.png b/docs/user-guide/projects/project-lists/Project-list-button.png
index 120e2c05128b..0c285f387e0c 100644
Binary files a/docs/user-guide/projects/project-lists/Project-list-button.png and b/docs/user-guide/projects/project-lists/Project-list-button.png differ
diff --git a/docs/user-guide/projects/project-lists/activity-global-menu.png b/docs/user-guide/projects/project-lists/activity-global-menu.png
index 8bbec85ab6a0..cb5e36fae9ee 100644
Binary files a/docs/user-guide/projects/project-lists/activity-global-menu.png and b/docs/user-guide/projects/project-lists/activity-global-menu.png differ
diff --git a/docs/user-guide/projects/project-lists/actvity-global-filter.png b/docs/user-guide/projects/project-lists/actvity-global-filter.png
index acec7c885314..78fa94d6291e 100644
Binary files a/docs/user-guide/projects/project-lists/actvity-global-filter.png and b/docs/user-guide/projects/project-lists/actvity-global-filter.png differ
diff --git a/docs/user-guide/projects/project-lists/arrow-project-description.png b/docs/user-guide/projects/project-lists/arrow-project-description.png
deleted file mode 100644
index 8ab28ed52d19..000000000000
Binary files a/docs/user-guide/projects/project-lists/arrow-project-description.png and /dev/null differ
diff --git a/docs/user-guide/projects/project-lists/configure-project-list.png b/docs/user-guide/projects/project-lists/configure-project-list.png
deleted file mode 100644
index 4f4a6f2d41e5..000000000000
Binary files a/docs/user-guide/projects/project-lists/configure-project-list.png and /dev/null differ
diff --git a/docs/user-guide/projects/project-lists/configure-view-form-project-list.png b/docs/user-guide/projects/project-lists/configure-view-form-project-list.png
index 3240d3b13de2..4ecd9566bca4 100644
Binary files a/docs/user-guide/projects/project-lists/configure-view-form-project-list.png and b/docs/user-guide/projects/project-lists/configure-view-form-project-list.png differ
diff --git a/docs/user-guide/projects/project-lists/configure-view-project-list.png b/docs/user-guide/projects/project-lists/configure-view-project-list.png
index 8ffa1b67f883..5ae98e35a78e 100644
Binary files a/docs/user-guide/projects/project-lists/configure-view-project-list.png and b/docs/user-guide/projects/project-lists/configure-view-project-list.png differ
diff --git a/docs/user-guide/projects/project-lists/display-all-workpackages.png b/docs/user-guide/projects/project-lists/display-all-workpackages.png
index b7beb129d259..8c42a507e028 100644
Binary files a/docs/user-guide/projects/project-lists/display-all-workpackages.png and b/docs/user-guide/projects/project-lists/display-all-workpackages.png differ
diff --git a/docs/user-guide/projects/project-lists/expand-link-project-description.png b/docs/user-guide/projects/project-lists/expand-link-project-description.png
index e59f128607bd..f27246010edb 100644
Binary files a/docs/user-guide/projects/project-lists/expand-link-project-description.png and b/docs/user-guide/projects/project-lists/expand-link-project-description.png differ
diff --git a/docs/user-guide/projects/project-lists/export-project-list-formats.png b/docs/user-guide/projects/project-lists/export-project-list-formats.png
index 3163ac310963..4f244ce916a3 100644
Binary files a/docs/user-guide/projects/project-lists/export-project-list-formats.png and b/docs/user-guide/projects/project-lists/export-project-list-formats.png differ
diff --git a/docs/user-guide/projects/project-lists/export-projects.png b/docs/user-guide/projects/project-lists/export-projects.png
index 16349d1031c3..c0c677e9d448 100644
Binary files a/docs/user-guide/projects/project-lists/export-projects.png and b/docs/user-guide/projects/project-lists/export-projects.png differ
diff --git a/docs/user-guide/projects/project-lists/navigation-bar-modules-3923134.png b/docs/user-guide/projects/project-lists/navigation-bar-modules-3923134.png
deleted file mode 100644
index 2ff03580934e..000000000000
Binary files a/docs/user-guide/projects/project-lists/navigation-bar-modules-3923134.png and /dev/null differ
diff --git a/docs/user-guide/projects/project-lists/navigation-bar-modules.png b/docs/user-guide/projects/project-lists/navigation-bar-modules.png
index 57fd78f478a5..f9b5ee2803da 100644
Binary files a/docs/user-guide/projects/project-lists/navigation-bar-modules.png and b/docs/user-guide/projects/project-lists/navigation-bar-modules.png differ
diff --git a/docs/user-guide/projects/project-lists/new-subproject-project-list.png b/docs/user-guide/projects/project-lists/new-subproject-project-list.png
index b0c06a445ed9..c1073b77af99 100644
Binary files a/docs/user-guide/projects/project-lists/new-subproject-project-list.png and b/docs/user-guide/projects/project-lists/new-subproject-project-list.png differ
diff --git a/docs/user-guide/projects/project-lists/overall-activity-button-3922893.png b/docs/user-guide/projects/project-lists/overall-activity-button-3922893.png
deleted file mode 100644
index cb059ccf32f5..000000000000
Binary files a/docs/user-guide/projects/project-lists/overall-activity-button-3922893.png and /dev/null differ
diff --git a/docs/user-guide/projects/project-lists/overall-activity-link.png b/docs/user-guide/projects/project-lists/overall-activity-link.png
index e4c8660ac84b..68103544d329 100644
Binary files a/docs/user-guide/projects/project-lists/overall-activity-link.png and b/docs/user-guide/projects/project-lists/overall-activity-link.png differ
diff --git a/docs/user-guide/projects/project-lists/overall-activity-meeting-filter.png b/docs/user-guide/projects/project-lists/overall-activity-meeting-filter.png
deleted file mode 100644
index d18c70cd455f..000000000000
Binary files a/docs/user-guide/projects/project-lists/overall-activity-meeting-filter.png and /dev/null differ
diff --git a/docs/user-guide/projects/project-lists/private-project-filter-delete.png b/docs/user-guide/projects/project-lists/private-project-filter-delete.png
index 8763b6a4c66c..5b1cefbd20fd 100644
Binary files a/docs/user-guide/projects/project-lists/private-project-filter-delete.png and b/docs/user-guide/projects/project-lists/private-project-filter-delete.png differ
diff --git a/docs/user-guide/projects/project-lists/private-project-filter-saved.png b/docs/user-guide/projects/project-lists/private-project-filter-saved.png
index b4f949284f5e..15e319e7e77e 100644
Binary files a/docs/user-guide/projects/project-lists/private-project-filter-saved.png and b/docs/user-guide/projects/project-lists/private-project-filter-saved.png differ
diff --git a/docs/user-guide/projects/project-lists/projects-list.png b/docs/user-guide/projects/project-lists/projects-list.png
index b1d14b79350e..7cdbfc27e201 100644
Binary files a/docs/user-guide/projects/project-lists/projects-list.png and b/docs/user-guide/projects/project-lists/projects-list.png differ
diff --git a/docs/user-guide/projects/project-lists/projects-lists-default-filters.png b/docs/user-guide/projects/project-lists/projects-lists-default-filters.png
index 2410bc230453..cba9c9942f6e 100644
Binary files a/docs/user-guide/projects/project-lists/projects-lists-default-filters.png and b/docs/user-guide/projects/project-lists/projects-lists-default-filters.png differ
diff --git a/docs/user-guide/projects/project-lists/save-button-filtered-view.png b/docs/user-guide/projects/project-lists/save-button-filtered-view.png
index d796ab07e08d..40811989537c 100644
Binary files a/docs/user-guide/projects/project-lists/save-button-filtered-view.png and b/docs/user-guide/projects/project-lists/save-button-filtered-view.png differ
diff --git a/docs/user-guide/projects/project-lists/view_all_projects_options.png b/docs/user-guide/projects/project-lists/view_all_projects_options.png
index 5ed573792fa8..42982648ded4 100644
Binary files a/docs/user-guide/projects/project-lists/view_all_projects_options.png and b/docs/user-guide/projects/project-lists/view_all_projects_options.png differ
diff --git a/docs/user-guide/projects/project-settigns-copy-project.png b/docs/user-guide/projects/project-settigns-copy-project.png
index 5aebfc01053f..2f8d85fe6ca2 100644
Binary files a/docs/user-guide/projects/project-settigns-copy-project.png and b/docs/user-guide/projects/project-settigns-copy-project.png differ
diff --git a/docs/user-guide/projects/project-settings-archive-project.png b/docs/user-guide/projects/project-settings-archive-project.png
index f7322de982de..4a6037380830 100644
Binary files a/docs/user-guide/projects/project-settings-archive-project.png and b/docs/user-guide/projects/project-settings-archive-project.png differ
diff --git a/docs/user-guide/projects/project-settings-copy-project-advanced-settings.png b/docs/user-guide/projects/project-settings-copy-project-advanced-settings.png
index 08d631c46d0a..1b73a9f43e00 100644
Binary files a/docs/user-guide/projects/project-settings-copy-project-advanced-settings.png and b/docs/user-guide/projects/project-settings-copy-project-advanced-settings.png differ
diff --git a/docs/user-guide/projects/project-settings-information-change-hierarchy.png b/docs/user-guide/projects/project-settings-information-change-hierarchy.png
index 589d9765b4f1..99c411f6261d 100644
Binary files a/docs/user-guide/projects/project-settings-information-change-hierarchy.png and b/docs/user-guide/projects/project-settings-information-change-hierarchy.png differ
diff --git a/docs/user-guide/projects/project-settings-information-copy-project-copy-options.png b/docs/user-guide/projects/project-settings-information-copy-project-copy-options.png
deleted file mode 100644
index 8a58e027a654..000000000000
Binary files a/docs/user-guide/projects/project-settings-information-copy-project-copy-options.png and /dev/null differ
diff --git a/docs/user-guide/projects/project-settings-subproject.png b/docs/user-guide/projects/project-settings-subproject.png
index 99853c293f10..26a4b244ae85 100644
Binary files a/docs/user-guide/projects/project-settings-subproject.png and b/docs/user-guide/projects/project-settings-subproject.png differ
diff --git a/docs/user-guide/projects/project-settings/file-storages/file-storages-oauth-nudge-nextcloud.png b/docs/user-guide/projects/project-settings/file-storages/file-storages-oauth-nudge-nextcloud.png
index 80a6224cb596..f46a9aaaa19e 100644
Binary files a/docs/user-guide/projects/project-settings/file-storages/file-storages-oauth-nudge-nextcloud.png and b/docs/user-guide/projects/project-settings/file-storages/file-storages-oauth-nudge-nextcloud.png differ
diff --git a/docs/user-guide/projects/project-settings/file-storages/onedrive-storage-add-folders-new.png b/docs/user-guide/projects/project-settings/file-storages/onedrive-storage-add-folders-new.png
index b6389a000168..30af3f740147 100644
Binary files a/docs/user-guide/projects/project-settings/file-storages/onedrive-storage-add-folders-new.png and b/docs/user-guide/projects/project-settings/file-storages/onedrive-storage-add-folders-new.png differ
diff --git a/docs/user-guide/projects/project-settings/file-storages/onedrive-storage-add-folders.png b/docs/user-guide/projects/project-settings/file-storages/onedrive-storage-add-folders.png
deleted file mode 100644
index 8baecfbfda15..000000000000
Binary files a/docs/user-guide/projects/project-settings/file-storages/onedrive-storage-add-folders.png and /dev/null differ
diff --git a/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-bulk-editing.png b/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-bulk-editing.png
index 9c777429b619..31d1699c57f7 100644
Binary files a/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-bulk-editing.png and b/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-bulk-editing.png differ
diff --git a/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-hierarchy-progress.png b/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-hierarchy-progress.png
index 86d768e55971..af129927740b 100644
Binary files a/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-hierarchy-progress.png and b/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-hierarchy-progress.png differ
diff --git a/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-two-progress-values.png b/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-two-progress-values.png
index 8f706abb987c..70b91d6a87b0 100644
Binary files a/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-two-progress-values.png and b/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-two-progress-values.png differ
diff --git a/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-wp-field-50perc.png b/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-wp-field-50perc.png
index e541f1f9bc74..f20245a3d7a7 100644
Binary files a/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-wp-field-50perc.png and b/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-wp-field-50perc.png differ
diff --git a/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-wp-field-editor.png b/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-wp-field-editor.png
index a8fdcb8cfb3d..25c68ac05f42 100644
Binary files a/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-wp-field-editor.png and b/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-wp-field-editor.png differ
diff --git a/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-wp-field.png b/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-wp-field.png
index b084d798c6a0..2d302453d004 100644
Binary files a/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-wp-field.png and b/docs/user-guide/time-and-costs/progress-tracking/progress-tracking-wp-field.png differ
diff --git a/docs/user-guide/work-packages/share-work-packages/openproject_user_guide_share_button_wp_numbers.png b/docs/user-guide/work-packages/share-work-packages/openproject_user_guide_share_button_wp_numbers.png
index 237585a45f33..b20a3afb5125 100644
Binary files a/docs/user-guide/work-packages/share-work-packages/openproject_user_guide_share_button_wp_numbers.png and b/docs/user-guide/work-packages/share-work-packages/openproject_user_guide_share_button_wp_numbers.png differ
diff --git a/docs/user-guide/work-packages/share-work-packages/openproject_user_guide_shared_with_users_filter.png b/docs/user-guide/work-packages/share-work-packages/openproject_user_guide_shared_with_users_filter.png
deleted file mode 100644
index 603efe926a53..000000000000
Binary files a/docs/user-guide/work-packages/share-work-packages/openproject_user_guide_shared_with_users_filter.png and /dev/null differ
diff --git a/docs/user-guide/work-packages/share-work-packages/openproject_user_guide_shared_with_users_filter_new.png b/docs/user-guide/work-packages/share-work-packages/openproject_user_guide_shared_with_users_filter_new.png
index cd0c5dd20edd..88430a51ccf0 100644
Binary files a/docs/user-guide/work-packages/share-work-packages/openproject_user_guide_shared_with_users_filter_new.png and b/docs/user-guide/work-packages/share-work-packages/openproject_user_guide_shared_with_users_filter_new.png differ
diff --git a/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-package-full-screen-back-arrow.png b/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-package-full-screen-back-arrow.png
index 6e5f10d92d75..ec30bd878af2 100644
Binary files a/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-package-full-screen-back-arrow.png and b/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-package-full-screen-back-arrow.png differ
diff --git a/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-package-table-view.png b/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-package-table-view.png
index 9d15625eeab7..e3fdef54b432 100644
Binary files a/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-package-table-view.png and b/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-package-table-view.png differ
diff --git a/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-package-views.png b/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-package-views.png
index a281987eff86..a8ad0b3db68e 100644
Binary files a/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-package-views.png and b/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-package-views.png differ
diff --git a/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-packages-full-screen-icon.png b/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-packages-full-screen-icon.png
index ae1163344ca4..8681448b84bc 100644
Binary files a/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-packages-full-screen-icon.png and b/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-packages-full-screen-icon.png differ
diff --git a/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-packages-split-screen-icon.png b/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-packages-split-screen-icon.png
index df001234c60f..c8df03be200d 100644
Binary files a/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-packages-split-screen-icon.png and b/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-packages-split-screen-icon.png differ
diff --git a/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-packages-split-screen-view.png b/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-packages-split-screen-view.png
index 1e9412ca951f..17c1577f79f1 100644
Binary files a/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-packages-split-screen-view.png and b/docs/user-guide/work-packages/work-package-views/openproject-user-guide-work-packages-split-screen-view.png differ
diff --git a/docs/user-guide/work-packages/work-package-views/work-package-views-default.png b/docs/user-guide/work-packages/work-package-views/work-package-views-default.png
deleted file mode 100644
index 6886b97771a9..000000000000
Binary files a/docs/user-guide/work-packages/work-package-views/work-package-views-default.png and /dev/null differ
diff --git a/docs/user-guide/work-packages/work-packages-faq/README.md b/docs/user-guide/work-packages/work-packages-faq/README.md
index fa3a7715a8db..5ad656c8c6d3 100644
--- a/docs/user-guide/work-packages/work-packages-faq/README.md
+++ b/docs/user-guide/work-packages/work-packages-faq/README.md
@@ -236,7 +236,7 @@ The following factors can have an impact on the duration of the export:
- Number of columns in the export (less of an impact)
To identify how many background jobs have run or are delayed, enter "/health_checks/full" after the URL (e.g. myopenprojectinstance.com/health_checks/full).
-This provides an overview of "worker_backed_up" which shows the number of background jobs that could not get ran within the last 5 minutes. If there are multiple entries, this can indicate that the number of web workers should be increased.
+This provides an overview of "delayed_jobs_never_ran" which shows the number of background jobs that could not get ran within the last 10 minutes. If there are multiple entries, this can indicate that the number of web workers should be increased.
For a documentation of how to do this, please refer to [these instructions](../../../installation-and-operations/operation/control) (see section "Scaling the number of web workers").
diff --git a/extra/mail_handler/rdm-mailhandler.rb b/extra/mail_handler/rdm-mailhandler.rb
index a40d446ce0e7..80e2cf8ff7d0 100644
--- a/extra/mail_handler/rdm-mailhandler.rb
+++ b/extra/mail_handler/rdm-mailhandler.rb
@@ -77,11 +77,11 @@
# --type bug \\
# --allow-override type,priority
-require "net/http"
-require "net/https"
-require "uri"
-require "getoptlong"
-require "rdoc/usage"
+require 'net/http'
+require 'net/https'
+require 'uri'
+require 'getoptlong'
+require 'rdoc/usage'
module Net
class HTTPS < HTTP
@@ -91,14 +91,14 @@ def self.post_form(url, params, headers)
request.basic_auth url.user, url.password if url.user
request.initialize_http_header(headers)
http = new(url.host, url.port)
- http.use_ssl = (url.scheme == "https")
+ http.use_ssl = (url.scheme == 'https')
http.start { |h| h.request(request) }
end
end
end
class RedmineMailHandler
- VERSION = "0.1"
+ VERSION = '0.1'
attr_accessor :verbose, :issue_attributes, :allow_override, :unknown_user, :no_permission_check, :url, :key
@@ -106,42 +106,42 @@ def initialize
self.issue_attributes = {}
opts = GetoptLong.new(
- ["--help", "-h", GetoptLong::NO_ARGUMENT],
- ["--version", "-V", GetoptLong::NO_ARGUMENT],
- ["--verbose", "-v", GetoptLong::NO_ARGUMENT],
- ["--url", "-u", GetoptLong::REQUIRED_ARGUMENT],
- ["--key", "-k", GetoptLong::REQUIRED_ARGUMENT],
- ["--project", "-p", GetoptLong::REQUIRED_ARGUMENT],
- ["--status", "-s", GetoptLong::REQUIRED_ARGUMENT],
- ["--type", "-t", GetoptLong::REQUIRED_ARGUMENT],
- ["--category", GetoptLong::REQUIRED_ARGUMENT],
- ["--priority", GetoptLong::REQUIRED_ARGUMENT],
- ["--allow-override", "-o", GetoptLong::REQUIRED_ARGUMENT],
- ["--unknown-user", GetoptLong::REQUIRED_ARGUMENT],
- ["--no-permission-check", GetoptLong::NO_ARGUMENT]
+ ['--help', '-h', GetoptLong::NO_ARGUMENT],
+ ['--version', '-V', GetoptLong::NO_ARGUMENT],
+ ['--verbose', '-v', GetoptLong::NO_ARGUMENT],
+ ['--url', '-u', GetoptLong::REQUIRED_ARGUMENT],
+ ['--key', '-k', GetoptLong::REQUIRED_ARGUMENT],
+ ['--project', '-p', GetoptLong::REQUIRED_ARGUMENT],
+ ['--status', '-s', GetoptLong::REQUIRED_ARGUMENT],
+ ['--type', '-t', GetoptLong::REQUIRED_ARGUMENT],
+ ['--category', GetoptLong::REQUIRED_ARGUMENT],
+ ['--priority', GetoptLong::REQUIRED_ARGUMENT],
+ ['--allow-override', '-o', GetoptLong::REQUIRED_ARGUMENT],
+ ['--unknown-user', GetoptLong::REQUIRED_ARGUMENT],
+ ['--no-permission-check', GetoptLong::NO_ARGUMENT]
)
opts.each do |opt, arg|
case opt
- when "--url"
+ when '--url'
self.url = arg.dup
- when "--key"
+ when '--key'
self.key = arg.dup
- when "--help"
+ when '--help'
usage
- when "--verbose"
+ when '--verbose'
self.verbose = true
- when "--version"
+ when '--version'
puts VERSION
exit
- when "--project", "--status", "--type", "--category", "--priority"
- issue_attributes[opt.gsub(%r{^--}, "")] = arg.dup
- when "--allow-override"
+ when '--project', '--status', '--type', '--category', '--priority'
+ issue_attributes[opt.gsub(%r{^--}, '')] = arg.dup
+ when '--allow-override'
self.allow_override = arg.dup
- when "--unknown-user"
+ when '--unknown-user'
self.unknown_user = arg.dup
- when "--no-permission-check"
- self.no_permission_check = "1"
+ when '--no-permission-check'
+ self.no_permission_check = '1'
end
end
@@ -149,14 +149,14 @@ def initialize
end
def submit(email)
- uri = url.gsub(%r{/*\z}, "") + "/mail_handler"
+ uri = url.gsub(%r{/*\z}, '') + '/mail_handler'
- headers = { "User-Agent" => "Redmine mail handler/#{VERSION}" }
+ headers = { 'User-Agent' => "Redmine mail handler/#{VERSION}" }
- data = { "key" => key, "email" => email,
- "allow_override" => allow_override,
- "unknown_user" => unknown_user,
- "no_permission_check" => no_permission_check }
+ data = { 'key' => key, 'email' => email,
+ 'allow_override' => allow_override,
+ 'unknown_user' => unknown_user,
+ 'no_permission_check' => no_permission_check }
issue_attributes.each { |attr, value| data["issue[#{attr}]"] = value }
debug "Posting to #{uri}..."
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 887100db25d8..5cbab641ac6b 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -4586,21 +4586,21 @@
"integrity": "sha512-HWwz+6MrfK5NTWcg9GdKFpMBW/yrAV937oXiw2eDtsd88P3SRwoCt6ZO6QmKp9RP3nDU9cbqmuGZ0xBh0eIFeg=="
},
"node_modules/@primer/css": {
- "version": "21.2.2",
- "resolved": "https://registry.npmjs.org/@primer/css/-/css-21.2.2.tgz",
- "integrity": "sha512-Mcpt9CyajnPW8TJmZYIUhnctdLk7rfsoyvh8w4qDydu2C7HHOHa0wKQjf0zofQ+AyJOIW1Gfa9xvBfwAeNkgoQ==",
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/@primer/css/-/css-21.1.1.tgz",
+ "integrity": "sha512-1XRx8FwWxrr8SSZit2C9KxaofTi0CELKbGmHGpmYQmRIAECIa912Emp4BlAC7iQmf3Tb5oZOkke5zuAt+seDxg==",
"dependencies": {
- "@primer/primitives": "^7.15.12",
- "@primer/view-components": "^0.19.0"
+ "@primer/primitives": "^7.12.0",
+ "@primer/view-components": "^0.14.0"
},
"engines": {
"node": ">=16.0.0"
}
},
"node_modules/@primer/primitives": {
- "version": "7.15.12",
- "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-7.15.12.tgz",
- "integrity": "sha512-ujAsbRB5Xw6rrxizbTgv1bxpraZ091stPMsO6pqGxzc+zIyhrojpGVBuCKJ+RYkpbKK7T4bZzgOT/KyWBAFwwg=="
+ "version": "7.15.5",
+ "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-7.15.5.tgz",
+ "integrity": "sha512-tiJEMxy5hDi9a3YxgrBeJScLPUQSLuWsKDNuoXXiX7zLzejnYdxXXG3qOaNHzNyyn8TkSQkzmKx0ioaSLR2zNw=="
},
"node_modules/@primer/view-components": {
"name": "@openproject/primer-view-components",
@@ -4912,9 +4912,9 @@
"dev": true
},
"node_modules/@types/lodash": {
- "version": "4.17.0",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz",
- "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==",
+ "version": "4.14.202",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz",
+ "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==",
"dev": true
},
"node_modules/@types/mime": {
@@ -8080,9 +8080,9 @@
}
},
"node_modules/core-js": {
- "version": "3.36.1",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz",
- "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==",
+ "version": "3.36.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.0.tgz",
+ "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw==",
"hasInstallScript": true,
"funding": {
"type": "opencollective",
@@ -9801,9 +9801,9 @@
"dev": true
},
"node_modules/eslint-plugin-react": {
- "version": "7.34.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz",
- "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==",
+ "version": "7.34.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz",
+ "integrity": "sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==",
"dev": true,
"dependencies": {
"array-includes": "^3.1.7",
@@ -10776,9 +10776,9 @@
"dev": true
},
"node_modules/follow-redirects": {
- "version": "1.15.6",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
- "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+ "version": "1.15.4",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz",
+ "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==",
"funding": [
{
"type": "individual",
@@ -23899,18 +23899,18 @@
"integrity": "sha512-HWwz+6MrfK5NTWcg9GdKFpMBW/yrAV937oXiw2eDtsd88P3SRwoCt6ZO6QmKp9RP3nDU9cbqmuGZ0xBh0eIFeg=="
},
"@primer/css": {
- "version": "21.2.2",
- "resolved": "https://registry.npmjs.org/@primer/css/-/css-21.2.2.tgz",
- "integrity": "sha512-Mcpt9CyajnPW8TJmZYIUhnctdLk7rfsoyvh8w4qDydu2C7HHOHa0wKQjf0zofQ+AyJOIW1Gfa9xvBfwAeNkgoQ==",
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/@primer/css/-/css-21.1.1.tgz",
+ "integrity": "sha512-1XRx8FwWxrr8SSZit2C9KxaofTi0CELKbGmHGpmYQmRIAECIa912Emp4BlAC7iQmf3Tb5oZOkke5zuAt+seDxg==",
"requires": {
- "@primer/primitives": "^7.15.12",
+ "@primer/primitives": "^7.12.0",
"@primer/view-components": "npm:@openproject/primer-view-components@^0.23.0"
}
},
"@primer/primitives": {
- "version": "7.15.12",
- "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-7.15.12.tgz",
- "integrity": "sha512-ujAsbRB5Xw6rrxizbTgv1bxpraZ091stPMsO6pqGxzc+zIyhrojpGVBuCKJ+RYkpbKK7T4bZzgOT/KyWBAFwwg=="
+ "version": "7.15.5",
+ "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-7.15.5.tgz",
+ "integrity": "sha512-tiJEMxy5hDi9a3YxgrBeJScLPUQSLuWsKDNuoXXiX7zLzejnYdxXXG3qOaNHzNyyn8TkSQkzmKx0ioaSLR2zNw=="
},
"@primer/view-components": {
"version": "npm:@openproject/primer-view-components@0.23.0",
@@ -24194,9 +24194,9 @@
"dev": true
},
"@types/lodash": {
- "version": "4.17.0",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz",
- "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==",
+ "version": "4.14.202",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz",
+ "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==",
"dev": true
},
"@types/mime": {
@@ -26528,9 +26528,9 @@
}
},
"core-js": {
- "version": "3.36.1",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz",
- "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA=="
+ "version": "3.36.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.0.tgz",
+ "integrity": "sha512-mt7+TUBbTFg5+GngsAxeKBTl5/VS0guFeJacYge9OmHb+m058UwwIm41SE9T4Den7ClatV57B6TYTuJ0CX1MAw=="
},
"core-js-compat": {
"version": "3.33.1",
@@ -27996,9 +27996,9 @@
}
},
"eslint-plugin-react": {
- "version": "7.34.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz",
- "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==",
+ "version": "7.34.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz",
+ "integrity": "sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ==",
"dev": true,
"requires": {
"array-includes": "^3.1.7",
@@ -28661,9 +28661,9 @@
"dev": true
},
"follow-redirects": {
- "version": "1.15.6",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
- "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA=="
+ "version": "1.15.4",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz",
+ "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw=="
},
"for-each": {
"version": "0.3.3",
diff --git a/frontend/src/app/core/global_search/input/global-search-input.component.sass b/frontend/src/app/core/global_search/input/global-search-input.component.sass
index 85c46526661e..8a9c67005320 100644
--- a/frontend/src/app/core/global_search/input/global-search-input.component.sass
+++ b/frontend/src/app/core/global_search/input/global-search-input.component.sass
@@ -59,9 +59,6 @@ $search-input-height: 30px
background: transparent
border-color: var(--header-item-font-color) !important
- &:focus-within
- @include spot-focus
-
.ng-arrow-wrapper
display: none
@@ -129,15 +126,19 @@ $search-input-height: 30px
background-color: unset
&:last-child
border-bottom: none
+ &.ng-option-marked
+ color: var(--header-drop-down-item-font-hover-color)
&.ng-option-disabled
display: none
+ &.ng-option-selected
+ color: var(--header-drop-down-item-font-hover-color)
&.-markable
.ng-option
&.ng-option-marked
background-color: var(--drop-down-hover-bg-color)
&.ng-option-selected
- background-color: unset
+ background-color: var(--drop-down-selected-bg-color)
&--input
// Fix position of the spinner
diff --git a/frontend/src/app/core/setup/globals/components/admin/backup.component.html b/frontend/src/app/core/setup/globals/components/admin/backup.component.html
index 669d35fa1816..e5e8a99e8c92 100644
--- a/frontend/src/app/core/setup/globals/components/admin/backup.component.html
+++ b/frontend/src/app/core/setup/globals/components/admin/backup.component.html
@@ -66,7 +66,7 @@