<%= inline_create_link %>
diff --git a/app/components/table_component.rb b/app/components/table_component.rb
index 369f8a9c69c..efe7f01ebd8 100644
--- a/app/components/table_component.rb
+++ b/app/components/table_component.rb
@@ -31,8 +31,22 @@
##
# Abstract view component. Subclass this for a concrete table.
class TableComponent < ApplicationComponent
- def initialize(rows: [], **)
+ include Primer::AttributesHelper
+
+ def initialize(rows: [], table_arguments: {}, **)
super(rows, **)
+
+ @system_arguments = table_arguments
+ @system_arguments[:tag] = :table
+ @system_arguments[:classes] = class_names(
+ @system_arguments[:classes],
+ "generic-table"
+ )
+ @system_arguments[:data] ||= {}
+ @system_arguments[:data] = merge_data(
+ @system_arguments,
+ data: { controller: "table-highlighting" }
+ )
end
class << self
diff --git a/app/controllers/admin/settings/project_custom_fields_controller.rb b/app/controllers/admin/settings/project_custom_fields_controller.rb
index 4e5c6ac031d..75c3460e77e 100644
--- a/app/controllers/admin/settings/project_custom_fields_controller.rb
+++ b/app/controllers/admin/settings/project_custom_fields_controller.rb
@@ -43,7 +43,7 @@ module Admin::Settings
before_action :find_custom_field,
only: %i(show edit project_mappings new_link link unlink update destroy delete_option reorder_alphabetical
move drop role_assignment update_role_assignment role_assignment_preview_dialog
- attribute_help_text update_attribute_help_text)
+ attribute_help_text update_attribute_help_text list_items)
before_action :prepare_custom_option_position, only: %i(update create)
before_action :find_custom_option, only: :delete_option
before_action :project_custom_field_mappings_query, only: %i[project_mappings unlink]
@@ -74,6 +74,8 @@ module Admin::Settings
def edit; end
+ def list_items; end
+
def project_mappings; end
def role_assignment; end
diff --git a/app/controllers/concerns/custom_fields/shared_actions.rb b/app/controllers/concerns/custom_fields/shared_actions.rb
index 625a1e7e369..30d4a7c5e0c 100644
--- a/app/controllers/concerns/custom_fields/shared_actions.rb
+++ b/app/controllers/concerns/custom_fields/shared_actions.rb
@@ -49,6 +49,14 @@ module CustomFields
end
end
+ def list_item_path(custom_field, params = {})
+ if custom_field.type == "ProjectCustomField"
+ list_items_admin_settings_project_custom_field_path(**params)
+ else
+ list_items_custom_field_path(**params)
+ end
+ end
+
def create # rubocop:disable Metrics/AbcSize
call = ::CustomFields::CreateService
.new(user: current_user)
@@ -66,10 +74,14 @@ module CustomFields
end
def update
- perform_update(get_custom_field_params)
+ if custom_options_attributes
+ perform_update(get_custom_field_params, tab: :list_items)
+ else
+ perform_update(get_custom_field_params)
+ end
end
- def perform_update(custom_field_params)
+ def perform_update(custom_field_params, tab: :edit)
call = ::CustomFields::UpdateService
.new(user: current_user, model: @custom_field)
.call(custom_field_params)
@@ -77,7 +89,13 @@ module CustomFields
if call.success?
flash[:notice] = t(:notice_successful_update)
call_hook(:controller_custom_fields_edit_after_save, custom_field: @custom_field)
- redirect_back_or_default(edit_path(@custom_field, id: @custom_field.id))
+ path = if tab == :list_items
+ list_item_path(@custom_field,
+ id: @custom_field.id)
+ else
+ edit_path(@custom_field, id: @custom_field.id)
+ end
+ redirect_to(path)
else
render action: :edit, status: :unprocessable_entity
end
@@ -89,10 +107,10 @@ module CustomFields
.sort_by(&:value)
.each_with_index
.map do |custom_option, index|
- { id: custom_option.id, position: index + 1 }
+ { id: custom_option.id, position: index + 1 }
end
- perform_update(custom_options_attributes: reordered_options)
+ perform_update({ custom_options_attributes: reordered_options }, tab: :list_items)
end
def destroy
@@ -115,7 +133,7 @@ module CustomFields
flash[:error] = @custom_option.errors.full_messages
end
- redirect_to edit_path(@custom_field, id: @custom_field.id), status: :see_other
+ redirect_to list_item_path(@custom_field, id: @custom_field.id), status: :see_other
end
def new_custom_field
@@ -139,14 +157,20 @@ module CustomFields
end
def prepare_custom_option_position
- return unless params[:custom_field][:custom_options_attributes]
+ return unless custom_options_attributes
index = 0
- params[:custom_field][:custom_options_attributes].each_value do |attributes|
+ custom_options_attributes.each_value do |attributes|
attributes[:position] = (index = index + 1)
end
end
+
+ def custom_options_attributes
+ return unless params[:custom_field]
+
+ params[:custom_field][:custom_options_attributes]
+ end
end
end
end
diff --git a/app/controllers/custom_fields_controller.rb b/app/controllers/custom_fields_controller.rb
index 37180bfc507..70bc7741c7d 100644
--- a/app/controllers/custom_fields_controller.rb
+++ b/app/controllers/custom_fields_controller.rb
@@ -31,11 +31,14 @@
class CustomFieldsController < ApplicationController
include CustomFields::SharedActions # share logic with ProjectCustomFieldsControlller
include CustomFields::AttributeHelpTextActions
+
layout "admin"
# rubocop:disable Rails/LexicallyScopedActionFilter
before_action :require_admin
- before_action :find_custom_field, only: %i(edit update destroy delete_option reorder_alphabetical attribute_help_text update_attribute_help_text)
+ before_action :find_custom_field,
+ only: %i(edit update destroy delete_option reorder_alphabetical attribute_help_text update_attribute_help_text
+ list_items)
before_action :prepare_custom_option_position, only: %i(update create)
before_action :find_custom_option, only: :delete_option
before_action :validate_enterprise_token, only: %i(create)
@@ -67,6 +70,8 @@ class CustomFieldsController < ApplicationController
render_attribute_help_text_form
end
+ def list_items; end
+
def update_attribute_help_text
update_help_text
end
diff --git a/app/controllers/work_packages/activities_tab_controller.rb b/app/controllers/work_packages/activities_tab_controller.rb
index 5d92a77a695..d585e4d4379 100644
--- a/app/controllers/work_packages/activities_tab_controller.rb
+++ b/app/controllers/work_packages/activities_tab_controller.rb
@@ -224,11 +224,19 @@ class WorkPackages::ActivitiesTabController < ApplicationController
status: :not_found
)
end
+ # turbo_stream requests (tab is already rendered and an error occured in subsequent requests) are handled below
+ format.turbo_stream do
+ @turbo_status = :not_found
+ render_error_flash_message_via_turbo_stream(message: error_message)
+ render turbo_stream: turbo_streams, status: :not_found
+ end
end
end
def find_journal
- @journal = Journal
+ @journal = @work_package
+ .journals
+ .internal_visible
.with_sequence_version
.find(params[:id])
rescue ActiveRecord::RecordNotFound
diff --git a/app/forms/custom_fields/details_form.rb b/app/forms/custom_fields/details_form.rb
index 44d17c05556..eb37d53f2ee 100644
--- a/app/forms/custom_fields/details_form.rb
+++ b/app/forms/custom_fields/details_form.rb
@@ -60,11 +60,30 @@ module CustomFields
end
end
- if show_multi_value_field?
- details_form.check_box(
- name: :multi_value,
- label: label(:multi_value),
- caption: instructions(:multi_select)
+ if show_min_max_field?
+ details_form.text_field(
+ name: :min_length,
+ type: :number,
+ label: label(:min_length),
+ caption: instructions(:min_max),
+ input_width: :small
+ )
+
+ details_form.text_field(
+ name: :max_length,
+ type: :number,
+ label: label(:max_length),
+ caption: instructions(:min_max),
+ input_width: :small
+ )
+ end
+
+ if show_regex_field?
+ details_form.text_field(
+ name: :regexp,
+ label: label(:regexp),
+ caption: instructions(:regexp),
+ input_width: :medium
)
end
@@ -86,6 +105,37 @@ module CustomFields
)
end
+ if show_default_text_field?
+ details_form.text_field(
+ name: :default_value,
+ label: label(:default_value),
+ input_width: :medium
+ )
+ end
+
+ if show_default_rich_text_field?
+ details_form.rich_text_area(
+ name: :default_value,
+ label: label(:default_value),
+ rich_text_options: { resource: nil, macros: :none }
+ )
+ end
+
+ if show_multi_value_field?
+ details_form.check_box(
+ name: :multi_value,
+ label: label(:multi_value),
+ caption: instructions(:multi_select)
+ )
+ end
+
+ if show_non_open_versions_field?
+ details_form.check_box(
+ name: :allow_non_open_versions,
+ label: label(:allow_non_open_versions)
+ )
+ end
+
if show_is_required_field?
details_form.check_box(
name: :is_required,
@@ -110,6 +160,21 @@ module CustomFields
)
end
+ if show_is_searchable_field?
+ details_form.check_box(
+ name: :searchable,
+ label: label(:searchable),
+ caption: instructions(:searchable)
+ )
+ end
+
+ if show_right_to_left_field?
+ details_form.check_box(
+ name: :content_right_to_left,
+ label: label(:content_right_to_left)
+ )
+ end
+
if show_admin_only_field?
details_form.check_box(
name: :admin_only,
@@ -151,10 +216,30 @@ module CustomFields
%w[bool].include?(model.field_format)
end
+ def show_default_text_field?
+ %w[list bool date text user version hierarchy weighted_item_list calculated_value].exclude?(model.field_format)
+ end
+
+ def show_default_rich_text_field?
+ %w[text].include?(model.field_format)
+ end
+
def show_is_required_field?
%w[calculated_value bool].exclude?(model.field_format)
end
+ def show_min_max_field?
+ %w[list bool date user version link hierarchy weighted_item_list calculated_value].exclude?(model.field_format)
+ end
+
+ def show_regex_field?
+ %w[list bool date user version hierarchy weighted_item_list calculated_value].exclude?(model.field_format)
+ end
+
+ def show_right_to_left_field?
+ model.is_a?(WorkPackageCustomField) && %w[text].include?(model.field_format)
+ end
+
def show_multi_value_field?
model.multi_value_possible?
end
@@ -171,6 +256,15 @@ module CustomFields
model.is_a?(WorkPackageCustomField)
end
+ def show_is_searchable_field?
+ (model.is_a?(WorkPackageCustomField) || model.is_a?(ProjectCustomField)) &&
+ %w[bool date float int user version hierarchy weighted_item_list calculated_value].exclude?(model.field_format)
+ end
+
+ def show_non_open_versions_field?
+ %w[version].include?(model.field_format) && model.allow_non_open_versions_possible?
+ end
+
def show_admin_only_field?
model.is_a?(ProjectCustomField) || model.is_a?(UserCustomField)
end
diff --git a/app/forms/groups/form.rb b/app/forms/groups/form.rb
new file mode 100644
index 00000000000..c63fd9f4b24
--- /dev/null
+++ b/app/forms/groups/form.rb
@@ -0,0 +1,65 @@
+# frozen_string_literal: true
+
+# -- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) 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 Groups
+ class Form < ApplicationForm
+ include CustomFields::CustomFieldRendering
+
+ form do |f|
+ f.text_field(
+ name: :lastname,
+ label: Group.human_attribute_name(:name),
+ required: true,
+ input_width: :medium,
+ autocomplete: "off"
+ )
+
+ render_custom_fields(form: f)
+
+ f.submit(
+ name: :submit,
+ label: submit_label,
+ scheme: :primary
+ )
+ end
+
+ def initialize(submit_label: I18n.t(:button_save))
+ super()
+ @submit_label = submit_label
+ end
+
+ private
+
+ attr_reader :submit_label
+
+ def custom_fields
+ model.available_custom_fields
+ end
+ end
+end
diff --git a/app/forms/versions/form.rb b/app/forms/versions/form.rb
new file mode 100644
index 00000000000..a1b17760550
--- /dev/null
+++ b/app/forms/versions/form.rb
@@ -0,0 +1,205 @@
+# frozen_string_literal: true
+
+# -- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) 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 Versions
+ class Form < ApplicationForm
+ include CustomFields::CustomFieldRendering
+ include VersionsHelper
+ include WikiHelper
+
+ form do |f|
+ f.text_field(
+ name: :name,
+ label: attribute_name(:name),
+ required: true,
+ input_width: :large,
+ autocomplete: :off
+ )
+
+ f.text_field(
+ name: :description,
+ label: attribute_name(:description),
+ input_width: :large
+ )
+
+ f.select_list(
+ name: :status,
+ label: attribute_name(:status),
+ input_width: :xsmall
+ ) do |list|
+ contract.assignable_statuses.each do |s|
+ list.option(
+ label: I18n.t("version_status_#{s}"),
+ value: s,
+ selected: version.status == s
+ )
+ end
+ end
+
+ f.select_list(
+ name: :wiki_page_title,
+ label: I18n.t(:label_wiki_page),
+ include_blank: true,
+ disabled: wiki_pages_disabled?,
+ input_width: :large
+ ) do |list|
+ wiki_page_options_for_select(
+ contract.assignable_wiki_pages.includes(:parent),
+ placeholder: false,
+ ids: false
+ ).each do |label, value|
+ list.option(
+ label:,
+ value:,
+ selected: version.wiki_page_title == value
+ )
+ end
+ end
+
+ f.single_date_picker(
+ name: :start_date,
+ label: attribute_name(:start_date),
+ input_width: :xsmall,
+ leading_visual: { icon: :calendar }
+ )
+
+ f.single_date_picker(
+ name: :effective_date,
+ label: attribute_name(:effective_date),
+ input_width: :xsmall,
+ leading_visual: { icon: :calendar }
+ )
+
+ f.select_list(
+ name: :sharing,
+ label: attribute_name(:sharing),
+ input_width: :small
+ ) do |list|
+ contract.assignable_sharings.each do |v|
+ list.option(
+ label: format_version_sharing(v),
+ value: v,
+ selected: version.sharing == v
+ )
+ end
+ end
+
+ if backlogs_enabled?
+ setting = version_setting_for_project
+
+ f.select_list(
+ name: "version[version_settings_attributes][][display]",
+ scope_name_to_model: false,
+ label: I18n.t(:label_column_in_backlog),
+ input_width: :small
+ ) do |list|
+ position_display_options.each do |label, value|
+ list.option(label:, value:, selected: setting.display == value)
+ end
+ end
+
+ if setting.persisted?
+ f.hidden(
+ name: "version[version_settings_attributes][][id]",
+ value: setting.id,
+ scope_name_to_model: false
+ )
+ end
+ end
+
+ render_custom_fields(form: f)
+
+ f.submit(
+ name: :submit,
+ label: submit_label,
+ scheme: :primary
+ )
+ end
+
+ def initialize(project: nil, submit_label: I18n.t(:button_save))
+ super()
+ @project = project
+ @submit_label = submit_label
+ end
+
+ private
+
+ attr_reader :submit_label, :project
+
+ def version
+ model
+ end
+
+ def contract
+ @contract ||= if version.new_record?
+ Versions::CreateContract.new(version, User.current)
+ else
+ Versions::UpdateContract.new(version, User.current)
+ end
+ end
+
+ def custom_fields
+ version.available_custom_fields
+ end
+
+ def wiki_pages_disabled?
+ contract.assignable_wiki_pages.none?
+ end
+
+ def backlogs_enabled?
+ resolved_project.backlogs_enabled?
+ end
+
+ def resolved_project
+ @project || version.project
+ end
+
+ def version_setting_for_project
+ setting = version.version_settings.detect { |vs| vs.project_id == resolved_project.id || vs.project_id.nil? }
+ setting || version.version_settings.new(display: VersionSetting::DISPLAY_LEFT, project: resolved_project)
+ end
+
+ def position_display_options
+ [VersionSetting::DISPLAY_NONE,
+ VersionSetting::DISPLAY_LEFT,
+ VersionSetting::DISPLAY_RIGHT].map { |s| [humanize_display_option(s), s] }
+ end
+
+ def humanize_display_option(option)
+ case option
+ when VersionSetting::DISPLAY_NONE
+ I18n.t("version_settings_display_option_none")
+ when VersionSetting::DISPLAY_LEFT
+ I18n.t("version_settings_display_option_left")
+ when VersionSetting::DISPLAY_RIGHT
+ I18n.t("version_settings_display_option_right")
+ end
+ end
+ end
+end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 2358957522e..13d7784cf30 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -293,6 +293,7 @@ module ApplicationHelper
controller: "application auto-theme-switcher hover-card-trigger beforeunload external-links highlight-target-element",
relative_url_root: root_path,
overflowing_identifier: ".__overflowing_body",
+ external_links_enabled_value: Setting.capture_external_links?,
rendered_at: Time.zone.now.iso8601,
turbo: local_assigns[:turbo_opt_out] ? "false" : nil
}.merge(user_theme_data_attributes)
diff --git a/app/helpers/versions_helper.rb b/app/helpers/versions_helper.rb
index 0c94655b050..bbe9750bc07 100644
--- a/app/helpers/versions_helper.rb
+++ b/app/helpers/versions_helper.rb
@@ -36,7 +36,7 @@ module VersionsHelper
if grouped.size > 1
grouped_options_for_select(grouped, selected&.id)
else
- options_for_select((grouped.values.first || []), selected&.id)
+ options_for_select(grouped.values.first || [], selected&.id)
end
end
@@ -68,17 +68,9 @@ module VersionsHelper
h(version.to_s_for_project(project))
end
- def version_contract(version)
- if version.new_record?
- Versions::CreateContract.new(version, User.current)
- else
- Versions::UpdateContract.new(version, User.current)
- end
- end
-
def format_version_sharing(sharing)
sharing = "none" unless Version::VERSION_SHARINGS.include?(sharing)
- t("label_version_sharing_#{sharing}")
+ I18n.t("label_version_sharing_#{sharing}")
end
def versions_by_project(versions)
diff --git a/app/helpers/wiki_helper.rb b/app/helpers/wiki_helper.rb
index 0403484fa91..2a46a596149 100644
--- a/app/helpers/wiki_helper.rb
+++ b/app/helpers/wiki_helper.rb
@@ -100,6 +100,6 @@ module WikiHelper
def wiki_page_option(page, level, ids)
indent = level.positive? ? "#{"\u00A0" * level * 2}» " : ""
id = ids ? page.id : page.title
- [indent + h(page.title), id]
+ [indent + page.title, id]
end
end
diff --git a/app/models/custom_field.rb b/app/models/custom_field.rb
index 55b4d5b62e7..9ed29fbb74c 100644
--- a/app/models/custom_field.rb
+++ b/app/models/custom_field.rb
@@ -61,9 +61,6 @@ class CustomField < ApplicationRecord
acts_as_list scope: [:type]
validates :field_format, presence: true
- validates :custom_options,
- presence: { message: ->(*) { I18n.t(:"activerecord.errors.models.custom_field.at_least_one_custom_option") } },
- if: ->(*) { field_format == "list" }
validates :name,
presence: true,
length: { maximum: 256 },
diff --git a/app/views/admin/settings/project_custom_fields/edit.html.erb b/app/views/admin/settings/project_custom_fields/edit.html.erb
index 644f966d3a0..404b332535b 100644
--- a/app/views/admin/settings/project_custom_fields/edit.html.erb
+++ b/app/views/admin/settings/project_custom_fields/edit.html.erb
@@ -38,22 +38,4 @@ See COPYRIGHT and LICENSE files for more details.
)
%>
-<% if CustomFields::DetailsComponent.supported?(@custom_field) %>
- <%= render CustomFields::DetailsComponent.new(@custom_field) %>
-<% else %>
- <%= error_messages_for "custom_field" %>
-
- <% content_controller "admin--custom-fields",
- "admin--custom-fields-format-value": @custom_field.field_format,
- "admin--custom-fields-format-config-value": OpenProject::CustomFieldFormatDependent.stimulus_config %>
-
- <%= labelled_tabular_form_for @custom_field, as: :custom_field,
- url: admin_settings_project_custom_field_path(@custom_field),
- html: { method: :put, id: "custom_field_form" } do |f| %>
- <%= render partial: "custom_fields/form", locals: { f: f, custom_field: @custom_field } %>
- <% if @custom_field.new_record? %>
- <%= hidden_field_tag "type", @custom_field.type %>
- <% end %>
- <%= styled_button_tag t(:button_save), class: "-highlight -with-icon icon-checkmark" %>
- <% end %>
-<% end %>
+<%= render CustomFields::DetailsComponent.new(@custom_field) %>
diff --git a/app/views/admin/settings/project_custom_fields/list_items.html.erb b/app/views/admin/settings/project_custom_fields/list_items.html.erb
new file mode 100644
index 00000000000..6247d928387
--- /dev/null
+++ b/app/views/admin/settings/project_custom_fields/list_items.html.erb
@@ -0,0 +1,76 @@
+<%#-- copyright
+OpenProject is an open source project management software.
+Copyright (C) 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.
+
+++#%>
+
+<% html_title t(:label_administration), t("settings.project_attributes.heading"), @custom_field.name %>
+
+<%=
+ render(
+ Settings::ProjectCustomFields::EditFormHeaderComponent.new(
+ custom_field: @custom_field,
+ selected: :project_custom_field_edit
+ )
+ )
+%>
+
+<%= settings_primer_form_with(
+ model: @custom_field,
+ scope: :custom_field,
+ url: admin_settings_project_custom_field_path(@custom_field),
+ html: { method: :put, id: "custom_field_form" }
+ ) do |f| %>
+ <%= render partial: "custom_fields/custom_options", locals: { custom_field: @custom_field, f: f } %>
+
+ <%=
+ flex_layout(mt: 4) do |flex|
+ flex.with_column do
+ render Primer::Beta::Button.new(
+ scheme: :secondary,
+ tag: :a,
+ href: reorder_alphabetical_admin_settings_project_custom_field_path(@custom_field),
+ data: {
+ turbo_method: :post,
+ turbo_confirm: t("custom_fields.reorder_confirmation")
+ },
+ mr: 2
+ ) do
+ t("custom_fields.reorder_alphabetical")
+ end
+ end
+ flex.with_column do
+ render Primer::Beta::Button.new(
+ scheme: :primary,
+ type: :submit
+ ) do |button|
+ button.with_leading_visual_icon(icon: :check)
+ t(:button_save)
+ end
+ end
+ end
+ %>
+<% end %>
diff --git a/app/views/admin/settings/project_custom_fields/new.html.erb b/app/views/admin/settings/project_custom_fields/new.html.erb
index d36d93794f2..9719b1cced0 100644
--- a/app/views/admin/settings/project_custom_fields/new.html.erb
+++ b/app/views/admin/settings/project_custom_fields/new.html.erb
@@ -31,22 +31,4 @@ See COPYRIGHT and LICENSE files for more details.
<%= render(Settings::ProjectCustomFields::NewFormHeaderComponent.new(@custom_field)) %>
-<% if CustomFields::DetailsComponent.supported?(@custom_field) %>
- <%= render CustomFields::DetailsComponent.new(@custom_field) %>
-<% else %>
- <%= error_messages_for "custom_field" %>
-
- <% content_controller "admin--custom-fields",
- "admin--custom-fields-format-value": @custom_field.field_format,
- "admin--custom-fields-format-config-value": OpenProject::CustomFieldFormatDependent.stimulus_config %>
-
- <%= labelled_tabular_form_for @custom_field, as: :custom_field,
- url: admin_settings_project_custom_fields_path,
- html: { id: "custom_field_form" } do |f| %>
- <%= render partial: "custom_fields/form", locals: { f: f, custom_field: @custom_field } %>
- <% if @custom_field.new_record? %>
- <%= hidden_field_tag "type", @custom_field.type %>
- <% end %>
- <%= styled_button_tag t(:button_save), class: "-highlight -with-icon icon-checkmark" %>
- <% end %>
-<% end %>
+<%= render CustomFields::DetailsComponent.new(@custom_field) %>
diff --git a/app/views/custom_fields/_custom_options.html.erb b/app/views/custom_fields/_custom_options.html.erb
index 4684985f9b5..fa89235fbe6 100644
--- a/app/views/custom_fields/_custom_options.html.erb
+++ b/app/views/custom_fields/_custom_options.html.erb
@@ -26,8 +26,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
See COPYRIGHT and LICENSE files for more details.
++#%>
+<% content_controller "admin--custom-fields",
+ "admin--custom-fields-multi-select-value": @custom_field.multi_value? %>
-<% custom_field = f.object %>
<% custom_field.custom_options.build if custom_field.custom_options.empty? %>
@@ -86,27 +87,25 @@ See COPYRIGHT and LICENSE files for more details.
<%= co_f.hidden_field :id,
- disabled: true,
class: "custom-option-id" %>
- <%= co_f.text_field :value,
- disabled: true,
- container_class: "custom-option-value",
- no_label: true %>
+
+ <%= co_f.text_field :value,
+ no_label: true %>
+
|
-
+ |
<%= co_f.check_box :default_value,
- disabled: true,
container_class: "custom-option-default-value",
data: {
"admin--custom-fields-target": "customOptionDefaults",
- action: "admin--custom-fields#uncheckOtherDefaults"
+ action: "click->admin--custom-fields#uncheckOtherDefaults"
},
no_label: true %>
|
<%= op_icon("icon-context icon-arrow-down2 icon-small") %>
+
+<%=
+ render Primer::Beta::Button.new(
+ scheme: :link,
+ test_selector: "add-custom-option",
+ data: { action: "admin--custom-fields#addOption" },
+ mt: 2
+ ) do |button|
+ button.with_leading_visual_icon(icon: :plus)
+ t(:button_add)
+ end
+%>
diff --git a/app/views/custom_fields/_form.html.erb b/app/views/custom_fields/_form.html.erb
deleted file mode 100644
index bab5ef3c4a8..00000000000
--- a/app/views/custom_fields/_form.html.erb
+++ /dev/null
@@ -1,251 +0,0 @@
-<%# -- copyright
-OpenProject is an open source project management software.
-Copyright (C) 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.
-
-++# %>
-
-<% format_dependent = OpenProject::CustomFieldFormatDependent.new(@custom_field.field_format) %>
-
-
-
-
diff --git a/app/views/custom_fields/edit.html.erb b/app/views/custom_fields/edit.html.erb
index 937e22cd26d..70fbff4a008 100644
--- a/app/views/custom_fields/edit.html.erb
+++ b/app/views/custom_fields/edit.html.erb
@@ -31,20 +31,4 @@ See COPYRIGHT and LICENSE files for more details.
<%= render(Admin::CustomFields::EditFormHeaderComponent.new(custom_field: @custom_field, selected: :edit)) %>
-<% if CustomFields::DetailsComponent.supported?(@custom_field) %>
- <%= render CustomFields::DetailsComponent.new(@custom_field) %>
-<% else %>
- <%= error_messages_for "custom_field" %>
-
- <% content_controller "admin--custom-fields",
- "admin--custom-fields-format-config-value": OpenProject::CustomFieldFormatDependent.stimulus_config,
- "admin--custom-fields-format-value": @custom_field.field_format %>
-
- <%= labelled_tabular_form_for @custom_field,
- as: :custom_field,
- url: custom_field_path(@custom_field),
- html: { method: :put, id: "custom_field_form" } do |f| %>
- <%= render partial: "form", locals: { f: f } %>
- <%= styled_button_tag t(:button_save), class: "-primary -with-icon icon-checkmark" %>
- <% end %>
-<% end %>
+<%= render CustomFields::DetailsComponent.new(@custom_field) %>
diff --git a/app/views/custom_fields/list_items.html.erb b/app/views/custom_fields/list_items.html.erb
new file mode 100644
index 00000000000..14c831b6eb0
--- /dev/null
+++ b/app/views/custom_fields/list_items.html.erb
@@ -0,0 +1,69 @@
+<%#-- copyright
+OpenProject is an open source project management software.
+Copyright (C) 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.
+
+++#%>
+
+<% html_title t(:label_administration), "#{CustomField.model_name.human} #{h @custom_field.name}", t(:label_item_plural) %>
+
+<%= render(Admin::CustomFields::EditFormHeaderComponent.new(custom_field: @custom_field, selected: :items)) %>
+
+<%= settings_primer_form_with(
+ model: @custom_field,
+ scope: :custom_field,
+ url: custom_field_path(@custom_field),
+ html: { id: "custom_field_form" }
+ ) do |f| %>
+ <%= render partial: "custom_fields/custom_options", locals: { custom_field: @custom_field, f: f } %>
+
+ <%=
+ flex_layout(mt: 4) do |flex|
+ flex.with_column do
+ render Primer::Beta::Button.new(
+ scheme: :secondary,
+ tag: :a,
+ href: reorder_alphabetical_custom_field_path(@custom_field),
+ data: {
+ turbo_method: :post,
+ turbo_confirm: t("custom_fields.reorder_confirmation")
+ },
+ mr: 2
+ ) do
+ t("custom_fields.reorder_alphabetical")
+ end
+ end
+ flex.with_column do
+ render Primer::Beta::Button.new(
+ scheme: :primary,
+ type: :submit
+ ) do |button|
+ button.with_leading_visual_icon(icon: :check)
+ t(:button_save)
+ end
+ end
+ end
+ %>
+<% end %>
diff --git a/app/views/custom_fields/new.html.erb b/app/views/custom_fields/new.html.erb
index 47f84a9c93d..e8e3048b24a 100644
--- a/app/views/custom_fields/new.html.erb
+++ b/app/views/custom_fields/new.html.erb
@@ -45,26 +45,4 @@ See COPYRIGHT and LICENSE files for more details.
end
%>
-<% if CustomFields::DetailsComponent.supported?(@custom_field) %>
- <%= render CustomFields::DetailsComponent.new(@custom_field) %>
-<% else %>
- <%= error_messages_for "custom_field" %>
-
- <% content_controller "admin--custom-fields",
- "admin--custom-fields-format-config-value": OpenProject::CustomFieldFormatDependent.stimulus_config,
- "admin--custom-fields-format-value": @custom_field.field_format,
- "admin--custom-fields-hierarchy-enabled-value": EnterpriseToken.allows_to?(:custom_field_hierarchies) %>
-
- <%= labelled_tabular_form_for @custom_field,
- as: :custom_field,
- url: custom_fields_path,
- html: { id: "custom_field_form", class: "-wide-labels" } do |f| %>
- <%= render partial: "form", locals: { f: f } %>
- <%= hidden_field_tag "type", @custom_field.type %>
- <%= styled_button_tag t(:button_save),
- class: "-primary -with-icon icon-checkmark",
- data: {
- "admin--custom-fields-target": "submitButton"
- } %>
- <% end %>
-<% end %>
+<%= render CustomFields::DetailsComponent.new(@custom_field) %>
diff --git a/app/views/groups/_general.html.erb b/app/views/groups/_general.html.erb
index d6387e18b5e..30252135ca5 100644
--- a/app/views/groups/_general.html.erb
+++ b/app/views/groups/_general.html.erb
@@ -27,7 +27,8 @@ See COPYRIGHT and LICENSE files for more details.
++#%>
-<%= labelled_tabular_form_for @group, url: group_path(@group), html: { method: :put }, as: :group do |f| %>
- <%= render partial: "form", locals: { f: f } %>
- <%= styled_button_tag t(:button_save), class: "-primary -with-icon icon-checkmark" %>
-<% end %>
+<%=
+ settings_primer_form_with(model: @group, url: group_path(@group), method: :put) do |f|
+ render Groups::Form.new(f)
+ end
+%>
diff --git a/app/views/groups/new.html.erb b/app/views/groups/new.html.erb
index e0faf978cb0..62d3cc360de 100644
--- a/app/views/groups/new.html.erb
+++ b/app/views/groups/new.html.erb
@@ -41,7 +41,10 @@ See COPYRIGHT and LICENSE files for more details.
end
%>
-<%= labelled_tabular_form_for(@group) do |f| %>
- <%= render partial: "form", locals: { f: f } %>
- <%= f.button t(:button_create), class: "button -primary -with-icon icon-checkmark" %>
-<% end %>
+<%= error_messages_for @group %>
+
+<%=
+ settings_primer_form_with(model: @group) do |f|
+ render Groups::Form.new(f, submit_label: I18n.t(:button_create))
+ end
+%>
diff --git a/app/views/versions/_form.html.erb b/app/views/versions/_form.html.erb
deleted file mode 100644
index 278aaf67178..00000000000
--- a/app/views/versions/_form.html.erb
+++ /dev/null
@@ -1,81 +0,0 @@
-<%#-- copyright
-OpenProject is an open source project management software.
-Copyright (C) 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.
-
-++#%>
-
-<%
- # locals: f, project, errors
- version = f.object
- contract = version_contract(version)
-%>
-
-<%= error_messages_for version %>
-<%= back_url_hidden_field_tag %>
-
-
- <%= f.text_field :name, required: true, container_class: "-wide" %>
-
-
-
- <%= f.text_field :description, container_class: "-wide" %>
-
-
-
- <%= f.select :status,
- contract.assignable_statuses.map { |s| [t("version_status_#{s}"), s] },
- container_class: "-slim" %>
-
-
-
- <%= f.select :wiki_page_title,
- wiki_page_options_for_select(contract.assignable_wiki_pages.includes(:parent), placeholder: false, ids: false),
- { label: :label_wiki_page, include_blank: true },
- { container_class: "-wide", disabled: contract.assignable_wiki_pages.none? } %>
-
-
-
- <%= f.date_picker :start_date %>
-
-
-
- <%= f.date_picker :effective_date %>
-
-
-
- <%= f.select :sharing,
- contract.assignable_sharings.map { |v| [format_version_sharing(v), v] },
- container_class: "-middle" %>
-
-
-<% if project.enabled_modules.map(&:name).include?("backlogs") %>
-
- <%= version_settings_fields(version, project) %>
-
-<% end %>
-
-<%= render partial: "customizable/form",
- locals: { form: f, all_fields: true, only_required: false } %>
diff --git a/app/views/versions/edit.html.erb b/app/views/versions/edit.html.erb
index 0c3bbba6650..ea046daf95b 100644
--- a/app/views/versions/edit.html.erb
+++ b/app/views/versions/edit.html.erb
@@ -41,10 +41,7 @@ See COPYRIGHT and LICENSE files for more details.
end
%>
-<%= labelled_tabular_form_for @version do |f| %>
-
- <%= render partial: "form", locals: { f: f,
- project: @project } %>
-
- <%= styled_button_tag t(:button_save), class: "-primary -with-icon icon-checkmark" %>
+<%= settings_primer_form_with(model: @version, url: version_path(@version), method: :patch) do |f| %>
+ <%= back_url_hidden_field_tag %>
+ <%= render Versions::Form.new(f, project: @project) %>
<% end %>
diff --git a/app/views/versions/new.html.erb b/app/views/versions/new.html.erb
index 140aa735cba..ceccdd93f40 100644
--- a/app/views/versions/new.html.erb
+++ b/app/views/versions/new.html.erb
@@ -40,10 +40,7 @@ See COPYRIGHT and LICENSE files for more details.
end
%>
-<%= labelled_tabular_form_for [@project, @version] do |f| %>
-
- <%= render partial: "versions/form", locals: { f: f,
- project: @project } %>
-
- <%= styled_button_tag t(:button_create), class: "-primary -with-icon icon-checkmark" %>
+<%= settings_primer_form_with(model: [@project, @version]) do |f| %>
+ <%= back_url_hidden_field_tag %>
+ <%= render Versions::Form.new(f, project: @project, submit_label: I18n.t(:button_create)) %>
<% end %>
diff --git a/config/initializers/feature_decisions.rb b/config/initializers/feature_decisions.rb
index 7ad70f1725c..30aa767af54 100644
--- a/config/initializers/feature_decisions.rb
+++ b/config/initializers/feature_decisions.rb
@@ -60,10 +60,6 @@ OpenProject::FeatureDecisions.add :portfolio_models,
description: "Enables the creation and management of portfolio and program work spaces.",
force_active: true
-OpenProject::FeatureDecisions.add :new_project_overview,
- description: "Enables the new project overview experience.",
- force_active: true
-
OpenProject::FeatureDecisions.add :jira_import,
description: "Enables Jira Migration Tool.",
force_active: false
diff --git a/config/initializers/menus.rb b/config/initializers/menus.rb
index 988d878612d..4033af892c9 100644
--- a/config/initializers/menus.rb
+++ b/config/initializers/menus.rb
@@ -480,7 +480,7 @@ Redmine::MenuManager.map :admin_menu do |menu|
{ controller: "/admin/mcp_configurations", action: :index },
if: ->(_) { User.current.admin? && OpenProject::FeatureDecisions.mcp_server_active? },
caption: I18n.t("menus.admin.ai"),
- icon: :"sparkle-fill"
+ icon: :sparkle
menu.push :mcp_configurations,
{ controller: "/admin/mcp_configurations", action: :index },
diff --git a/config/locales/crowdin/af.yml b/config/locales/crowdin/af.yml
index c4cdcbc341a..3f492be6b8a 100644
--- a/config/locales/crowdin/af.yml
+++ b/config/locales/crowdin/af.yml
@@ -371,7 +371,7 @@ af:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ af:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: There are currently no custom fields.
no_results_content_text: Create a new custom field
@@ -4813,7 +4819,6 @@ af:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Load the default configuration"
- text_min_max_length_info: "0 means no restriction"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -4828,7 +4833,6 @@ af:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Reassign to work package:"
- text_regexp_info: "eg. ^[A-Z0-9]+$"
text_regexp_multiline: 'Die regex is toegepas in ''n multi-lyn manier. bv. ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/locales/crowdin/ar.yml b/config/locales/crowdin/ar.yml
index 08a456554e5..2af8df5225c 100644
--- a/config/locales/crowdin/ar.yml
+++ b/config/locales/crowdin/ar.yml
@@ -371,7 +371,7 @@ ar:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ ar:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: لا يوجد حالياً ملفات للزبائن.
no_results_content_text: إنشاء ملف زبون جديد
@@ -5015,7 +5021,6 @@ ar:
text_length_between: "الطول بين %{min} و %{max} محارف."
text_line_separated: "القيم المتعددة المسموح بها (سطر واحد لكل قيمة)."
text_load_default_configuration: "تحميل التكوين الافتراضي"
- text_min_max_length_info: "0 يعني عدم تقييد"
text_no_roles_defined: لا توجد مجموعات معرفة.
text_no_access_tokens_configurable: "لا توجد أية رموز الوصول المميزة التي يمكن تكوينها."
text_no_configuration_data: "لم يتم تكوين الأدوار, الأنواع, حالات مجموعات العمل وتدفقات العمل حتى الآن. فإنه ينصح بشدة تحميل التكوين الافتراضي. سوف تكون قادراً على تعديله حالما يتم التحميل."
@@ -5030,7 +5035,6 @@ ar:
text_powered_by: "بواسطة %{link}"
text_project_identifier_info: "يتم السماح فقط رسائل الحالة الأدنى (أ-ي) وأرقام، والشرطات وتسطير، يجب أن تبدأ بحرف حالة الأدنى."
text_reassign: "تعيين أن تعمل الحزمة:"
- text_regexp_info: "على سبيل المثال. ^[A-Z0-9] + $"
text_regexp_multiline: 'يتم تطبيق التعبير الاعتيادي في وضع متعدد الأسطر. على سبيل المثال: ^---\s+'
text_repository_usernames_mapping: "قم باختيار أو تحديث مستخدم \"OpenProject: المشروع المفتوح\" الذي تم تعيينه لكل اسم مستخدم وُجِد في سجل المستودع.\nالمستخدمون الذين لديهم نفس اسم المستخدم أو عنوان البريد الإلكتروني في المشروع المفتوح OpenProject والمستودع يتم تعيينهم تلقائيًّا."
text_status_changed_by_changeset: "تطبيق التغييرات %{value}."
diff --git a/config/locales/crowdin/az.yml b/config/locales/crowdin/az.yml
index 5b8fce3ba5a..28181438295 100644
--- a/config/locales/crowdin/az.yml
+++ b/config/locales/crowdin/az.yml
@@ -371,7 +371,7 @@ az:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ az:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: There are currently no custom fields.
no_results_content_text: Create a new custom field
@@ -4813,7 +4819,6 @@ az:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Load the default configuration"
- text_min_max_length_info: "0 means no restriction"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -4828,7 +4833,6 @@ az:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Reassign to work package:"
- text_regexp_info: "eg. ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/locales/crowdin/be.yml b/config/locales/crowdin/be.yml
index 1c58e3dbaca..fc01637cc31 100644
--- a/config/locales/crowdin/be.yml
+++ b/config/locales/crowdin/be.yml
@@ -371,7 +371,7 @@ be:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ be:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: There are currently no custom fields.
no_results_content_text: Create a new custom field
@@ -4915,7 +4921,6 @@ be:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Load the default configuration"
- text_min_max_length_info: "0 means no restriction"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -4930,7 +4935,6 @@ be:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Reassign to work package:"
- text_regexp_info: "eg. ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/locales/crowdin/bg.yml b/config/locales/crowdin/bg.yml
index 71d016cd959..e564fb86a30 100644
--- a/config/locales/crowdin/bg.yml
+++ b/config/locales/crowdin/bg.yml
@@ -371,7 +371,7 @@ bg:
contained_in_type: "Съдържа се в тип"
confirm_destroy_option: "Изтриването на опция ще изтрие всички нейни срещания (напр. в работните пакети). Сигурни ли сте, че искате да я изтриете?"
reorder_alphabetical: "Пренареждане на стойностите по азбучен ред"
- reorder_confirmation: "Внимание: Текущият ред на наличните стойности ще бъде загубен. Желаете ли да продължите?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ bg:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: В момента няма потребителски полета.
no_results_content_text: Създаване на ново персонализирано поле
@@ -4813,7 +4819,6 @@ bg:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Load the default configuration"
- text_min_max_length_info: "0 - без ограничения"
text_no_roles_defined: Няма определени роли.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -4828,7 +4833,6 @@ bg:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Reassign to work package:"
- text_regexp_info: "eg. ^[A-Z0-9]+$"
text_regexp_multiline: 'Уеднаквяването се прилага в многоредов режим. например ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/locales/crowdin/ca.yml b/config/locales/crowdin/ca.yml
index 89920eb9172..68af262785d 100644
--- a/config/locales/crowdin/ca.yml
+++ b/config/locales/crowdin/ca.yml
@@ -368,7 +368,7 @@ ca:
contained_in_type: "Contingut a la classe"
confirm_destroy_option: "Eliminant una opció n'eliminareu totes les ocurrències (ex. en un paquet de treball). Segur que vols eliminar-ho?"
reorder_alphabetical: "Reorganitza els valors alfabèticament"
- reorder_confirmation: "Alerta: L'ordre actual dels valors disponibles es perdran. Vols continuar?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -395,6 +395,12 @@ ca:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Actualment no hi ha camps personalitzats.
no_results_content_text: Crea un camp personalitzat nou
@@ -4804,7 +4810,6 @@ ca:
text_length_between: "Longitud entre %{min} i %{max} caràcters."
text_line_separated: "Es permeten diversos valors (una línia per cada valor)."
text_load_default_configuration: "Carregar la configuració predeterminada"
- text_min_max_length_info: "0 significa sense restricció"
text_no_roles_defined: No hi ha rols definits.
text_no_access_tokens_configurable: "No hi ha tokens d'accés que siguin configurables."
text_no_configuration_data: "Encara no s'han configurat els rols, tipus, estats dels paquet de treball i flux de treball.\nÉs altament recomanable que carreguis la configuració predeterminada. Podràs modificar-la un cop carregada."
@@ -4819,7 +4824,6 @@ ca:
text_powered_by: "Desenvolupat per %{link}"
text_project_identifier_info: "Només es permeten lletres minúscules (a-z), números, guions i guions baixos, i ha de començar amb una lletra minúscula."
text_reassign: "Reassigna al paquet de treball:"
- text_regexp_info: "ex. ^[A-Z0-9]+$"
text_regexp_multiline: 'S''aplica l''expressió regular en mode de múltilínia. Per exemple, ^---\s+'
text_repository_usernames_mapping: "Seleccioneu l'assignació entre els usuaris del OpenProject i cada nom d'usuari trobat al repositori.\nEls usuaris amb el mateix nom d'usuari o correu del OpenProject i del repositori s'assignaran automàticament."
text_status_changed_by_changeset: "Aplicat en el conjunt de canvis %{value}."
diff --git a/config/locales/crowdin/ckb-IR.yml b/config/locales/crowdin/ckb-IR.yml
index 7c9389736cc..5f44bc17690 100644
--- a/config/locales/crowdin/ckb-IR.yml
+++ b/config/locales/crowdin/ckb-IR.yml
@@ -371,7 +371,7 @@ ckb-IR:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ ckb-IR:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: There are currently no custom fields.
no_results_content_text: Create a new custom field
@@ -4813,7 +4819,6 @@ ckb-IR:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Load the default configuration"
- text_min_max_length_info: "0 means no restriction"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -4828,7 +4833,6 @@ ckb-IR:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Reassign to work package:"
- text_regexp_info: "eg. ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/locales/crowdin/cs.yml b/config/locales/crowdin/cs.yml
index c86d14c17da..a737a1f2246 100644
--- a/config/locales/crowdin/cs.yml
+++ b/config/locales/crowdin/cs.yml
@@ -371,7 +371,7 @@ cs:
contained_in_type: "Obsahuje typ"
confirm_destroy_option: "Smazáním možnosti smažete všechny výskyty (např. v pracovních balíčcích). Opravdu ji chcete odstranit?"
reorder_alphabetical: "Změnit pořadí abecedně"
- reorder_confirmation: "Varování: Aktuální pořadí dostupných hodnot bude ztraceno. Pokračovat?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Nejprve je nutné vybrat pracovní balíček nebo projekt"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ cs:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: V současné době nejsou žádná vlastní pole.
no_results_content_text: Vytvořit nové vlastní pole
@@ -4914,7 +4920,6 @@ cs:
text_length_between: "Délka mezi %{min} a %{max} znaky."
text_line_separated: "Více hodnot povoleno (jeden řádek pro každou hodnotu)."
text_load_default_configuration: "Nahrát výchozí konfiguraci"
- text_min_max_length_info: "0 znamená bez omezení"
text_no_roles_defined: Nebyly definovány žádné role.
text_no_access_tokens_configurable: "Neexistují žádné přístupové tokeny, které by mohly být nakonfigurovány."
text_no_configuration_data: "Role, typy, stavy úkolů ani průběh práce nebyly zatím nakonfigurovány.\nJe silně doporučeno nahrát výchozí konfiguraci. Poté si můžete vše upravit."
@@ -4929,7 +4934,6 @@ cs:
text_powered_by: "Běží na %{link}"
text_project_identifier_info: "Jsou povolena pouze malá písmena (a-z), číslice, pomlčky a podtržítka. Musí začínat malým písmenem."
text_reassign: "Přiřadit k pracovnímu balíčku:"
- text_regexp_info: "např. ^[A-Z0-9]+$"
text_regexp_multiline: 'regex je použit v režimu více řádků. např.: ^---\s+'
text_repository_usernames_mapping: "Vyberte nebo aktualizujte mapovaný uživatel OpenProject ke každému uživatelskému jménu nalezenému v protokolu repozitáře.\nUživatelé se stejným OpenProject a repozitářovým jménem nebo e-mailem jsou automaticky mapováni."
text_status_changed_by_changeset: "Aplikováno v sadě změn %{value}."
diff --git a/config/locales/crowdin/da.yml b/config/locales/crowdin/da.yml
index f2857a0c5a1..9b023a6cfaf 100644
--- a/config/locales/crowdin/da.yml
+++ b/config/locales/crowdin/da.yml
@@ -369,7 +369,7 @@ da:
contained_in_type: "Indeholdt i type"
confirm_destroy_option: "Sletning af en indstilling vil slette alle dens forekomster (f.eks. i arbejdspakker). Er du sikker på, at du vil slette den?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -396,6 +396,12 @@ da:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Der er i øjeblikket ingen brugerdefinerede felter.
no_results_content_text: Oprette en ny brugerdefineret felt
@@ -4809,7 +4815,6 @@ da:
text_length_between: "Længde mellem %{min} og %{max} tegn."
text_line_separated: "Flere værdier tilladt (én linje for hver værdi)."
text_load_default_configuration: "Hent forhåndsvalgt opsætning"
- text_min_max_length_info: "0 betyder ingen begrænsning"
text_no_roles_defined: Der er ikke defineret nogle roller.
text_no_access_tokens_configurable: "Der er ingen adgangstegn, som kan konfigureres."
text_no_configuration_data: "Roller, typer, statusser for arbejdspakker og arbejdsgange er endnu ikke sat op. Det anbefales stærkt at hente forhåndsopsætningen. Du vil kunne ændre den når den er indlæst."
@@ -4824,7 +4829,6 @@ da:
text_powered_by: "Drevet af %{link}"
text_project_identifier_info: "Kun små bogstaver (a-z), tal, - og _ er tilladt; først tegn skal være et bogstav."
text_reassign: "Gentildel til arbejdspakke:"
- text_regexp_info: "fx ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Vælg eller opdatér den OpenProject-bruger, der er tilknyttet hvert brugernavn i loggen for projektarkivet.\nBrugere med det samme brugernavn eller mailadresse i OpenProject og i projektarkivet vil automatisk blive tilknyttet."
text_status_changed_by_changeset: "Indføjet i pakken af ændringer, %{value}."
diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml
index fb282d6a7ae..9009929c323 100644
--- a/config/locales/crowdin/de.yml
+++ b/config/locales/crowdin/de.yml
@@ -368,7 +368,7 @@ de:
contained_in_type: "In Typ enthalten"
confirm_destroy_option: "Löschen eines Werts entfernt alle bereits gesetzten Werte (z.B. bei Arbeitspaketen). Sind Sie sicher, dass Sie den Wert löschen möchten?"
reorder_alphabetical: "Alphabetisch umsortieren"
- reorder_confirmation: "Warnung: Die aktuelle Reihenfolge der verfügbaren Werte geht verloren. Fortfahren?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Zunächst muss ein Arbeitspaket oder ein Projekt ausgewählt werden"
calculated_field_not_editable: "Nicht editierbares Attribut. Dieser Wert wird automatisch berechnet."
no_role_assigment: "Keine Rollenzuweisung"
@@ -395,6 +395,12 @@ de:
Erlaubt das benutzerdefinierte Feld in einem Filter in der Arbeitspaket-Ansicht zu verwenden. Beachten Sie, dass, nur wenn "Für alle Projekte" ausgewählt ist, das benutzerdefinierte Feld in globalen Ansichten angezeigt wird.
formula:
project: "Fügen Sie numerische Werte hinzu oder geben Sie / ein, um nach einem Attribut oder einem mathematischen Operator zu suchen."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Zur Zeit existieren keine benutzerdefinierten Felder.
no_results_content_text: Neues benutzerdefiniertes Feld anlegen
@@ -3248,7 +3254,7 @@ de:
label_equals_with_descendants: "ist (ODER) inkl. Unterelementen "
label_everywhere: "überall"
label_example: "Beispiel"
- label_experimental: "Experimentel"
+ label_experimental: "Experimentell"
label_i_am_member: "Ich bin Mitglied"
label_ifc_viewer: "IFC-Viewer"
label_ifc_model_plural: "IFC-Modelle"
@@ -4807,7 +4813,6 @@ de:
text_length_between: "Länge zwischen %{min} und %{max} Zeichen."
text_line_separated: "Mehrere Werte sind erlaubt (eine Zeile pro Wert)."
text_load_default_configuration: "Standard-Konfiguration laden"
- text_min_max_length_info: "0 heißt keine Beschränkung"
text_no_roles_defined: Es wurden keine Rollen definiert.
text_no_access_tokens_configurable: "Es existieren keine Zugangs-Tokens, die konfiguriert werden können."
text_no_configuration_data: "Rollen, Typen, Arbeitspaket-Status und Workflows wurden noch nicht konfiguriert. Es wird empfohlen die Standard-Konfiguration zu laden. Sobald die Konfiguration geladen ist, kann diese geändert werden."
@@ -4822,7 +4827,6 @@ de:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Kleinbuchstaben (a-z), Ziffern, Binde- und Unterstriche erlaubt. Muss mit einem Kleinbuchstaben beginnen."
text_reassign: "Zuweisung zu Arbeitspaket:"
- text_regexp_info: "z. B. ^[A-Z0-9]+$"
text_regexp_multiline: 'Der reguläre Ausdruck wird in einem mehrzeiligen Modus angewandt, z.B. ^---\s+'
text_repository_usernames_mapping: "Bitte legen Sie die Zuordnung der OpenProject-Benutzer zu den Benutzernamen der Commit-Log-Meldungen des Projektarchivs fest.\nBenutzer mit identischen OpenProject- und Projektarchiv-Benutzernamen oder -E-Mail-Adressen werden automatisch zugeordnet."
text_status_changed_by_changeset: "Status geändert durch Projektarchiv-Änderung %{value}."
diff --git a/config/locales/crowdin/el.yml b/config/locales/crowdin/el.yml
index dbf74f21914..4277576e8a1 100644
--- a/config/locales/crowdin/el.yml
+++ b/config/locales/crowdin/el.yml
@@ -367,7 +367,7 @@ el:
contained_in_type: "Περιέχονται στον τύπο"
confirm_destroy_option: "Η διαγραφή μιας επιλογής θα διαγράψει όλα τα περιστατικά της (π.χ. σε πακέτα εργασίας). Είστε βέβαιοι ότι θέλετε να το διαγράψετε;"
reorder_alphabetical: "Αναδιάταξη τιμών αλφαβητικά"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -394,6 +394,12 @@ el:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Προς το παρόν δεν υπάρχουν προσαρμοσμένα πεδία.
no_results_content_text: Δημιουργία νέου προσαρμοσμένου πεδίου
@@ -4808,7 +4814,6 @@ el:
text_length_between: "Μήκος μεταξύ %{min} και %{max} χαρακτήρων."
text_line_separated: "Επιτρέπονται πολλαπλές τιμές (μία γραμμή για κάθε τιμή)."
text_load_default_configuration: "Φόρτωση προεπιλεγμένων ρυθμίσεων διαμόρφωσης"
- text_min_max_length_info: "Το 0 σημαίνει ότι δεν υπάρχουν περιορισμοί"
text_no_roles_defined: Δεν έχουν οριστεί ρόλοι.
text_no_access_tokens_configurable: "Δεν υπάρχουν tokens πρόσβασης που μπορούν να διαμορφωθούν."
text_no_configuration_data: "Οι ρόλοι, οι τύποι, η καταστάσεις των πακέτων εργασίας και η ροή εργασίας δεν έχουν ρυθμιστεί ακόμα.\nΣυνιστάται ιδιαίτερα να φορτώσετε τις προεπιλεγμένες ρυθμίσεις. Θα είστε σε θέση να τις τροποποιήσετε μετά τη φόρτωση τους."
@@ -4823,7 +4828,6 @@ el:
text_powered_by: "Υποστηρίζεται από %{link}"
text_project_identifier_info: "Επιτρέπονται μόνο πεζά γράμματα (α-ω), αριθμοί, παύλες και κάτω παύλες, πρέπει να αρχίζουν με πεζό γράμμα."
text_reassign: "Επανεκχώρηση στο πακέτα εργασίας:"
- text_regexp_info: "π.χ. ^[A-Z0-9]+$"
text_regexp_multiline: 'Το regex εφαρμόστηκε σε μια λειτουργία πολλαπλών γραμμών. π.χ., ^---\s+'
text_repository_usernames_mapping: "Επιλέξτε ή ενημερώστε τον χρήστη OpenProject που αντιστοιχεί σε κάθε όνομα χρήστη στο ιστορικό του αποθετηρίου.\nΧρήστες με το ίδιο όνομα χρήστη στο OpenProject και το αποθετήριο ή email αντιστοιχίζονται αυτόματα."
text_status_changed_by_changeset: "Εφαρμόστηκε στις αλλαγές %{value}."
diff --git a/config/locales/crowdin/eo.yml b/config/locales/crowdin/eo.yml
index 9e4f1048d07..c02b4e62206 100644
--- a/config/locales/crowdin/eo.yml
+++ b/config/locales/crowdin/eo.yml
@@ -371,7 +371,7 @@ eo:
contained_in_type: "Inkludita en la speco"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ eo:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Nun estas neniu adaptita kampo.
no_results_content_text: Krei novan adaptitan kampon
@@ -4813,7 +4819,6 @@ eo:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Load the default configuration"
- text_min_max_length_info: "0 means no restriction"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -4828,7 +4833,6 @@ eo:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Reassign to work package:"
- text_regexp_info: "eg. ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml
index 93004f9b064..f5f1a4dca3e 100644
--- a/config/locales/crowdin/es.yml
+++ b/config/locales/crowdin/es.yml
@@ -369,7 +369,7 @@ es:
contained_in_type: "Incluido en el tipo"
confirm_destroy_option: "Al eliminar una opción, se eliminarán todas las repeticiones (por ejemplo, en paquetes de trabajo). ¿Está seguro de que desea eliminarla?"
reorder_alphabetical: "Ordenar los valores alfabéticamente"
- reorder_confirmation: "Advertencia: Se perderá el orden actual de los valores disponibles. ¿Quiere continuar?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Primero debe seleccionar el paquete de trabajo o el proyecto"
calculated_field_not_editable: "Atributo no editable. Este valor se calcula automáticamente."
no_role_assigment: "Sin asignación de roles"
@@ -396,6 +396,12 @@ es:
Permitir que el campo personalizado se utilice como filtro en las vistas de paquetes de trabajo. Tenga en cuenta que solo 'Para todos los proyectos' seleccionados, el campo personalizado se mostrará en vistas globales.
formula:
project: "Añada valores numéricos o escriba/para buscar un atributo o un operador matemático."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Actualmente no hay campos personalizados.
no_results_content_text: Crear un nuevo campo personalizado
@@ -4809,7 +4815,6 @@ es:
text_length_between: "Longitud entre %{min} y %{max} caracteres."
text_line_separated: "Múltiples valores permitidos (una línea para cada valor)."
text_load_default_configuration: "Cargar la configuración predeterminada"
- text_min_max_length_info: "0 significa sin restricción"
text_no_roles_defined: No hay ningun rol definido.
text_no_access_tokens_configurable: "No hay ningun token de acceso que pueda ser configurado."
text_no_configuration_data: "Roles, tipos, estado de petición y flujo de trabajo no han sido configurados. Se recomienda cargar la configuración por defecto. Podrá modificarla cuando haya sido cargada."
@@ -4824,7 +4829,6 @@ es:
text_powered_by: "Con tecnología de %{link}"
text_project_identifier_info: "Se permiten sólo letras minúsculas (a-z), números, guiones y guiones bajos, debe comenzar con una letra minúscula."
text_reassign: "Reasignar al paquete de trabajo:"
- text_regexp_info: "eg. ^[A-Z0-9]+$"
text_regexp_multiline: 'La expresión regular se aplica en modo multilínea. Por ejemplo, ^---\s+'
text_repository_usernames_mapping: "Seleccione o actualize el usuario de OpenProject asignado a cada nombre en el registro del repositorio. Los usuarios con el mismo nombre o email serán mapeados automáticamente."
text_status_changed_by_changeset: "Aplicado en el conjunto de cambios %{value}."
diff --git a/config/locales/crowdin/et.yml b/config/locales/crowdin/et.yml
index ce7e92276a0..79ba6ed00a5 100644
--- a/config/locales/crowdin/et.yml
+++ b/config/locales/crowdin/et.yml
@@ -371,7 +371,7 @@ et:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ et:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: There are currently no custom fields.
no_results_content_text: Create a new custom field
@@ -4813,7 +4819,6 @@ et:
text_length_between: "Pikkus peab olema %{min} kuni %{max} märki."
text_line_separated: "Lubatud erinevad väärtused (igaüks eraldi real)."
text_load_default_configuration: "Laadi vaikeasetused"
- text_min_max_length_info: "0 tähendab, et piiranguid ei ole"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Rollid, valdkonnad, olekud ja töövood ei ole veel seadistatud.\\nVäga soovitav on laadida vaikeasetused. Peale laadimist saad neid ise muuta."
@@ -4828,7 +4833,6 @@ et:
text_powered_by: "Jooksutab %{link}"
text_project_identifier_info: "Lubatud on ainult väikesed tähed (a-z), numbrid ja kriipsud. Peab algama väikse tähega."
text_reassign: "Reassign to work package:"
- text_regexp_info: "ehk teisisõnu ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Seosta OpenProject kasutaja hoidlasse sissekannete tegijaga. Sama nime või e-postiga kasutajad seostatakse automaatselt."
text_status_changed_by_changeset: "Kehtestati toimikus %{value}."
diff --git a/config/locales/crowdin/eu.yml b/config/locales/crowdin/eu.yml
index 06b5fe3b7e8..25080d4132a 100644
--- a/config/locales/crowdin/eu.yml
+++ b/config/locales/crowdin/eu.yml
@@ -371,7 +371,7 @@ eu:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ eu:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: There are currently no custom fields.
no_results_content_text: Create a new custom field
@@ -4813,7 +4819,6 @@ eu:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Load the default configuration"
- text_min_max_length_info: "0 means no restriction"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -4828,7 +4833,6 @@ eu:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Reassign to work package:"
- text_regexp_info: "eg. ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/locales/crowdin/fa.yml b/config/locales/crowdin/fa.yml
index 60de89095b5..cd362755e22 100644
--- a/config/locales/crowdin/fa.yml
+++ b/config/locales/crowdin/fa.yml
@@ -371,7 +371,7 @@ fa:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ fa:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: There are currently no custom fields.
no_results_content_text: Create a new custom field
@@ -4813,7 +4819,6 @@ fa:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Load the default configuration"
- text_min_max_length_info: "0 means no restriction"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -4828,7 +4833,6 @@ fa:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Reassign to work package:"
- text_regexp_info: "eg. ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/locales/crowdin/fi.yml b/config/locales/crowdin/fi.yml
index 274c3a41064..b8aaa5f6e26 100644
--- a/config/locales/crowdin/fi.yml
+++ b/config/locales/crowdin/fi.yml
@@ -371,7 +371,7 @@ fi:
contained_in_type: "Sisältyy tyyppiin"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ fi:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Tällä hetkellä ei ole mukautettuja kenttiä.
no_results_content_text: Luo uusi mukautettu kenttä
@@ -4813,7 +4819,6 @@ fi:
text_length_between: "Pituus välillä %{min} ja %{max} merkkiä."
text_line_separated: "Useat arvot sallittu (yksi rivi kullekin)."
text_load_default_configuration: "Lataa oletusasetukset"
- text_min_max_length_info: "0 tarkoittaa ei rajoitusta"
text_no_roles_defined: Yhtään roolia ei ole määritetty.
text_no_access_tokens_configurable: "Ei ole olemassa pääsyavaimia joita voisi konfiguroida."
text_no_configuration_data: "Rooleja, tapahtumien tiloja ja työnkulkua ei vielä olla määritelty.\nOn erittäin suotavaa ladata vakioasetukset. Voit muuttaa sitä latauksen jälkeen."
@@ -4828,7 +4833,6 @@ fi:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Vain pienet kirjaimet (a-z), numerot, väliviivat ja alaviivat ovat sallittuja. Ensimmäisenä tulee olla pieni kirjain."
text_reassign: "Reassign to work package:"
- text_regexp_info: "esim. ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Valitse päivittääksesi Redmine käyttäjä jokaiseen käyttäjään joka löytyy tietovaraston lokista.\nKäyttäjät joilla on sama Redmine ja tietovaraston käyttäjänimi tai sähköpostiosoite, yhdistetään automaattisesti."
text_status_changed_by_changeset: "Päivitetty muutosversioon %{value}."
diff --git a/config/locales/crowdin/fil.yml b/config/locales/crowdin/fil.yml
index 59eb624db33..2f81080692e 100644
--- a/config/locales/crowdin/fil.yml
+++ b/config/locales/crowdin/fil.yml
@@ -371,7 +371,7 @@ fil:
contained_in_type: "Naglaman ng uri"
confirm_destroy_option: "Kapag nagbubura ng opsyon ay makakabura sa lahat ng mga pangyayari nito (e.g. sa mga package na trabaho). Sigurado ka bang gusto mong burahin ito?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ fil:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Sa kasalukuyan ay walang mga custom field.
no_results_content_text: Gumawa ng bagong patlang na custom
@@ -4811,7 +4817,6 @@ fil:
text_length_between: "Taas pagitan ng %{min} at %{max} na mga karakter."
text_line_separated: "Maramihang halaga ang pinahintulutan (isang linya para sa bawat halaga)."
text_load_default_configuration: "I-load ang kumpigurasyong default"
- text_min_max_length_info: "0 ay nangunguhugan walang paghihigpit"
text_no_roles_defined: Walang mga role na niliwanag.
text_no_access_tokens_configurable: "Walang mga access tokens na pweding ma configure."
text_no_configuration_data: "Ang mga tungkulin, uri, estado ng work package at daloy na trabaho ay hindi pa na configure.\nIto ay lubos na inirerekomenda upang i-lpad anh default na kumpigurasyon. Magagawa mong baguhin ito pag naka-load."
@@ -4826,7 +4831,6 @@ fil:
text_powered_by: "Pinalatakbo ng %{link}"
text_project_identifier_info: "Maliit na titik lamang (a-z), mga numero, mga dash at underscore ang pinahintulutan, dapat magsimula sa maliit na titik."
text_reassign: "I-reassign sa work package:"
- text_regexp_info: "e. g ^[A-Z0-9]+$"
text_regexp_multiline: 'Ang regex ay nakalagay sa multi-line mlde. hal., ^---\s+'
text_repository_usernames_mapping: "Piliin o i-update ang OpenProject usrt naka-map sa bawat username nakita sa repositoryo log.\nAng mga gumagamit sa kaparehong OpenProject at repositoryong username o ang email ay automatikong naka-map."
text_status_changed_by_changeset: "Ilapaylt sa changeset %{value}."
diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml
index 44ee530fcfe..7a03a59a514 100644
--- a/config/locales/crowdin/fr.yml
+++ b/config/locales/crowdin/fr.yml
@@ -113,7 +113,7 @@ fr:
index:
description: "Le protocole de contexte de modèle permet aux agents d'intelligence artificielle de fournir à leurs utilisateurs les outils et les ressources exposés par cette instance d'OpenProject."
resources_heading: "Ressources"
- resources_description: "OpenProject implements the following resources. Each can be enabled, renamed and described as you want. For more information, please refer to the [documentation on MCP resources](docs_url)."
+ resources_description: "OpenProject met en œuvre les ressources suivantes. Chacune d'entre elles peut être activée, renommée et décrite comme vous le souhaitez. Pour plus d'informations, veuillez vous référer à la [documentation sur les ressources MCP](docs_url)."
resources_submit: "Mettre à jour les ressources"
tools_heading: "Outils"
tools_description: "OpenProject implémente les outils suivants. Chacun d'entre eux peut être activé, renommé et décrit comme vous le souhaitez. Pour en savoir plus, veuillez vous référer à la [documentation sur les outils MCP](docs_url)."
@@ -122,17 +122,17 @@ fr:
success: "Les configurations MCP ont été mises à jour avec succès."
server_form:
description_caption: "Comment le serveur MCP sera décrit aux autres applications qui s'y connectent."
- title_caption: "A short title shown to applications that connect to the MCP server."
- tool_response_format: "Tool response format"
- tool_response_format_content_only_label: "Content only"
+ title_caption: "Titre court affiché aux applications qui se connectent au serveur MCP."
+ tool_response_format: "Format de réponse de l'outil"
+ tool_response_format_content_only_label: "Contenu uniquement"
tool_response_format_content_only_caption: >
- Choose this if MCP clients connecting to this instance do not support structured content. Tool responses will only contain plain text content and leave out the structured version.
- tool_response_format_full_label: "Full"
+ Choisissez cette option si les clients MCP qui se connectent à cette instance ne prennent pas en charge le contenu structuré. Les réponses de l'outil ne contiendront que du texte brut et ne tiendront pas compte de la version structurée.
+ tool_response_format_full_label: "Complet"
tool_response_format_full_caption: >
- The most compatible option. Tool responses will include both regular and structured content, allowing MCP clients to choose which format they want to read. This may increase the number of tokens that the language model has to process, potentially increasing cost and decreasing performance.
- tool_response_format_structured_only_label: "Structured content only"
+ L'option la plus compatible. Les réponses de l'outil comprendront à la fois du contenu régulier et structuré, ce qui permettra aux clients MCP de choisir le format qu'ils souhaitent lire. Cela peut augmenter le nombre de jetons que le modèle linguistique doit traiter, ce qui peut entraîner une augmentation des coûts et une diminution des performances.
+ tool_response_format_structured_only_label: "Contenu structuré uniquement"
tool_response_format_structured_only_caption: >
- Choose this if you are certain that MCP clients connecting to this instance support structured content. Tool responses will only include structured content and leave out its text representation.
+ Choisissez cette option si vous êtes certain que les clients MCP qui se connectent à cette instance prennent en charge le contenu structuré. Les réponses de l'outil n'incluront que le contenu structuré et ne tiendront pas compte de sa représentation textuelle.
update:
failure: "La configuration MCP n'a pas pu être mise à jour."
success: "La configuration MCP a été mise à jour avec succès."
@@ -371,7 +371,7 @@ fr:
contained_in_type: "Figurant dans le type"
confirm_destroy_option: "Supprimer une option supprimera toutes ses occurrences (ex. dans les plans de travail). Êtes-vous sûr de vouloir le supprimer ?"
reorder_alphabetical: "Réorganiser les valeurs par ordre alphabétique"
- reorder_confirmation: "Attention : l'ordre actuel des valeurs disponibles sera perdu. Continuer ?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "La sélection d'un lot de travaux ou d'un projet est requise en premier lieu"
calculated_field_not_editable: "Attribut non modifiable. Cette valeur est calculée automatiquement."
no_role_assigment: "Pas d'attribution de rôle"
@@ -398,6 +398,12 @@ fr:
Permet au champ personnalisé d'être utilisé dans un filtre dans les vues des lots de travaux. Notez que le champ personnalisé n'apparaîtra dans les vues globales que si l'option « Pour tous les projets » est sélectionnée.
formula:
project: "Ajoutez des valeurs numériques ou saisissez / pour rechercher un attribut ou un opérateur mathématique."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Il n'y a actuellement aucun champ personnalisé.
no_results_content_text: Créer un nouveau champ personnalisé
@@ -618,7 +624,7 @@ fr:
is_for_all_blank_slate:
heading: Pour tous les projets
description: Cet attribut de projet est activé dans tous les projets, car l'option « Pour tous les projets » est cochée. Il ne peut pas être désactivé pour les projets individuels.
- enabled_via_assignee_when_submitted_html: This project attribute cannot be disabled since it is set as assignee when submitted for project initiation requests.
+ enabled_via_assignee_when_submitted_html: Cet attribut de projet ne peut pas être désactivé car il est défini comme assignee when submitted pour les demandes d'initiation de projet.
types:
no_results_title_text: Il n'y a actuellement aucun type disponible.
form:
@@ -634,8 +640,8 @@ fr:
new_label: "Nouvelle priorité"
creation_wizard:
errors:
- no_work_package_type: "Failed to enable project initiation request because it requires at least one active work package type and this project has none. Please add at least one work package type to this project."
- no_status_when_submitted: "Failed to enable project initiation request because work package type %{type} requires at least one status associated with it. Please enable at least one status workflow for this work package type."
+ no_work_package_type: "La demande d'initiation de projet n'a pas pu être activée car elle nécessite au moins un type de lot de travaux actif et ce projet n'en a pas. Veuillez ajouter au moins un type de lot de travail à ce projet."
+ no_status_when_submitted: "Échec de l'activation de la demande d'initiation de projet car le type de lot de travail %{type} doit être associé à au moins un statut. Veuillez activer au moins un workflow de statut pour ce type de work package."
export:
description_attachment_export: "L'artefact généré sera enregistré en tant que pièce jointe au format PDF dans le lot de travaux de l'artefact."
description_file_link_export: "Le lot de travaux de l'artefact contient un lien vers un fichier PDF stocké dans un espace de stockage de fichiers externe. Nécessite un stockage de fichiers de travail avec des dossiers de projet gérés automatiquement pour ce projet. Pour le moment, seuls les espaces de stockage de fichiers Nextcloud sont pris en charge."
@@ -649,7 +655,7 @@ fr:
label_request_submission: "Demande d'envoi"
project_attributes_description: >
Sélectionnez les attributs du projet à inclure dans la demande de lancement du projet. Cette liste ne comprend que les [attributs du projet](project_attributes_url) activés pour ce projet.
- enabled_because_required_html: This project attribute cannot be disabled for this project initiation request since it is defined as required. This can be changed in the administration settings by the administrator of the instance.
+ enabled_because_required_html: Cet attribut de projet ne peut pas être désactivé pour cette demande d'initiation de projet puisqu'il est défini comme obligatoire. Il peut être modifié dans les paramètres d'administration par l'administrateur de l'instance.
status:
button_edit: Modifier le statut
wizard:
@@ -1172,8 +1178,8 @@ fr:
activerecord:
attributes:
agile/sprint:
- sharing: "Sharing"
- finish_date: "End date"
+ sharing: "Partage"
+ finish_date: "Échéance"
announcements:
show_until: "Afficher jusqu'à"
attachment:
@@ -1548,7 +1554,7 @@ fr:
not_available: "n'est pas disponible en raison d'une configuration système."
not_deletable: "ne peut pas être supprimé"
not_current_user: "n'est pas l'utilisateur actuel."
- only_one_active_sprint_allowed: "only one active sprint is allowed per project."
+ only_one_active_sprint_allowed: "un seul sprint actif est autorisé par projet."
not_found: "introuvable."
not_a_date: "n'est pas une date valide."
not_a_datetime: "n'est pas une heure valide."
@@ -1656,7 +1662,7 @@ fr:
meeting:
error_conflict: "Impossible d'enregistrer, car la réunion a été mise à jour par quelqu'un d'autre entre-temps. Veuillez recharger la page."
message:
- cannot_move_message_to_forum_of_different_project: "A message cannot be moved to a forum of a different project."
+ cannot_move_message_to_forum_of_different_project: "Un message ne peut pas être déplacé vers un forum d'un autre projet."
notifications:
at_least_one_channel: "Au moins un canal pour envoyer des notifications doit être spécifié."
attributes:
@@ -2878,7 +2884,7 @@ fr:
new_features_list:
line_0: Lancement automatisé de projets (module complémentaire Enterprise).
line_1: "Réunions : ajoutez des work packages nouveaux ou existants en tant que résultats."
- line_2: "Meetings: show iCal responses in OpenProject."
+ line_2: "Réunions : afficher les réponses iCal dans OpenProject."
line_3: "Réunions récurrentes : dupliquez les points de l'ordre du jour lors de la prochaine réunion."
line_4: "Mise à disposition de la Communauté : Mise en évidence des attributs."
line_5: Avertissement avant l'ouverture de liens externes dans le contenu fourni par l'utilisateur (module complémentaire Enterprise).
@@ -3988,7 +3994,7 @@ fr:
notice_successful_delete: "Suppression réussie."
notice_successful_cancel: "Annulation réussie."
notice_successful_update: "Mise à jour réussie."
- notice_successful_move: "Successful move from %{from} to %{to}."
+ notice_successful_move: "Passage réussi de %{from} à %{to}."
notice_unsuccessful_create: "Échec de la création."
notice_unsuccessful_create_with_reason: "Échec de la création : %{reason}"
notice_unsuccessful_update: "Mise à jour échouée."
@@ -4150,7 +4156,7 @@ fr:
permission_edit_project_query: "Modifier la requête du projet"
placeholders:
default: "-"
- templated_hint: Automatically generated through type %{type}
+ templated_hint: Généré automatiquement par le type %{type}
portfolio:
count:
zero: "0 portefeuille"
@@ -4335,9 +4341,9 @@ fr:
setting_capture_external_links: "Saisir les liens externes"
setting_capture_external_links_text: >
Lorsque cette option est activée, tous les liens externes en texte formaté sont redirigés vers une page d'avertissement avant de quitter l'application. Cela permet de protéger les utilisateurs contre les sites web externes potentiellement malveillants.
- setting_capture_external_links_require_login: "Require users to be logged in"
+ setting_capture_external_links_require_login: "Exiger que les utilisateurs soient connectés"
setting_capture_external_links_require_login_text: >
- When enabled, users wanting to click on external links need to be logged in before being able to continue.
+ Lorsque cette option est activée, les utilisateurs qui souhaitent cliquer sur des liens externes doivent être connectés avant de pouvoir continuer.
setting_after_first_login_redirect_url: "Redirection de première connexion"
setting_after_first_login_redirect_url_text_html: >
Définissez un chemin pour rediriger les utilisateurs après leur première connexion. S’il est vide, les utilisateurs seront redirigés vers la page d'accueil de la visite d'intégration. Exemple : /my/page
@@ -4382,9 +4388,9 @@ fr:
setting_smtp_password: "Mot de passe SMTP"
setting_smtp_domain: "Domaine SMTP HELO"
setting_activity_days_default: "Nombre des jours affichés dans l'activité du projet"
- setting_api_tokens_enabled: "Enable API tokens"
+ setting_api_tokens_enabled: "Activer les jetons API"
setting_api_tokens_enabled_caption: >
- Decide whether users can create personal API tokens in their account settings. These tokens can be used to access the different APIs of OpenProject, such as APIv3 and MCP.
+ Décidez si les utilisateurs peuvent créer des jetons API personnels dans les paramètres de leur compte. Ces jetons peuvent être utilisés pour accéder aux différentes API d'OpenProject, telles que APIv3 et MCP.
setting_app_subtitle: "Sous-titre de l'Application"
setting_app_title: "Titre de l'Application"
setting_attachment_max_size: "Taille maximale de la pièce jointe"
@@ -4811,7 +4817,6 @@ fr:
text_length_between: "Longueur entre %{min} et %{max} caractères."
text_line_separated: "Valeurs multiples autorisées (une ligne par valeur)."
text_load_default_configuration: "Charger la configuration par défaut"
- text_min_max_length_info: "0 signifie aucune restriction"
text_no_roles_defined: Il n'y a pas de rôles définis.
text_no_access_tokens_configurable: "Il n'y a aucun jeton d'accès qui puisse être configuré."
text_no_configuration_data: "Les rôles, les types, l'état des lots de travaux et les flux de travaux n'ont pas encore été configurés.\nIl est fortement recommandé de charger la configuration par défaut. Vous serrez capable de le modifier, une fois chargé."
@@ -4826,7 +4831,6 @@ fr:
text_powered_by: "Propulsé par %{link}"
text_project_identifier_info: "Seulement les lettres en minuscule (a-z), les nombres, les tirets et les underscores sont autorisés, il est obligatoire de commencer avec une lettre en minuscule."
text_reassign: "Réaffecter au lot de travaux :"
- text_regexp_info: "ex. ^[A-Z0-9]+$"
text_regexp_multiline: 'L''expression régulière est appliquée en mode multi-ligne, e.g. ^---\\s+'
text_repository_usernames_mapping: "Définir ou modifier les associations entre les utilisateurs d'OpenProject et les utilisateurs trouvés dans le dépôt.\nLes utilisateurs ayant des noms ou des adresses e-mail identiques sont automatiquement associés."
text_status_changed_by_changeset: "Appliqué dans « changeset » %{value}."
@@ -4925,10 +4929,10 @@ fr:
reset_failed_logins: "Réinitialiser les connexions echouées"
status_user_and_brute_force: "%{user} et %{brute_force}"
status_change: "Changement de statut"
- text_change_disabled_for_provider_login: "The name and email is set by your login provider and can thus not be changed."
+ text_change_disabled_for_provider_login: "Le nom et l'adresse électronique sont définis par votre fournisseur d'accès et ne peuvent donc pas être modifiés."
unlock: "Déverrouiller"
unlock_and_reset_failed_logins: "Déverrouiller et réinitialiser les échecs de connexion"
- error_cannot_delete_user: "User cannot be deleted"
+ error_cannot_delete_user: "L'utilisateur ne peut pas être supprimé"
version_status_closed: "clôturé"
version_status_locked: "verrouillé"
version_status_open: "ouvert"
diff --git a/config/locales/crowdin/he.yml b/config/locales/crowdin/he.yml
index e168eb2b525..bb3435fa764 100644
--- a/config/locales/crowdin/he.yml
+++ b/config/locales/crowdin/he.yml
@@ -371,7 +371,7 @@ he:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ he:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: There are currently no custom fields.
no_results_content_text: Create a new custom field
@@ -4915,7 +4921,6 @@ he:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Load the default configuration"
- text_min_max_length_info: "0 means no restriction"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -4930,7 +4935,6 @@ he:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Reassign to work package:"
- text_regexp_info: "למשל ^[A-Z0-9] + $"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/locales/crowdin/hi.yml b/config/locales/crowdin/hi.yml
index d98dda92ce6..75f8010a4ef 100644
--- a/config/locales/crowdin/hi.yml
+++ b/config/locales/crowdin/hi.yml
@@ -371,7 +371,7 @@ hi:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ hi:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: There are currently no custom fields.
no_results_content_text: Create a new custom field
@@ -4811,7 +4817,6 @@ hi:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Load the default configuration"
- text_min_max_length_info: "0 means no restriction"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -4826,7 +4831,6 @@ hi:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Reassign to work package:"
- text_regexp_info: "eg. ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/locales/crowdin/hr.yml b/config/locales/crowdin/hr.yml
index 62246a2fd00..71fb74508f9 100644
--- a/config/locales/crowdin/hr.yml
+++ b/config/locales/crowdin/hr.yml
@@ -371,7 +371,7 @@ hr:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ hr:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Trenutno nije dostupno niti jedno prilagođeno polje.
no_results_content_text: Novo prilagođeno polje
@@ -4864,7 +4870,6 @@ hr:
text_length_between: "Duljina između %{min} i %{max} znakova."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Učitaj zadanu konfiguraciju"
- text_min_max_length_info: "0 znači da nema ograničenja"
text_no_roles_defined: Nema definiranih rola.
text_no_access_tokens_configurable: "Ne postoje pristupni tokeni koji mogu biti konfigurirani."
text_no_configuration_data: "Role, tipovi, statusi radnih paketa i tijek rada nisu konfiguirani. Preporuka je da učitate zadanu konfiguraciju. Moći ćete ju modificirati naokn što se učita."
@@ -4879,7 +4884,6 @@ hr:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Dodijeli radnom paketu:"
- text_regexp_info: "npr. ^[A-Z0-9] + $"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Primjenjeno na changeset %{value}."
diff --git a/config/locales/crowdin/hu.yml b/config/locales/crowdin/hu.yml
index f24f3dd9296..4318a979c16 100644
--- a/config/locales/crowdin/hu.yml
+++ b/config/locales/crowdin/hu.yml
@@ -370,7 +370,7 @@ hu:
contained_in_type: "A típus tartalmazza"
confirm_destroy_option: "Egy opció törlése az összes eddigi használatánál (úgy, mint munkacsomagok) is törlődnek. Biztosan törölni szeretné?"
reorder_alphabetical: "Név szerinti sorrendbe rendezés"
- reorder_confirmation: "Figyelmeztetés: A rendelkezésre álló értékek jelenlegi sorrendje elveszik. Folytatni akarod?\n"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -397,6 +397,12 @@ hu:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Jelenleg nincsenek egyéni mezők.
no_results_content_text: Új egyéni mező létrehozása
@@ -4811,7 +4817,6 @@ hu:
text_length_between: "%{min} és %{max} karakter közötti hosszúságú."
text_line_separated: "A többszörös érték adás megengedett (minden érték külön sorban)."
text_load_default_configuration: "Az alapértelmezett konfiguráció betöltése"
- text_min_max_length_info: "0 azt jelenti, hogy nincs korlátozás"
text_no_roles_defined: Nincsenek szerepkörök meghatározva.
text_no_access_tokens_configurable: "Nincs hozzáférési token, amely konfigurálható."
text_no_configuration_data: "Szerepkörök, típusok, a feladatcsoport állapotok és a munkafolyamatok nincsenek beállítva. Erősen ajánlott, az alapértelmezett konfiguráció betöltése. Akkor képes lesz arra, hogy módosítsa."
@@ -4826,7 +4831,6 @@ hu:
text_powered_by: "Készítette %{link}"
text_project_identifier_info: "Csak kisbetű (a-z), számok, kötőjelek és aláhúzásjelek van engedélyezve, és kisbetűvel kell kezdődnie."
text_reassign: "A munkacsomag ismételt hozzárendelése:"
- text_regexp_info: "pl. ^[A-Z0-9]+$"
text_regexp_multiline: 'A reguláris kifejezés többsoros módban legyen alkalmazva. pld. ^---\s+'
text_repository_usernames_mapping: "Jelölje be, vagy frissítse az alkalmazás felhasználóit, minden felhasználónév eltárolva, megtalálhatóak a csomagtároló naplóban. A felhasználók ugyanazzal az alkalmazási és csomagtárolói felhasználó névvel vagy email címmel automatikusan tárolódnak."
text_status_changed_by_changeset: "A %{value} commit-ban hozzáadva."
diff --git a/config/locales/crowdin/id.yml b/config/locales/crowdin/id.yml
index 433944465fc..08518a0762e 100644
--- a/config/locales/crowdin/id.yml
+++ b/config/locales/crowdin/id.yml
@@ -367,7 +367,7 @@ id:
contained_in_type: "Terkandung dalam jenis"
confirm_destroy_option: "Menghapus sebuah pilihan akan menghapus semua kemunculan yang terjadi (mis. dalam paket pekerjaan). Apakah Anda yakin ingin menghapusnya?"
reorder_alphabetical: "Susun ulang nilai menurut abjad"
- reorder_confirmation: "Peringatan: Urutan nilai yang tersedia saat ini akan hilang. Melanjutkan?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -394,6 +394,12 @@ id:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Tidak ada bidang kustom saat ini.
no_results_content_text: Buat bidang kustom baru
@@ -4755,7 +4761,6 @@ id:
text_length_between: "Panjang antara %{min} dan %{max} karakter."
text_line_separated: "Jika ada beberapa nilai, satu baris untuk tiap nilai."
text_load_default_configuration: "Pakai konfigurasi default"
- text_min_max_length_info: "0 berarti tidak ada pembatasan"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Role, Tipe, status Paket-Penugasan dan Alur-Tugas belum dikonfigurasi. Disarankan untuk menggunakan konfigurasi default. Anda bisa mengubahnya setelah konfigurasi dibuat."
@@ -4770,7 +4775,6 @@ id:
text_powered_by: "Didukung oleh %{link}"
text_project_identifier_info: "Hanya huruf kecil (a-z), angka, garis dan garis bawah yang diperbolehkan, harus diawali dengan huruf kecil."
text_reassign: "Reassign to work package:"
- text_regexp_info: "spt. ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Pilih atau update user untuk dipetakan ke setiap username yang ditemukan di log repositori. User dengan username dan repositori atau email yang sama otomatis akan dipetakan."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml
index 1ba759e4c85..f2ee735185c 100644
--- a/config/locales/crowdin/it.yml
+++ b/config/locales/crowdin/it.yml
@@ -369,7 +369,7 @@ it:
contained_in_type: "Contenuto nel tipo"
confirm_destroy_option: "L'eliminazione di un'opzione eliminerà tutte le sue occorrenze (ad es. nelle macro-attività). Procedere all'eliminazione?"
reorder_alphabetical: "Riordina i valori alfabeticamente"
- reorder_confirmation: "Attenzione: l'ordine corrente dei valori disponibili sarà perso. Continuare?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Prima è necessario selezionare la macro-attività o il progetto"
calculated_field_not_editable: "Attributo non modificabile. Questo valore viene calcolato automaticamente."
no_role_assigment: "Nessuna assegnazione di ruolo"
@@ -396,6 +396,12 @@ it:
Consenti l'utilizzo del campo personalizzato in un filtro nelle visualizzazioni delle macro-attività. Tieni presente che solo con l'opzione "Per tutti i progetti" selezionata, il campo personalizzato verrà visualizzato nelle visualizzazioni globali.
formula:
project: "Aggiungi valori numerici o digita / per cercare un attributo o un operatore matematico."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Al momento non esistono campi personalizzati.
no_results_content_text: Crea un nuovo campo personalizzato
@@ -4810,7 +4816,6 @@ it:
text_length_between: "Lunghezza compresa tra %{min} e %{max} caratteri."
text_line_separated: "Valori multipli consentiti (una linea per ogni valore)."
text_load_default_configuration: "Carica la configurazione predefinita"
- text_min_max_length_info: "0 significa nessuna restrizione"
text_no_roles_defined: Non ci sono ruoli definiti.
text_no_access_tokens_configurable: "Non sono presenti token di accesso che possono essere configurati."
text_no_configuration_data: "Ruoli, tipi, stati delle macro-attività e flusso di lavoro non sono stati ancora configurati. Si consiglia di caricare la configurazione predefinita. Sarà possibile modificarla in seguito."
@@ -4825,7 +4830,6 @@ it:
text_powered_by: "Offerto da %{link}"
text_project_identifier_info: "Solo le lettere minuscole (a-z), numeri, trattini e trattini bassi sono consentiti, devi iniziare con una lettera maiuscola."
text_reassign: "Riassegna alla macro-attività:"
- text_regexp_info: "es. ^[A-Z0-9]+$"
text_regexp_multiline: 'L''espressione regolare viene applicata in modalità multi-linea. ad esempio, ^---\s+'
text_repository_usernames_mapping: "Seleziona o aggiorna l'utente OpenProject mappato per ogni nome utente trovato nel registro dell'archivio. Gli utenti con lo stesso nome utente e repository OpenProject o e-mail vengono mappati automaticamente."
text_status_changed_by_changeset: "Stato variato a partire dalla modifica %{value}."
diff --git a/config/locales/crowdin/ja.yml b/config/locales/crowdin/ja.yml
index 2239181cf32..9db06a1e734 100644
--- a/config/locales/crowdin/ja.yml
+++ b/config/locales/crowdin/ja.yml
@@ -369,7 +369,7 @@ ja:
contained_in_type: "タイプに含まれる"
confirm_destroy_option: "オプションを削除すると、そのすべての派生 (例えばワークパッケージ) が削除されます。削除してもよろしいですか?"
reorder_alphabetical: "値をアルファベット順に並べ替える"
- reorder_confirmation: "警告:利用可能な値の現在の順序は失われます。続行しますか?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "最初にワークパッケージまたはプロジェクトの選択が必要です"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -396,6 +396,12 @@ ja:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: 現在、カスタム フィールドはありません。
no_results_content_text: 新しいカスタム フィールドを作成
@@ -4761,7 +4767,6 @@ ja:
text_length_between: "長さは%{min}から%{max}文字までです。"
text_line_separated: "(1行ごとに書くことで)複数の値を設定できます。"
text_load_default_configuration: "デフォルト設定をロード"
- text_min_max_length_info: "0だと無制限になります。"
text_no_roles_defined: 役割が定義されていません。
text_no_access_tokens_configurable: "設定できるアクセストークンがありません。"
text_no_configuration_data: "ロール、ワークパッケージのステータスとタイプ、ワークフローが未設定です。\nデフォルト設定のロードを強くお勧めします。ロードした後、それを修正することができます。"
@@ -4776,7 +4781,6 @@ ja:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "アルファベット小文字(a-z)・数字・ハイフン・アンダースコアが使えます。アルファベット小文字で始まる必要があります。"
text_reassign: "ワークパッケージへの再割り当て:"
- text_regexp_info: "例) ^[A-Z0-9]+$"
text_regexp_multiline: '正規表現は、複数行モードで適用されます。例えば、^---\s+'
text_repository_usernames_mapping: "リポジトリのログから検出されたユーザ名をどのOpenProjectユーザに関連づけるかを選択してください。\nログ上のユーザ名またはメールアドレスがOpenProjectのユーザと一致する場合は自動的に関連づけます。"
text_status_changed_by_changeset: "変更履歴%{value}で適用されました。"
diff --git a/config/locales/crowdin/ka.yml b/config/locales/crowdin/ka.yml
index 59a064cfe85..c5d0df294c1 100644
--- a/config/locales/crowdin/ka.yml
+++ b/config/locales/crowdin/ka.yml
@@ -371,7 +371,7 @@ ka:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ ka:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: There are currently no custom fields.
no_results_content_text: Create a new custom field
@@ -4813,7 +4819,6 @@ ka:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Load the default configuration"
- text_min_max_length_info: "0 means no restriction"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -4828,7 +4833,6 @@ ka:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Reassign to work package:"
- text_regexp_info: "eg. ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/locales/crowdin/kk.yml b/config/locales/crowdin/kk.yml
index 19353915eef..aecbc892661 100644
--- a/config/locales/crowdin/kk.yml
+++ b/config/locales/crowdin/kk.yml
@@ -371,7 +371,7 @@ kk:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ kk:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: There are currently no custom fields.
no_results_content_text: Create a new custom field
@@ -4813,7 +4819,6 @@ kk:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Load the default configuration"
- text_min_max_length_info: "0 means no restriction"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -4828,7 +4833,6 @@ kk:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Reassign to work package:"
- text_regexp_info: "eg. ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml
index 96e751cd7df..e7a8200c047 100644
--- a/config/locales/crowdin/ko.yml
+++ b/config/locales/crowdin/ko.yml
@@ -371,7 +371,7 @@ ko:
contained_in_type: "타입에 포함됨."
confirm_destroy_option: "옵션을 삭제하면 모든 해당 항목(예: 작업 패키지 내 모든 항목)이 삭제됩니다. 그래도 삭제하시겠습니까?"
reorder_alphabetical: "알파벳순으로 값 재정렬"
- reorder_confirmation: "경고: 사용 가능한 값의 현재 순서가 손실됩니다. 계속하시겠습니까?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "먼저 작업 패키지 또는 프로젝트를 선택해야 합니다"
calculated_field_not_editable: "편집할 수 없는 특성입니다. 이 값은 자동으로 계산됩니다."
no_role_assigment: "역할 할당 없음"
@@ -398,6 +398,12 @@ ko:
작업 패키지 보기의 필터에서 사용자 지정 필드를 사용할 수 있도록 허용합니다. '모든 프로젝트용'을 선택한 경우에만 사용자 지정 필드가 글로벌 보기에 표시됩니다.
formula:
project: "숫자 값을 추가하거나 /를 입력하여 특성 또는 수학 연산자를 검색합니다."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: 사용자 필드가 없습니다.
no_results_content_text: 새 사용자 필드 생성
@@ -4759,7 +4765,6 @@ ko:
text_length_between: "%{min} ~ %{max}자 사이의 길이"
text_line_separated: "여러 값이 허용됩니다(각 값에 대해 한 줄)."
text_load_default_configuration: "기본 구성 로드"
- text_min_max_length_info: "0은 제한이 없음을 의미함"
text_no_roles_defined: 정의된 역할이 없습니다.
text_no_access_tokens_configurable: "구성할 수 있는 액세스 토큰이 없습니다."
text_no_configuration_data: "역할, 유형, 작업 패키지 상태 및 워크플로가 아직 구성되지 않았습니다.\n기본 구성을 로드하는 것이 좋습니다. 로드한 후에 수정할 수 있습니다."
@@ -4774,7 +4779,6 @@ ko:
text_powered_by: "%{link} 제공"
text_project_identifier_info: "소문자(a-z), 숫자, 대시(-) 및 밑줄(_)만 허용됩니다. 소문자로 시작해야 합니다."
text_reassign: "작업 패키지에 다시 할당:"
- text_regexp_info: "예: ^[A-Z0-9]+$"
text_regexp_multiline: '멀티라인 모드에서 정규식이 적용됩니다. 예, e.g., ^---\s+'
text_repository_usernames_mapping: "리포지토리 로그에 있는 각 사용자 이름에 매핑된 OpenProject 사용자를 선택하거나 업데이트하세요.\n동일한 OpenProject 및 리포지토리 사용자 이름이나 이메일을 가진 사용자가 자동으로 매핑됩니다."
text_status_changed_by_changeset: "변경 집합 %{value}에 적용되었습니다."
diff --git a/config/locales/crowdin/lt.yml b/config/locales/crowdin/lt.yml
index fd3fcbf1110..65917ab2720 100644
--- a/config/locales/crowdin/lt.yml
+++ b/config/locales/crowdin/lt.yml
@@ -368,7 +368,7 @@ lt:
contained_in_type: "Laikomas tipe"
confirm_destroy_option: "Ištrinant savybę, visi jos panaudojimai (pvz., darbų paketuose) taip pat bus ištrinti. Ar Jūs tikrai norite ištrinti?"
reorder_alphabetical: "Perrikiuoti reikšmes alfabeto tvarka"
- reorder_confirmation: "Dėmesio: Dabartinė galimų reikšmių tvarka bus prarasta. Tęsti?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -395,6 +395,12 @@ lt:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Nėra jokių pasirinktinų laukų.
no_results_content_text: Sukurti naują pasirinktinį lauką
@@ -4909,7 +4915,6 @@ lt:
text_length_between: "Ilgis tarp %{min} ir %{max} simbolių."
text_line_separated: "Galimos kelios reikšmės (viena eilutė vienai reikšmei)."
text_load_default_configuration: "Įkelti numatytąją konfigūraciją"
- text_min_max_length_info: "0 reiškia jokių apribojimų"
text_no_roles_defined: Nėra nustatytų vaidmenų.
text_no_access_tokens_configurable: "Nėra prieigos raktų, kurie gali būti konfigūruojami."
text_no_configuration_data: "Vaidmenys, tipai, darbų paketo būsenos ir darbų eiga dar nesukonfigūruoti. Stipriai rekomenduojama įkelti numatytąją konfigūraciją. Jūs ją galėsite redaguoti iškart po įkėlimo."
@@ -4924,7 +4929,6 @@ lt:
text_powered_by: "Parengta pagal %{link}"
text_project_identifier_info: "Leidžiamos tik mažosios raidės (a-z), skaitmenys, paprasti (-) ir žemi brūkšneliai (_). Taip pat privalo prasidėti mažąja raide."
text_reassign: "Iš naujo priskirti darbų paketui:"
- text_regexp_info: "pvz., ^[A-Z0-9]+$"
text_regexp_multiline: 'Reguliarioji išraiška yra pritaikoma daug eilučių režime, pvz., ^---\s+'
text_repository_usernames_mapping: "Parinkite ar atnaujinkite OpenProject naudotoją, kuris paminėtas repozitorijos žurnale.\nNaudotojai, turintys tą patį OpenProject ir repozitorijos vardą ar el. paštą yra automatiškai surišti."
text_status_changed_by_changeset: "Atlikta pakeitimų pakete %{value}."
diff --git a/config/locales/crowdin/lv.yml b/config/locales/crowdin/lv.yml
index 75c4c216598..a34189c9bac 100644
--- a/config/locales/crowdin/lv.yml
+++ b/config/locales/crowdin/lv.yml
@@ -371,7 +371,7 @@ lv:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ lv:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Pašlaik nav neviena pielāgota lauka.
no_results_content_text: Izveidot jaunu pielāgotu lauku
@@ -4864,7 +4870,6 @@ lv:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Load the default configuration"
- text_min_max_length_info: "0 nozīmē, ka nekādu ierobežojumu"
text_no_roles_defined: Nav nevienas definētas lomas.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -4879,7 +4884,6 @@ lv:
text_powered_by: "Darbojas uz %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Reassign to work package:"
- text_regexp_info: "eg. ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/locales/crowdin/mn.yml b/config/locales/crowdin/mn.yml
index 1fb4c103116..28ee62a8af5 100644
--- a/config/locales/crowdin/mn.yml
+++ b/config/locales/crowdin/mn.yml
@@ -371,7 +371,7 @@ mn:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ mn:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: There are currently no custom fields.
no_results_content_text: Create a new custom field
@@ -4813,7 +4819,6 @@ mn:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Load the default configuration"
- text_min_max_length_info: "0 means no restriction"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -4828,7 +4833,6 @@ mn:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Reassign to work package:"
- text_regexp_info: "eg. ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/locales/crowdin/ms.yml b/config/locales/crowdin/ms.yml
index 0e50c55d3ad..602b28bfe98 100644
--- a/config/locales/crowdin/ms.yml
+++ b/config/locales/crowdin/ms.yml
@@ -370,7 +370,7 @@ ms:
contained_in_type: "Terkandung dalam jenis"
confirm_destroy_option: "Padamkan satu pilihan akan memadamkan semua kejadian yang berkaitan dengannya (cth. dalam pakej kerja). Adakah anda pasti anda ingin memadamkannya?"
reorder_alphabetical: "Susun semula nilai mengikut abjad"
- reorder_confirmation: "Amaran: Susunan semasa nilai yang sedia ada akan hilang. Teruskan?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -397,6 +397,12 @@ ms:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Tiada ruangan tersuai pada masa ini.
no_results_content_text: Cipta ruangan tersuai baharu
@@ -4759,7 +4765,6 @@ ms:
text_length_between: "Panjang aksara antara %{min} dan %{max}."
text_line_separated: "Lebihan nilai dibenarkan (satu baris untuk setiap nilai)."
text_load_default_configuration: "Muatkan konfigurasi default"
- text_min_max_length_info: "0 bermakna tiada had"
text_no_roles_defined: Tiada peranan ditentukan.
text_no_access_tokens_configurable: "Tiada token akses yang boleh dikonfigurasikan."
text_no_configuration_data: "Peranan, jenis, status pakej kerja dan aliran kerja belum dikonfigurasikan lagi. Sangat disarankan untuk memuatkan konfigurasi default. Anda akan dapat mengubahnya setelah ianya dimuatkan."
@@ -4774,7 +4779,6 @@ ms:
text_powered_by: "Dikuasakan oleh %{link}"
text_project_identifier_info: "Hanya huruf kecil (a-z), nombor, sengkang dan tanda garis bawah adalah dibenarkan, mesti mula dengan huruf kecil."
text_reassign: "Tugaskan semula ke pakej kerja:"
- text_regexp_info: "cth. ^[A-Z0-9]+$"
text_regexp_multiline: 'Regex digunakan dalam mod berbilang baris. cth., ^---\s+'
text_repository_usernames_mapping: "Pilih atau kemas kini pengguna OpenProject yang dipetakan ke setiap nama pengguna yang ditemui dalam log repositori.\nPengguna dengan OpenProject dan nama pengguna repositori atau e-mel yang sama dipetakan secara automatik. "
text_status_changed_by_changeset: "Dilaksanakan dalam set perubahan %{value}."
diff --git a/config/locales/crowdin/ne.yml b/config/locales/crowdin/ne.yml
index 8e2b6ffbb2b..6b5a0594889 100644
--- a/config/locales/crowdin/ne.yml
+++ b/config/locales/crowdin/ne.yml
@@ -371,7 +371,7 @@ ne:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ ne:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: There are currently no custom fields.
no_results_content_text: Create a new custom field
@@ -4813,7 +4819,6 @@ ne:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Load the default configuration"
- text_min_max_length_info: "0 means no restriction"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -4828,7 +4833,6 @@ ne:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Reassign to work package:"
- text_regexp_info: "eg. ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/locales/crowdin/nl.yml b/config/locales/crowdin/nl.yml
index 1e30bccd038..e3c22f1e8e1 100644
--- a/config/locales/crowdin/nl.yml
+++ b/config/locales/crowdin/nl.yml
@@ -368,7 +368,7 @@ nl:
contained_in_type: "Opgenomen in type"
confirm_destroy_option: "Het verwijderen van een optie zal alle voorkomingen verwijderen. Weet u zeker dat u deze optie wilt verwijderen?"
reorder_alphabetical: "Rangschik waarden alfabetisch"
- reorder_confirmation: "Waarschuwing: De huidige volgorde van beschikbare waarden zal verloren gaan. Doorgaan?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Werkpakket- of projectselectie is eerst vereist"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -395,6 +395,12 @@ nl:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Momenteel zijn er geen aangepaste velden.
no_results_content_text: Maak een nieuw aangepast veld
@@ -4808,7 +4814,6 @@ nl:
text_length_between: "Lengte tussen %{min} en %{max} karakters."
text_line_separated: "Meerdere waarden toegestaan (één regel voor elke waarde)."
text_load_default_configuration: "De standaardconfiguratie laden"
- text_min_max_length_info: "0 betekent geen beperking"
text_no_roles_defined: Er zijn geen rollen gedefinieerd.
text_no_access_tokens_configurable: "Er zijn geen toegangstokens die kunnen worden geconfigureerd."
text_no_configuration_data: "Rollen, types, werkpakket statussen en workflow zijn nog niet geconfigureerd.\nHet wordt ten zeerste aangeraden om de standaard configuratie te laden. U kunt deze wijzigen zodra het is geladen."
@@ -4823,7 +4828,6 @@ nl:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Alleen kleine letters (a-z), cijfers, streepjes en underscores (_) zijn toegestaan, moet beginnen met een kleine letter."
text_reassign: "Opnieuw toewijzen aan werkpakket:"
- text_regexp_info: "bijv. ^[A-Z0-9]+$"
text_regexp_multiline: 'De regex wordt toegepast in een modus met meerdere regels. bijvoorbeeld, ^---\s+'
text_repository_usernames_mapping: "Selecteer of update de gebruiker van de OpenProject gelinkt aan elke gebruikersnaam gevonden in het repository log. Gebruikers met de zelfde OpenProject en repository gebruikersnaam of e-mail worden automatisch gelinkt."
text_status_changed_by_changeset: "Toegepast in changeset %{value}."
diff --git a/config/locales/crowdin/no.yml b/config/locales/crowdin/no.yml
index 5cc1466fe0c..635f993fd89 100644
--- a/config/locales/crowdin/no.yml
+++ b/config/locales/crowdin/no.yml
@@ -371,7 +371,7 @@
contained_in_type: "Type beholdt"
confirm_destroy_option: "Sletting av et alternativ vil slette alle forekomster (f.eks i arbeidspakker). Er du sikker på at du vil slette den?"
reorder_alphabetical: "Omorganiser verdier alfabetisk"
- reorder_confirmation: "Advarsel: Gjeldende rekkefølge for tilgjengelige verdier vil gå tapt. Vil du fortsette?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Det er ingen egendefinerte felt for øyeblikket.
no_results_content_text: Opprett nytt egendefinert felt
@@ -4812,7 +4818,6 @@
text_length_between: "Lengde mellom %{min} og %{max} tegn."
text_line_separated: "Flere verdier tillatt (en verdi pr. linje)."
text_load_default_configuration: "Last inn standardoppsettet"
- text_min_max_length_info: "0 betyr ingen restriksjoner"
text_no_roles_defined: Det er ingen roller definert.
text_no_access_tokens_configurable: "Det finnes ingen tilgangsnøkler som kan konfigureres."
text_no_configuration_data: "Roller, typer, arbeidspakkestatuser og arbeidsflyt har ikke blitt satt opp ennå.\nDet er sterkt anbefalt å laste standardoppsettet. Du kan redigere disse når de er lastet inn."
@@ -4827,7 +4832,6 @@
text_powered_by: "Driftes med %{link}"
text_project_identifier_info: "Kun små bokstaver (a-z), tall, bindestrek og understrek er tillatt. Første tegn må være liten bokstav."
text_reassign: "Tilordne til arbeidspakke:"
- text_regexp_info: "f.eks. ^[A-Z0-9]+$"
text_regexp_multiline: 'Denne regexen brukes i flerlinjemodus. f.eks ^---\s+'
text_repository_usernames_mapping: "Velg eller oppdater OpenProject-brukeren knyttet til hvert enkelt brukernavn i pakkebrønn-loggen.\nBrukere med samme OpenProject- og pakkebrønn-brukernavn eller e-post tilknyttes automatisk."
text_status_changed_by_changeset: "Benyttet i changeset %{value}."
diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml
index 1666b360d91..110f4f82ad5 100644
--- a/config/locales/crowdin/pl.yml
+++ b/config/locales/crowdin/pl.yml
@@ -368,7 +368,7 @@ pl:
contained_in_type: "Zawartość"
confirm_destroy_option: "Usunięcie tej opcji spowoduje usunięcie wszystkich powiązanych wystąpień (np. w Work Package). Czy na pewno chcesz to usunąć?"
reorder_alphabetical: "Ustaw kolejność wartości alfabetycznie"
- reorder_confirmation: "Ostrzeżenie: Bieżąca kolejność dostępnych wartości zostanie utracona. Kontynuować?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "W pierwszej kolejności wymagany jest wybór pakietu roboczego lub projektu"
calculated_field_not_editable: "Atrybut nieedytowalny. Ta wartość jest obliczana automatycznie."
no_role_assigment: "Brak przypisanie roli"
@@ -395,6 +395,12 @@ pl:
Zezwól na użycie pola niestandardowego w filtrze w widokach pakietów roboczych. Pamiętaj, że pole niestandardowe będzie wyświetlane w widokach globalnych dopiero po zaznaczeniu opcji „Dla wszystkich projektów”.
formula:
project: "Dodaj wartości liczbowe lub wpisz „/”, aby wyszukać atrybut lub operator matematyczny."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Nie ma jeszcze żadnych pól użytkownika.
no_results_content_text: Utwórz pole użytkownika
@@ -4908,7 +4914,6 @@ pl:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Wiele wartości dopuszczalne (jeden wiersz dla każdej wartości)."
text_load_default_configuration: "Załaduj domyślną konfigurację"
- text_min_max_length_info: "0 means no restriction"
text_no_roles_defined: Nie ma żadnych zdefiniowanych uprawnień.
text_no_access_tokens_configurable: "Brak tokenów dostępu, które mogą być skonfigurowane."
text_no_configuration_data: "Role, typy, statusy pakietów roboczych i przepływ pracy nie zostały jeszcze skonfigurowane.\nZalecane jest załadowanie domyślnej konfiguracji. Będzie można ją zmodyfikować po załadowaniu."
@@ -4923,7 +4928,6 @@ pl:
text_powered_by: "Napędzany przez %{link}"
text_project_identifier_info: "Tylko małe litery (a-z), cyfry, myślniki i podkreślenia są dozwolone, oraz musi zaczynać się małą literą."
text_reassign: "Ponowne przydzielenie do Zestawu zadań:"
- text_regexp_info: "np. ^[A-Z0-9]+$"
text_regexp_multiline: 'Wyrażenie regularne jest stosowane w trybie wielolinijkowym. np. ^---\s+'
text_repository_usernames_mapping: "Wybierz lub zaktualizuj użytkownika OpenProject do każdego użytkownika w dzienniku repozytorium.\nUżytkownicy z tym samym loginem lub adresem e-mail w OpenProject i repozytorium są automatycznie mapowani."
text_status_changed_by_changeset: "Zastosowane w zbiorze zmian %{value}."
diff --git a/config/locales/crowdin/pt-BR.yml b/config/locales/crowdin/pt-BR.yml
index 5e932333b38..d3639339c28 100644
--- a/config/locales/crowdin/pt-BR.yml
+++ b/config/locales/crowdin/pt-BR.yml
@@ -370,7 +370,7 @@ pt-BR:
contained_in_type: "Contido no tipo"
confirm_destroy_option: "Removendo uma opção removerá todas as suas ocorrências (ex. em pacotes de trabalho). Tem certeza que você quer removê-la?"
reorder_alphabetical: "Reorganizar valores em ordem alfabética"
- reorder_confirmation: "Aviso: A ordem atual dos valores disponíveis será perdida. Continuar?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Primeiro é necessária a seleção do pacote de trabalho ou projeto"
calculated_field_not_editable: "Atributo não editável. O valor é calculado automaticamente."
no_role_assigment: "Nenhuma atribuição de função"
@@ -397,6 +397,12 @@ pt-BR:
Permite que o campo personalizado seja usado como filtro nas visualizações de pacotes de trabalho. Observe que apenas com a opção "Para todos os projetos" selecionada o campo personalizado aparecerá nas visualizações globais.
formula:
project: "Adicione valores numéricos ou digite / para buscar um atributo ou um operador matemático."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Atualmente, não há campos personalizados.
no_results_content_text: Criar um novo campo personalizado
@@ -4809,7 +4815,6 @@ pt-BR:
text_length_between: "Tamanho entre %{min} e %{max} caracteres."
text_line_separated: "Vários valores permitidos (uma linha para cada valor)."
text_load_default_configuration: "Carregar a configuração padrão"
- text_min_max_length_info: "0 significa nenhuma restrição"
text_no_roles_defined: Não há nenhuma função definida.
text_no_access_tokens_configurable: "Não há nenhum token de acesso que pode ser configurado."
text_no_configuration_data: "Papéis, tipos, situação do pacote de trabalho e fluxo de trabalho não foram configurados ainda. É altamente recomendável carregar a configuração padrão. Uma vez carregada, você será capaz de modificá-la."
@@ -4824,7 +4829,6 @@ pt-BR:
text_powered_by: "Desenvolvido por %{link}"
text_project_identifier_info: "Apenas letras minúsculas (a-z), números, hífens e sublinhados são permitidos, deve-se começar com uma letra minúscula."
text_reassign: "Reatribua ao pacote de trabalho:"
- text_regexp_info: "ex. ^[A-Z0-9]+$"
text_regexp_multiline: 'A expressão regular é aplicada no modo multilinha. Por exemplo: ^---\s+'
text_repository_usernames_mapping: "Selecionar ou atualizar o usuário do OpenProject mapeado para cada nome de usuário encontrado no log do repositório. Os usuários com o mesmo nome de usuário OpenProject e repositório ou e-mail serão mapeados automaticamente."
text_status_changed_by_changeset: "Aplicado no conjunto de alterações %{value}."
diff --git a/config/locales/crowdin/pt-PT.yml b/config/locales/crowdin/pt-PT.yml
index 204a3dfd898..da681fdcad7 100644
--- a/config/locales/crowdin/pt-PT.yml
+++ b/config/locales/crowdin/pt-PT.yml
@@ -369,7 +369,7 @@ pt-PT:
contained_in_type: "Incluído no tipo"
confirm_destroy_option: "Apagar uma opção irá apagar todas as suas ocorrências (ex. em pacotes de trabalho). Tem certeza que quer apagá-la?"
reorder_alphabetical: "Reordenar valores em ordem alfabética"
- reorder_confirmation: "Aviso: A ordem atual de valores disponíveis será perdida. Continuar?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "A seleção do pacote de trabalho ou do projeto é necessária em primeiro lugar"
calculated_field_not_editable: "Atributo não editável. Este valor é calculado automaticamente."
no_role_assigment: "Sem atribuição de funções"
@@ -396,6 +396,12 @@ pt-PT:
Permita que o campo personalizado seja utilizado num filtro nas vistas do pacote de trabalho. Note que apenas com a opção "Para todos os projetos" selecionada, o campo personalizado irá aparecer nas vistas globais.
formula:
project: "Adicione valores numéricos ou escreva / para procurar um atributo ou um operador matemático."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Atualmente, não existem campos personalizados.
no_results_content_text: Criar um novo campo personalizado
@@ -4807,7 +4813,6 @@ pt-PT:
text_length_between: "Comprimento entre %{min} e %{max} caráteres."
text_line_separated: "Múltiplos valores permitidos (uma linha para cada valor)."
text_load_default_configuration: "Carregar a configuração por defeito"
- text_min_max_length_info: "0 significa sem restrições"
text_no_roles_defined: Não existem papéis definidos.
text_no_access_tokens_configurable: "Não há tokens de acesso que possam ser configurados."
text_no_configuration_data: "Os papéis, tipos, estados de pacotes de trabalho e o fluxo de trabalho ainda não foram configurados.\nÉ recomendado carregar as configurações padrão. Poderá modificá-las depois de estarem carregadas."
@@ -4822,7 +4827,6 @@ pt-PT:
text_powered_by: "Desenvolvido por %{link}"
text_project_identifier_info: "Apenas letras minúsculas (a-z), números, traços e underscores são permitidos, deve começar com uma letra minúscula."
text_reassign: "Reatribuir pacote de trabalho:"
- text_regexp_info: "ex. ^[A-Z0-9]+$"
text_regexp_multiline: 'Regex é aplicado num modo de várias linhas. por exemplo, ^---\s+'
text_repository_usernames_mapping: "Selecionar ou atualizar o utilizador de OpenProjecto mapeado a cada nome de utilizador encontrado no repositório.\nUtilizadores com o mesmo nome de utilizador ou e-mail no OpenProject e no repositório são mapeados automaticamente."
text_status_changed_by_changeset: "Aplicado no changeset %{value}."
diff --git a/config/locales/crowdin/ro.yml b/config/locales/crowdin/ro.yml
index b7b5e1d5ce2..4e3eb277c00 100644
--- a/config/locales/crowdin/ro.yml
+++ b/config/locales/crowdin/ro.yml
@@ -371,7 +371,7 @@ ro:
contained_in_type: "Înclusă în tipul"
confirm_destroy_option: "Ștergerea unei opțiuni va șterge toate aparițiile acesteia (de exemplu, în pachetele de lucru). Sunteți sigur că doriți să o ștergeți?"
reorder_alphabetical: "Reordonează valorile alfabetic"
- reorder_confirmation: "Avertisment: Ordinea curentă a valorilor disponibile se va pierde. Continuați?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ ro:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: În acest moment nu există câmpuri personalizate.
no_results_content_text: Creează câmp personalizat nou
@@ -4863,7 +4869,6 @@ ro:
text_length_between: "Lungime între %{min} şi %{max} de caractere."
text_line_separated: "Sunt permise valori multiple (un rând pentru fiecare valoare)."
text_load_default_configuration: "Încărcare configurația implicită"
- text_min_max_length_info: "0 înseamnă eliminarea restricției"
text_no_roles_defined: Nu există roluri definite.
text_no_access_tokens_configurable: "Nu există tichete de acces care pot fi configurate."
text_no_configuration_data: "Rolurile, tipurile, stările pachetelor de lucru și fluxul de lucru nu au fost configurate încă.\nEste recomandat să încărcați configurația implicită. Veți putea să o modificați după ce e încărcată."
@@ -4878,7 +4883,6 @@ ro:
text_powered_by: "Propulsat de %{link}"
text_project_identifier_info: "Doar litere mici (a-z), numere, cratime şi linii de subliniere sunt permise, trebuie să înceapă cu o literă mică."
text_reassign: "Reatribuire la pachetul de lucru:"
- text_regexp_info: "ex. ^[A-Z0-9]+$"
text_regexp_multiline: 'Formula regex este aplicată într-un mod multilinie - de exemplu: ^---\s+'
text_repository_usernames_mapping: "Selectați sau modificați contul OpenProject mapat la fiecare cont din istoricul repo-ului.\nUtilizatorii cu cont sau e-mail identic în OpenProject și repo sunt echivalați automat."
text_status_changed_by_changeset: "Aplicat prin editarea %{value}."
diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml
index 40a68ea5541..c781a70a291 100644
--- a/config/locales/crowdin/ru.yml
+++ b/config/locales/crowdin/ru.yml
@@ -370,7 +370,7 @@ ru:
contained_in_type: "Содержится в типе"
confirm_destroy_option: "Удаление опции приведет к удалению всех ее вхождений (например, в пакеты работ). Вы уверены, что вы хотите удалить ее?"
reorder_alphabetical: "Переупорядочить значения по алфавиту"
- reorder_confirmation: "Внимание: Текущий порядок доступных значений будет утерян. Продолжить?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Сначала необходимо выбрать пакет работ или проект"
calculated_field_not_editable: "Не редактируемый атрибут. Это значение рассчитывается автоматически."
no_role_assigment: "Роль не назначена"
@@ -397,6 +397,12 @@ ru:
Разрешить использовать пользовательское поле в качестве фильтра в представлениях пакетов работ. Обратите внимание, что только при выборе опции 'Для всех проектов' пользовательское поле будет отображаться в глобальных представлениях.
formula:
project: "Добавьте числовые значения или введите / для поиска атрибута или математического оператора."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Нет настраиваемых полей.
no_results_content_text: Создать новое настраиваемое поле
@@ -4910,7 +4916,6 @@ ru:
text_length_between: "Количество символов между %{min} и %{max} ."
text_line_separated: "Допускается несколько значений (одна строка для каждого значения)."
text_load_default_configuration: "Загрузить конфигурацию по умолчанию"
- text_min_max_length_info: "0 означает отсутствие ограничений"
text_no_roles_defined: Роли не определены.
text_no_access_tokens_configurable: "Маркеры доступа, которые могут быть настроены, отсутствуют."
text_no_configuration_data: "Роли, типы, статусы пакетов работ и рабочие потоки еще не сконфигурированы. Настоятельно рекомендуем для правки загрузить конфигурацию по умолчанию."
@@ -4925,7 +4930,6 @@ ru:
text_powered_by: "С использованием %{link}"
text_project_identifier_info: "Разрешены только строчные буквы (a-z), цифры, тире и знаки подчеркивания, начинать с буквы нижнего регистра."
text_reassign: "Переназначить для пакета работ:"
- text_regexp_info: "например: ^[A-Z0-9]+$"
text_regexp_multiline: 'Регулярное выражение применяется в многострочном режиме. Например: ^---\s+'
text_repository_usernames_mapping: "Выберете или обновите пользователя OpenProject сопоставленного с именами пользователей найдеными в журнале репозитория. Пользователи с одинаковыми именами в OpenProject и в репозитории или почте будут сопоставлены автоматически."
text_status_changed_by_changeset: "Применены в наборе изменений %{value}."
@@ -5026,7 +5030,7 @@ ru:
reset_failed_logins: "Сброс неудачных попыток входа"
status_user_and_brute_force: "%{user} и %{brute_force}"
status_change: "Смена статуса"
- text_change_disabled_for_provider_login: "The name and email is set by your login provider and can thus not be changed."
+ text_change_disabled_for_provider_login: "Это имя и адрес электронной почты заданы вашим поставщиком авторизации, поэтому их нельзя изменить."
unlock: "Разблокировать"
unlock_and_reset_failed_logins: "Разблокировать и сбросить неудачные попытки входа"
error_cannot_delete_user: "User cannot be deleted"
diff --git a/config/locales/crowdin/rw.yml b/config/locales/crowdin/rw.yml
index 11f40e893d7..cff23b51616 100644
--- a/config/locales/crowdin/rw.yml
+++ b/config/locales/crowdin/rw.yml
@@ -371,7 +371,7 @@ rw:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ rw:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: There are currently no custom fields.
no_results_content_text: Create a new custom field
@@ -4813,7 +4819,6 @@ rw:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Load the default configuration"
- text_min_max_length_info: "0 means no restriction"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -4828,7 +4833,6 @@ rw:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Reassign to work package:"
- text_regexp_info: "eg. ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/locales/crowdin/si.yml b/config/locales/crowdin/si.yml
index 183c50e6783..8fb5ca8e25d 100644
--- a/config/locales/crowdin/si.yml
+++ b/config/locales/crowdin/si.yml
@@ -371,7 +371,7 @@ si:
contained_in_type: "වර්ගය අඩංගු"
confirm_destroy_option: "විකල්පයක් මකා දැමීමෙන් එහි සියලු සිදුවීම් මකා දමනු ඇත (උදා: වැඩ පැකේජවල). ඔබට එය මකා දැමීමට අවශ්ය බව ඔබට විශ්වාසද?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ si:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: දැනට අභිරුචි ක්ෂේත්ර නොමැත.
no_results_content_text: නව අභිරුචි ක්ෂේත්රයක් සාදන්න
@@ -4813,7 +4819,6 @@ si:
text_length_between: "%{min} සහ %{max} අක්ෂර අතර දිග."
text_line_separated: "බහු අගයන් අවසර දී ඇත (එක් එක් අගය සඳහා එක් රේඛාවක්)."
text_load_default_configuration: "පෙරනිමි වින්යාසය පටවන්න"
- text_min_max_length_info: "0 යනු සීමා කිරීමක් නොවේ"
text_no_roles_defined: අර්ථ දක්වා ඇති භූමිකාවන් නොමැත.
text_no_access_tokens_configurable: "වින්යාසගත කළ හැකි ප්රවේශ ටෝකන නොමැත."
text_no_configuration_data: "භූමිකාවන්, වර්ග, වැඩ පැකේජ තත්වයන් සහ කාර්ය ප්රවාහය තවමත් වින්යාස කර නොමැත.\nපෙරනිමි වින්යාසය පූරණය කිරීම අතිශයින් රෙකමදාරු කරනු ලැබේ. පටවන ලද පසු එය වෙනස් කිරීමට ඔබට හැකි වනු ඇත."
@@ -4828,7 +4833,6 @@ si:
text_powered_by: "%{link}විසින් තල්ලු"
text_project_identifier_info: "අඩු සිද්ධි අකුරු (a-z), අංක, ඩෂ් සහ යටි ඉරි වලට පමණක් අවසර ඇත, අඩු සිද්ධි අකුරකින් ආරම්භ කළ යුතුය."
text_reassign: "වැඩ පැකේජයට නැවත පැවරීම:"
- text_regexp_info: "උදා: ^[A-Z0-9]+$"
text_regexp_multiline: 'රීජෙක්ස් බහු රේඛා මාදිලියක යොදනු ලැබේ. උදා: ^ —\ s+'
text_repository_usernames_mapping: "ගබඩාවේ ඇති එක් එක් පරිශීලක නාමයට සිතියම් ගත කර ඇති OpenProject පරිශීලකයා තෝරන්න හෝ යාවත්කාලීන කරන්න.\nඑකම OpenProject සහ ගබඩාව පරිශීලක නාමය හෝ විද්යුත් තැපෑල සහිත පරිශීලකයින් ස්වයංක්රීයව සිතියම් ගත කරනු ලැබේ."
text_status_changed_by_changeset: "%{value}හි ව්යවහාරික වේ."
diff --git a/config/locales/crowdin/sk.yml b/config/locales/crowdin/sk.yml
index adb962291ff..89accc3a2e0 100644
--- a/config/locales/crowdin/sk.yml
+++ b/config/locales/crowdin/sk.yml
@@ -371,7 +371,7 @@ sk:
contained_in_type: "Obsiahnuté v type"
confirm_destroy_option: "Odstránením hodnoty sa odstránia všetky predtým nastavené hodnoty (napríklad pre pracovné balíčky). Naozaj chcete odstrániť hodnotu?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ sk:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Momentálne nie sú k dispozícií žiadne vlastné polia.
no_results_content_text: Vytvoriť nové vlastné pole
@@ -4914,7 +4920,6 @@ sk:
text_length_between: "Dĺžka medzi %{min} až %{max} znakov."
text_line_separated: "Je povolené zadať viaceré hodnoty (každú hodnotu na samostatný riadok)."
text_load_default_configuration: "Nahrať predvolenú konfiguráciu"
- text_min_max_length_info: "0 znamená bez obmedzení"
text_no_roles_defined: Nie sú definované žiadne role.
text_no_access_tokens_configurable: "Neexistujú žiadne Prístupové Tokeny, ktoré môžu byť konfigurované."
text_no_configuration_data: "Roly, typy, pracovný balík stavy a pracovný postup zatiaľ neboli nakonfigurované. Doporučujeme načítať predvolenú konfiguráciu. Po je jnačítaní ju budete mať možnosť zmeniť podľa Vašich potrieb."
@@ -4929,7 +4934,6 @@ sk:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Sú povolené len malé písmená (a-z), čísla, pomlčky a podčiarkovníky, hodnota musí začínať malým písmenom."
text_reassign: "Zaradenie do pracovného balíčka:"
- text_regexp_info: "napr. ^[A-Z0-9]+$"
text_regexp_multiline: 'Regex je aplikovaný v režime s viacerými riadkami. napríklad ^---\s+'
text_repository_usernames_mapping: "Vyberte alebo aktualizujte priradenie používateľov systému OpenProject k menám používateľov nájdených v zázname repozitára.\nPoužívatelia s rovnakým prihlasovacím menom alebo emailom v systéme OpenProject a repozitári sú priradení automaticky."
text_status_changed_by_changeset: "Aplikované v súbore zmien %{value}."
diff --git a/config/locales/crowdin/sl.yml b/config/locales/crowdin/sl.yml
index f9da0cb5665..9045509cb70 100644
--- a/config/locales/crowdin/sl.yml
+++ b/config/locales/crowdin/sl.yml
@@ -370,7 +370,7 @@ sl:
contained_in_type: "Vsebovano v vrstah"
confirm_destroy_option: "Če izbrišete možnost, boste izbrisali vse njene primere (npr. v delovnih paketih). Ali ste prepričani, da ga želite izbrisati?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -397,6 +397,12 @@ sl:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Trenutno ni poslovnih procesov
no_results_content_text: Ustvarite novo uporabniško lastnost
@@ -4913,7 +4919,6 @@ sl:
text_length_between: "Dolžina med %{min} in %{max} znakov."
text_line_separated: "Dovoljenih več vrednosti (ena vrstica za vsako vrednost)."
text_load_default_configuration: "Naloži privzeto konfiguracijo"
- text_min_max_length_info: "0 pomeni brez omejitev"
text_no_roles_defined: Nobene vloge ni definirane
text_no_access_tokens_configurable: "Dostopnih žetonov ni mogoče konfigurirati."
text_no_configuration_data: "Vloge, vrste, statusi delovnega paketa in potek dela še niso konfigurirani.\nZelo priporočljivo je, da naložite privzeto konfiguracijo. Ko ga boste naložili, ga boste lahko spremenili."
@@ -4928,7 +4933,6 @@ sl:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Dovoljene so samo male črke (a-z), številke, črtice in podčrtaji, ki se začnejo z malo začetnico."
text_reassign: "Ponovno dodelitev delovnemu paketu:"
- text_regexp_info: "npr. ^[A-Z0-9]+$"
text_regexp_multiline: 'Označba se uporablja v večvrstičnem načinu. npr. ^ --- \ s +'
text_repository_usernames_mapping: "Izberite ali posodobite uporabnika OpenProject, vezanega na vsako uporabniško ime, ki ga najdete v dnevniku repozitorija.\nUporabniki z istim uporabniškim imenom ali e-poštnim imenom skladišča OpenProject se samodejno povežejo."
text_status_changed_by_changeset: "Dodano v zapis sprememb %{value}."
diff --git a/config/locales/crowdin/sr.yml b/config/locales/crowdin/sr.yml
index 1b501fa19c9..c5a95f75504 100644
--- a/config/locales/crowdin/sr.yml
+++ b/config/locales/crowdin/sr.yml
@@ -371,7 +371,7 @@ sr:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ sr:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: There are currently no custom fields.
no_results_content_text: Create a new custom field
@@ -4864,7 +4870,6 @@ sr:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Load the default configuration"
- text_min_max_length_info: "0 means no restriction"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -4879,7 +4884,6 @@ sr:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Reassign to work package:"
- text_regexp_info: "eg. ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/locales/crowdin/sv.yml b/config/locales/crowdin/sv.yml
index a34a5dd21b6..37c98ba2e2a 100644
--- a/config/locales/crowdin/sv.yml
+++ b/config/locales/crowdin/sv.yml
@@ -371,7 +371,7 @@ sv:
contained_in_type: "Ingår i typ"
confirm_destroy_option: "Radering av ett alternativ kommer radera alla förekomster (i arbetspaket). Är du säker på att du vill radera?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ sv:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Det finns för närvarande inga anpassade fält.
no_results_content_text: Skapa ett nytt anpassat fält
@@ -4811,7 +4817,6 @@ sv:
text_length_between: "Längd mellan %{min} och %{max} tecken."
text_line_separated: "Flera värden tillåtna (en rad för varje värde)."
text_load_default_configuration: "Ladda standardkonfigurationen"
- text_min_max_length_info: "0 innebär ingen begränsning"
text_no_roles_defined: Det har inte definierats några roller.
text_no_access_tokens_configurable: "Det finns inga åtkomstnycklar som kan konfigureras."
text_no_configuration_data: "Roller, typer, status för arbetspaket och arbetsflöden har inte konfigurerats ännu. Det rekommenderas starkt att läsa in standardkonfigurationen. Du kommer att kunna ändra dem när de är initialiserade."
@@ -4826,7 +4831,6 @@ sv:
text_powered_by: "Drivs av %{link}"
text_project_identifier_info: "Bara gemena bokstäver (a-z), siffror, bindestreck och understreck tillåts och måste dessutom börja med en gemen bokstav."
text_reassign: "Tilldela till arbetspaket:"
- text_regexp_info: "t.ex. ^[A-Z0-9]+$"
text_regexp_multiline: 'Regex appliceras i flerradsläge. t.ex. ^---\s+'
text_repository_usernames_mapping: "Välj eller uppdatera OpenProject användaren koppling till varje användarnamn i versionsarkivloggen. Användare med samma användarnamn eller E-post i OpenProject och versionsarkivet kopplas automatiskt."
text_status_changed_by_changeset: "Tillämpad i uppdatering %{value}."
diff --git a/config/locales/crowdin/th.yml b/config/locales/crowdin/th.yml
index d9db65c8fde..342f9710148 100644
--- a/config/locales/crowdin/th.yml
+++ b/config/locales/crowdin/th.yml
@@ -371,7 +371,7 @@ th:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ th:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: There are currently no custom fields.
no_results_content_text: Create a new custom field
@@ -4762,7 +4768,6 @@ th:
text_length_between: "ความยาวระหว่าง %{min} จนถึง %{max} ตัวอักษร"
text_line_separated: "อนุญาตให้มีหลายค่าได้ (หนึ่งค่าต่อหนึ่งบรรทัด)"
text_load_default_configuration: "โหลดการกำหนดค่าเริ่มต้น"
- text_min_max_length_info: "0 หมายถึง ไม่มีข้อจำกัด"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -4777,7 +4782,6 @@ th:
text_powered_by: "ดำเนินการโดย %{link}"
text_project_identifier_info: "ใช้ได้เฉพาะตัวพิมพ์เล็ก (a-z), ตัวเลข เส้นประ และขีดใต้ โดย ต้องเริ่มต้น ด้วยตัวอักษรพิมพ์เล็กเท่านั้น"
text_reassign: "Reassign to work package:"
- text_regexp_info: "ต.ย. เช่น ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "มีการนำไปใช้ในชุดการเปลี่ยนแปลง %{value}"
diff --git a/config/locales/crowdin/tr.yml b/config/locales/crowdin/tr.yml
index caec81b968d..64c1bc18901 100644
--- a/config/locales/crowdin/tr.yml
+++ b/config/locales/crowdin/tr.yml
@@ -372,7 +372,7 @@ tr:
contained_in_type: "Kullanıldığı tipler"
confirm_destroy_option: "Bir seçeneğin silinmesi, kullanıldığı her yerden (örneğin iş paketleri) silinmesine neden olur. Silmek istediğinizden emin misiniz?"
reorder_alphabetical: "Değerleri alfabetik olarak yeniden sıralayın"
- reorder_confirmation: "Uyarı: Mevcut değerlerin sırası kaybolacak. Devam et?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Öncelikle iş paketi veya proje seçimi gereklidir"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -399,6 +399,12 @@ tr:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Şu anda özel bir alan bulunmamakta.
no_results_content_text: Yeni bir özel alan oluştur
@@ -1049,7 +1055,6 @@ tr:
title: "İş paketi paylaşımı için iş akışı eksik"
message: "'İş paketi düzenleyicisi' rolü için hiçbir iş akışı yapılandırılmamıştır. Bir iş akışı olmadan, paylaşılan kullanıcı iş paketinin durumunu değiştiremez. İş akışları kopyalanabilir. Bir kaynak türü (örn. 'Görev') ve kaynak rolü (örn. 'Üye') seçin. Ardından hedef türleri seçin. Başlangıç olarak, tüm türleri hedef olarak seçebilirsiniz. Son olarak, hedef olarak 'İş paketi düzenleyicisi' rolünü seçin ve 'Kopyala' düğmesine basın. Varsayılanları bu şekilde oluşturduktan sonra, diğer tüm roller için yaptığınız gibi iş akışlarında ince ayar yapın."
link_message: "İş akışlarını yönetim alanından yapılandırın."
- templated_subject_hint: '%{type} türü aracılığıyla otomatik olarak oluşturulur'
summary:
reports:
category:
@@ -3237,7 +3242,6 @@ tr:
label_duplicate: "kopya"
label_duplicates: "kopyalayan"
label_edit: "Düzenle"
- label_edit_attribute: "Özellikleri düzenle"
label_edit_x: "Düzenle: %{x}"
label_enable_multi_select: "Çoklu seçimi etkinleştir"
label_enabled_project_custom_fields: "Etkin özel alanlar"
@@ -4813,7 +4817,6 @@ tr:
text_length_between: "%{min} ve %{max} karakter arası uzunluk."
text_line_separated: "Birden fazla değer kullanılabilir (her değer için bir satır)."
text_load_default_configuration: "Varsayılan yapılandırmayı yükle"
- text_min_max_length_info: "0 sınırlama yok demektir"
text_no_roles_defined: Hiçbir rol tanımlanmadı.
text_no_access_tokens_configurable: "Yapılandırılacak erişim belirteçleri yok."
text_no_configuration_data: "Roller, türleri, çalışma paketi durumu ve iş akışı henüz yapılandırılmadı. Varsayılan yapılandırmayı yüklemeniz kesinlikle önerilir. Yüklendikten sonra onu değiştirebileceksiniz."
@@ -4828,7 +4831,6 @@ tr:
text_powered_by: "%{link} tarafından destekleniyor"
text_project_identifier_info: "Yalnızca küçük harfler (a-z), sayılar, tire ve alt tire kullanılabilir ve mutlaka küçük harfle başlamalıdır."
text_reassign: "İş paketine yeniden atama:"
- text_regexp_info: "ör ^[A-Z0-9]+$"
text_regexp_multiline: 'Regex (düzenli ifade) birden çok satırlı modda uygulanır. Örneğin, ^---\s+'
text_repository_usernames_mapping: "Depo günlüklerinde bulunan her kullanıcı adına eşlenen OpenProject kullanıcısını seçin veya güncelleyin. Aynı OpenProject ve depo kullanıcı adına veya e-postasına sahip kullanıcılar otomatik olarak eşleştirilir."
text_status_changed_by_changeset: "Uygulanan Değişiklik listesi %{value}."
diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml
index 498683128a3..3bf4941d57d 100644
--- a/config/locales/crowdin/uk.yml
+++ b/config/locales/crowdin/uk.yml
@@ -368,7 +368,7 @@ uk:
contained_in_type: "Міститься за типом"
confirm_destroy_option: "Видалення опції призведе до видалення всіх його подій (наприклад, у робочих пакетах). Дійсно видалити його?"
reorder_alphabetical: "Перевпорядкувати значення за алфавітом"
- reorder_confirmation: "Увага! Поточний порядок доступних значень буде втрачено. Продовжити?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Спочатку потрібно вибрати пакет робіт або проєкт"
calculated_field_not_editable: "Атрибут не підлягає редагуванню. Його значення обчислюється автоматично."
no_role_assigment: "Роль не призначено"
@@ -395,6 +395,12 @@ uk:
Дозвольте використовувати користувацьке поле у фільтрі в поданнях пакетів робіт. Зверніть увагу: користувацьке поле відображатиметься в глобальних поданнях, лише якщо встановлено прапорець «Для всіх проєктів».
formula:
project: "Додайте числові значення або введіть «/» для пошуку атрибута чи математичного оператора."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Наразі немає спеціальних полів.
no_results_content_text: Створіть нове спеціальне поле
@@ -4907,7 +4913,6 @@ uk:
text_length_between: "Довжина між %{min} і %{max} символів."
text_line_separated: "Дозволено кілька значень (по одному значенню в рядок)."
text_load_default_configuration: "Завантажити Конфігурацію по замовчуванню"
- text_min_max_length_info: "0 означає відсутність заборон"
text_no_roles_defined: Не визначено жодної ролі.
text_no_access_tokens_configurable: "Немає маркерів доступу, які можна налаштувати."
text_no_configuration_data: "Роль, типи, пакет робочі статуси і процес ще не налаштований.\nНастійно рекомендується завантажити налаштування за замовчуванням. Ви зможете змінити його тільки один раз."
@@ -4922,7 +4927,6 @@ uk:
text_powered_by: "Працює на %{link}"
text_project_identifier_info: "Допускаються тільки рядкові малі букви (a-z), цифри, тире та нижнє підкреслення. Початок має бути з малої літери."
text_reassign: "Перепризначити робочому пакету:"
- text_regexp_info: "наприклад ^[A-Z0-9]+$"
text_regexp_multiline: 'Реестр застосовується в багаторядковому режимі. наприклад, --- ---'
text_repository_usernames_mapping: "Виберіть або оновіть користувача OpenProject, зіставленого з кожним ім'ям користувача в журналі репозиторію.\nКористувачі з таким самим ім'ям користувача або електронною поштою OpenProject автоматично відображаються."
text_status_changed_by_changeset: " Застосовується в наборі змін %{value}"
diff --git a/config/locales/crowdin/uz.yml b/config/locales/crowdin/uz.yml
index 640417758ab..d05ed66c2a9 100644
--- a/config/locales/crowdin/uz.yml
+++ b/config/locales/crowdin/uz.yml
@@ -371,7 +371,7 @@ uz:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -398,6 +398,12 @@ uz:
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: There are currently no custom fields.
no_results_content_text: Create a new custom field
@@ -4813,7 +4819,6 @@ uz:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Load the default configuration"
- text_min_max_length_info: "0 means no restriction"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -4828,7 +4833,6 @@ uz:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Reassign to work package:"
- text_regexp_info: "eg. ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/locales/crowdin/vi.yml b/config/locales/crowdin/vi.yml
index fc6e0760f26..b82944a4b7c 100644
--- a/config/locales/crowdin/vi.yml
+++ b/config/locales/crowdin/vi.yml
@@ -371,7 +371,7 @@ vi:
contained_in_type: "Chứa trong loại"
confirm_destroy_option: "Xóa một tùy chọn sẽ xóa tất cả các sự kiện của nó (ví dụ như trong các gói công việc). Bạn có chắc bạn muốn xóa bỏ nó?"
reorder_alphabetical: "Sắp xếp lại các giá trị theo thứ tự bảng chữ cái"
- reorder_confirmation: "Cảnh báo: Thứ tự hiện tại của các giá trị sẵn có sẽ bị mất. Tiếp tục?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Lựa chọn gói công việc hoặc dự án là bắt buộc trước tiên"
calculated_field_not_editable: "Thuộc tính không thể chỉnh sửa. Giá trị này được tính toán tự động."
no_role_assigment: "Không phân công vai trò"
@@ -398,6 +398,12 @@ vi:
Cho phép sử dụng trường tùy chỉnh trong bộ lọc trong chế độ xem gói công việc. Lưu ý rằng chỉ khi chọn 'Dành cho tất cả dự án', trường tùy chỉnh sẽ hiển thị ở chế độ xem chung.
formula:
project: "Thêm giá trị số hoặc nhập / để tìm kiếm thuộc tính hoặc toán tử toán học."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: Không có hiện tại không có trường tùy chỉnh.
no_results_content_text: Tạo trường tùy chỉnh mới
@@ -4760,7 +4766,6 @@ vi:
text_length_between: "Độ dài từ %{min} đến %{max} ký tự."
text_line_separated: "Cho phép nhiều giá trị (mỗi giá trị một dòng)."
text_load_default_configuration: "Tải cấu hình mặc định"
- text_min_max_length_info: "0 có nghĩa là không hạn chế"
text_no_roles_defined: Không có vai trò nào được xác định.
text_no_access_tokens_configurable: "Không có mã thông báo truy cập nào có thể được cấu hình."
text_no_configuration_data: "Vai trò, loại, trạng thái gói công việc và quy trình làm việc chưa được định cấu hình.\nRất khuyến khích tải cấu hình mặc định. Bạn sẽ có thể sửa đổi nó sau khi tải."
@@ -4775,7 +4780,6 @@ vi:
text_powered_by: "Được cung cấp bởi %{link}"
text_project_identifier_info: "Chỉ cho phép chữ cái viết thường (a-z), số, dấu gạch ngang và dấu gạch dưới, phải bắt đầu bằng chữ cái viết thường."
text_reassign: "Phân công lại cho gói công việc:"
- text_regexp_info: "ví dụ. ^[A-Z0-9]+$"
text_regexp_multiline: 'Biểu thức được áp dụng ở chế độ đa dòng. Ví dụ: ^---\s+'
text_repository_usernames_mapping: "Chọn hoặc cập nhật người dùng OpenProject được ánh xạ tới từng tên người dùng được tìm thấy trong nhật ký kho lưu trữ.\nNgười dùng có cùng tên người dùng hoặc email của OpenProject và kho lưu trữ sẽ được tự động ánh xạ."
text_status_changed_by_changeset: "Được áp dụng trong bộ thay đổi %{value}."
diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml
index 5ed139bb3e6..a0d82978d49 100644
--- a/config/locales/crowdin/zh-CN.yml
+++ b/config/locales/crowdin/zh-CN.yml
@@ -368,7 +368,7 @@ zh-CN:
contained_in_type: "已包含在类型中"
confirm_destroy_option: "删除某个选项将会删除其所有实例 (例如, 在工作包中)。确定要删除?"
reorder_alphabetical: "按字母顺序重新排序"
- reorder_confirmation: "警告:可用值的当前顺序将丢失。是否继续?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "需要先选择工作包或项目"
calculated_field_not_editable: "不可编辑属性。此值是自动计算的。"
no_role_assigment: "无角色指定"
@@ -395,6 +395,12 @@ zh-CN:
允许在工作包视图的筛选器中使用自定义字段。请注意,仅当选中“适用于所有项目”时,自定义字段才会显示在全局视图中。
formula:
project: "添加数值或输入 / 以搜索特性或数学运算符。"
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: 目前没有自定义字段。
no_results_content_text: 创建新的自定义字段
@@ -4753,7 +4759,6 @@ zh-CN:
text_length_between: "长度介于 %{min} 和 %{max} 个字符。"
text_line_separated: "允许有多个值 (每行一个值)。"
text_load_default_configuration: "加载默认配置"
- text_min_max_length_info: "0 表示没有限制"
text_no_roles_defined: 没有定义的角色。
text_no_access_tokens_configurable: "没有可配置的访问令牌。"
text_no_configuration_data: "角色、类型、工作包状态和工作流尚未配置。\n强烈建议加载默认配置。之后您可以再进行修改。"
@@ -4768,7 +4773,6 @@ zh-CN:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "只有小写字母 (a-z)、 数字、 短划线和下划线被允许,必须以小写字母开头。"
text_reassign: "重新分配工作包:"
- text_regexp_info: "例如 ^ [A-Z0-9]+$"
text_regexp_multiline: '以多行模式应用正则表达式,如 ^---\s+'
text_repository_usernames_mapping: "选择或更新每个在存储库日志中发现的用户名所映射到的 OpenProject 用户。\n使用相同 OpenProject 和存储库用户名或电子邮件的用户已被自动映射。"
text_status_changed_by_changeset: "被实施在更改集 %{value} 中。"
diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml
index 4edf86f9037..6aeecef53fe 100644
--- a/config/locales/crowdin/zh-TW.yml
+++ b/config/locales/crowdin/zh-TW.yml
@@ -370,7 +370,7 @@ zh-TW:
contained_in_type: "已包含在類型中"
confirm_destroy_option: "刪除此選項將會刪除其所有出現位置(例如:工作套件中的該選項)。您確定要刪除嗎?"
reorder_alphabetical: "按字母順序重新排列"
- reorder_confirmation: "警告:目前可用值的順序將會遺失。繼續嗎?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "需要先選擇工作套件或專案"
calculated_field_not_editable: "不可編輯屬性。此值會自動計算。"
no_role_assigment: "無角色指派"
@@ -397,6 +397,12 @@ zh-TW:
允許在工作套件檢視的篩選器中使用自訂欄位。請注意,只有選取「針對所有專案」時,自訂欄位才會顯示在全區域檢視中。
formula:
project: "加入數值或輸入 / 搜尋屬性或數學運算符號。"
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: 目前沒有自定義的欄位
no_results_content_text: 建立一個新的自定義欄位
@@ -4756,7 +4762,6 @@ zh-TW:
text_length_between: "長度須介於 %{min} 至 %{max} 個字元"
text_line_separated: "可多行(每行一個值)。"
text_load_default_configuration: "載入預設組態"
- text_min_max_length_info: "0 代表沒有限制"
text_no_roles_defined: 沒有定義的角色
text_no_access_tokens_configurable: "沒有存取令牌(Token)可以被設定。"
text_no_configuration_data: "角色,類型,工作套件狀態與工作流程都尚未設定。\n強烈建議先載入預設值,然後再修改它們。"
@@ -4771,7 +4776,6 @@ zh-TW:
text_powered_by: "由 %{link} 提供"
text_project_identifier_info: "僅允許小寫字母(a-z)、數字、破折號(-) 及底線(_),且必須以小寫字母開頭。"
text_reassign: "重新指派到工作套件:"
- text_regexp_info: "例如: ^[A-Z0-9]+$"
text_regexp_multiline: '這個正規表達式套用在多行模式。 e.g., ^---\s+'
text_repository_usernames_mapping: "選擇或更新與版本庫中的帳號所對應的OpenProject使用者。\n版本庫中與OpenProject的使用者具有相同名稱或email將被自動對應。"
text_status_changed_by_changeset: "已套用至變更列表 %{value} 中。"
diff --git a/config/locales/en.yml b/config/locales/en.yml
index da27489b16a..f50449d83b6 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -573,7 +573,7 @@ en:
contained_in_type: "Contained in type"
confirm_destroy_option: "Deleting an option will delete all of its occurrences (e.g. in work packages). Are you sure you want to delete it?"
reorder_alphabetical: "Reorder values alphabetically"
- reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
+ reorder_confirmation: "Warning: The current order of available values as well as all unsaved values will be lost. Are you sure you want to continue?"
placeholder_version_select: "Work package or project selection is required first"
calculated_field_not_editable: "Non-editable attribute. This value is calculated automatically."
no_role_assigment: "No role assignment"
@@ -601,6 +601,12 @@ en:
Note that only with 'For all projects' selected, the custom field will show up in global views.
formula:
project: "Add numeric values or type / to search for an attribute or a mathematical operator."
+ regexp:
+ all: "eg. ^[A-Z0-9]+$"
+ project: "eg. ^[A-Z0-9]+$"
+ min_max:
+ all: "0 means no restriction"
+ project: "0 means no restriction"
tab:
no_results_title_text: There are currently no custom fields.
@@ -5272,7 +5278,6 @@ en:
text_length_between: "Length between %{min} and %{max} characters."
text_line_separated: "Multiple values allowed (one line for each value)."
text_load_default_configuration: "Load the default configuration"
- text_min_max_length_info: "0 means no restriction"
text_no_roles_defined: There are no roles defined.
text_no_access_tokens_configurable: "There are no access tokens which can be configured."
text_no_configuration_data: "Roles, types, work package statuses and workflow have not been configured yet.\nIt is highly recommended to load the default configuration. You will be able to modify it once loaded."
@@ -5291,7 +5296,6 @@ en:
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
text_reassign: "Reassign to work package:"
- text_regexp_info: "eg. ^[A-Z0-9]+$"
text_regexp_multiline: 'The regex is applied in a multi-line mode. e.g., ^---\s+'
text_repository_usernames_mapping: "Select or update the OpenProject user mapped to each username found in the repository log.\nUsers with the same OpenProject and repository username or email are automatically mapped."
text_status_changed_by_changeset: "Applied in changeset %{value}."
diff --git a/config/routes.rb b/config/routes.rb
index 7b06328b550..fa0494306fc 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -218,6 +218,8 @@ Rails.application.routes.draw do
get :attribute_help_text
put :update_attribute_help_text
+
+ get :list_items
end
scope module: :admin do
@@ -694,6 +696,8 @@ Rails.application.routes.draw do
get :attribute_help_text
put :update_attribute_help_text
+
+ get :list_items
end
resources :items, controller: "/admin/settings/project_custom_fields/hierarchy/items" do
diff --git a/db/migrate/20260223142025_add_view_budgets_to_roles_with_edit_budgets.rb b/db/migrate/20260223142025_add_view_budgets_to_roles_with_edit_budgets.rb
new file mode 100644
index 00000000000..dd8dd468349
--- /dev/null
+++ b/db/migrate/20260223142025_add_view_budgets_to_roles_with_edit_budgets.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+require Rails.root.join("db/migrate/migration_utils/permission_adder")
+
+class AddViewBudgetsToRolesWithEditBudgets < ActiveRecord::Migration[8.1]
+ def up
+ ::Migration::MigrationUtils::PermissionAdder.add(:edit_budgets, :view_budgets)
+ end
+
+ def down
+ # No-op: removing view_budgets could break other functionality
+ end
+end
diff --git a/docs/use-cases/README.md b/docs/use-cases/README.md
index 5fd3e7d98b0..8a824361259 100644
--- a/docs/use-cases/README.md
+++ b/docs/use-cases/README.md
@@ -12,7 +12,7 @@ keywords: use-cases
| ------------------------------------------------------------ | ------------------------------------------------------------ |
| [Meeting management](meeting-management) | With OpenProject's meeting management features, you can structure your meetings, define agendas, assign action items, and keep everything transparent and traceable in one place. Ensure your team stays aligned and decisions are well-documented throughout the project life cycle. Learn how to plan, conduct, and follow up on meetings with OpenProject. |
| [Objectives and Key Results (OKR) framework in OpenProject](okr-management) | Use OpenProject to set strategic goals, break them down into measurable key results, and track progress in a transparent and aligned way. Learn how to manage OKRs, establish relations between goals and results, and embed goal-setting into your project management flow. |
-| [Portfolio management](portfolio-management) | This guide provides detailed step-by-step instruction on how to set up an overview of your project portfolio and create custom reports using the Project Overview, Wiki and the Rich text (WYSIWYG) editor in OpenProject. |
+| [Portfolio management](portfolio-management) | This guide provides detailed step-by-step instruction on how to set up an overview of your project portfolio using OpenProject Portfolios module. |
| [PM² and PMflex project management with OpenProject](project-management-pm2-pmflex) | Learn how to use OpenProject to manage projects with the **PM² methodology**, developed by the European Commission, and its German extension **PMflex**, maintained by the Federal Office of Administration (BVA). Get started with customizable workflows, templates, and collaboration tools to apply these frameworks effectively across all project phases. |
| [Resource management](resource-management) | OpenProject does not have the automated functionality to provide detailed resource management or employee work capacity calculations. This guide with detailed step-by-step instructions introduces a workaround that can provide an avenue to accomplish this manually and visually beyond the features of the Team Planner module. |
| [Implementing Scaled Agile Framework (SAFe) in OpenProject](safe-framework) | Learn how to set up and configure OpenProject to support the Scaled Agile Framework (SAFe) to successfully deliver value to customers using agile practices at scale. |
diff --git a/docs/use-cases/portfolio-management/README.md b/docs/use-cases/portfolio-management/README.md
index eed43032d7c..817ed3bbad3 100644
--- a/docs/use-cases/portfolio-management/README.md
+++ b/docs/use-cases/portfolio-management/README.md
@@ -1,83 +1,106 @@
---
sidebar_navigation:
- title: Portfolio management and custom reporting
- priority: 990
-description: Step-by-step instructions about portfolio management and custom reporting
-keywords: use-case, portfolio management
+ title: Portfolio management
+ priority: 990
+description: Step-by-step instructions on portfolio management with OpenProject
+keywords: use-case, portfolio management, portfolio
---
-# Use Case: Portfolio management and custom reporting options
+# Portfolio management with OpenProject
-If you have a lot of projects running at the same time it can be helpful and even necessary to have a meta-level overview of your projects, keep track of the project status and due dates. With OpenProject you can do just that.
+This use case explains how you can use **portfolio management in OpenProject** to get a **strategic overview across initiatives**, replace ad-hoc spreadsheets with structured reporting, and prepare meaningful insights for leadership. Portfolio management helps you monitor multiple **programs and projects** at a high level, identify risks early, and ensure alignment with organizational goals.
+
+This guide supports you in using:
+
+- the [**Portfolios module** (Enterprise add-on)](../../user-guide/portfolios/) for strategic grouping of workspaces, and
+- complementary reporting options such as **project lists**, filters, and exports.
+
+If you have many projects running at the same time, it can be helpful and even necessary to maintain a meta-level overview, track overall status, and monitor due dates. With OpenProject, you can establish that strategic visibility in a structured and consistent way.
+
+> [!NOTE]
+> This guide assumes that you are using **OpenProject with the Portfolios Enterprise add-on** enabled (Enterprise Cloud or Enterprise on-premises), and that you have permission to view and manage portfolios.
+
+## Overview
+
+When running many projects simultaneously, it becomes difficult to see the full picture:
+
+- You may not have a **single source of truth** for status and progress.
+- Executive reporting can be **manual, inconsistent, and outdated**.
+- You need to focus on **strategic signals** such as risks, timelines, and overall progress rather than operational details.
+
+Portfolio management in OpenProject addresses these challenges by grouping related **programs and projects** into a top-level workspace that provides a **high-level overview**.
+
+Portfolios in OpenProject are special workspaces that allow you to:
+
+- Combine multiple **programs and projects** into a strategic hierarchy
+- Track **aggregated status and progress** across workspaces
+- Use filters and customizable views for reporting
+- Supplement this with project-level lists and exports when needed
+
+## Step-by-step guide
+
+### 1. Navigate to the portfolios overview
+
+Select **Portfolios** from the left hand or global modules menu.
+
+
+
+The overview page lists all portfolios you can access. Use filters, portfolio status, and aggregated status indicators across subitems to quickly assess portfolio health and identify initiatives that require attention.
+
+
+
+### 2. Structure your portfolio
+
+Within a portfolio, add:
+
+- **Programs** to group related strategic initiatives
+- **Projects** for direct portfolio-level tracking
+
+A portfolio can contain programs, projects, or a mix of both. Define a structure that reflects your strategic priorities. Here is an example of a portfolio, which includes programs that in turn contain projects.
+
+
-
-## Create projects overview
+Read more about [portfolio hierarchies](../../user-guide/portfolios/).
-### Access project list
+### 3. Manage portfolio subitems
-To view all projects, first select the **Select a project** dropdown menu, then click on the **Project lists** button.
-You can also get to projects overview by selecting **Projects** from the [global modules](../../user-guide/home/global-modules) menu in the top right corner.
+Use the **Subitems widget** on the portfolio home page to maintain included programs and projects.
-
+
-### Filter and sort projects
+Review and adjust the structure regularly to keep your strategic overview aligned with organizational changes.
-You will see a list of all projects within your organization. You can filter this list by various attributes, such as **Project owner** or **Created on**. Additionally, project custom fields can be used as filters (Enterprise add-on). If you haven't added custom fields yet, follow the instructions [here](../../system-admin-guide/custom-fields/).
+### 4. Use filters and saved views
-
+Configure views and apply filters to focus on relevant information, such as:
-You can further adjust this view by adding or re-arranging columns and changing the sorting order. To sort the project list, click on a column heading, such as **Status**. Read more about [configuring project lists](../../user-guide/projects/project-lists/#configure-project-lists-view).
+- Status
+- Stakeholders
+- Timeline indicators
+- Custom attributes
-After you have adjusted the projects overview to your liking, you can save it,
-[export it](../../user-guide/projects/project-lists/#export-project-lists) or
-[share it with key stakeholders](../../user-guide/projects/project-lists/#share-project-lists).
+
-### Projects in Gantt view
+## Complementary portfolio management features
-You can add a visual component to the overview by clicking on the **Open as Gantt view** button.
+In addition to the Portfolios module, OpenProject provides several features that can enhance your portfolio management and reporting setup.
-
+- [**Project lists**](../../user-guide/projects/project-lists/): Create a filterable overview of all projects across your organization. Adjust columns, sort by status or owner, save views, and share or export them for stakeholder reporting.
-The **Gantt charts** module will open and the selected projects will be displayed in Gantt view.
+- [**Gantt charts**](../../user-guide/gantt-chart/): Open multiple projects in a shared timeline to visualize milestones, overlaps, and dependencies. This supports cross-project timeline discussions.
-
+- **Export options**: Export work package tables or Gantt charts as PDF, XLS, or CSV for formal reporting. Learn more about [exporting work packages](../../user-guide/work-packages/exporting/) and [printing Gantt charts](../../user-guide/gantt-chart/#how-to-print-a-gantt-chart).
-You can configure this view using the button with the three dots in the upper right corner and select **Configure view**. Find out more about [Gantt charts configuration](../../user-guide/gantt-chart/#gantt-chart-configuration).
+- [**Wiki module**](../../user-guide/wiki/): Build structured portfolio reports with embedded work package tables, macros, and dynamic calculations. You can create reporting hubs or dashboards for different initiatives.
-
+- [**Global work packages view**](../../user-guide/home/global-modules/): Analyze work packages across projects to identify overdue milestones, high-priority items, or cross-project risks affecting your portfolio.
-## Create custom reports
+## Outcome
-### Export project reports
+By combining the Portfolios module with structured reporting features, you establish a clear governance layer above your operational projects.
-For creating custom project reports you can use the export function in the work packages table view or in the Gantt charts view.
+Instead of consolidating information manually, you rely on live portfolio data, consistent status structures, and reusable reporting views. Strategic discussions become focused on priorities and risks rather than data collection.
-
-
-You can export the work packages in one of the following formats: PDF, XLS and CSV. Read more about [exporting work packages in OpenProject](../../user-guide/work-packages/exporting/#export-multiple-work-packages).
-
-
-
-To export or print a Gantt chart, use the print function (**CTRL+P**) and then save it as a PDF. Only information displayed in the main screen area is included. Design elements, side menus, and top menus are excluded. Please see here [how to print a Gantt chart in OpenProject](../../user-guide/gantt-chart/#how-to-print-a-gantt-chart).
-
-### Project status reporting
-
-You can [display and configure the individual project status](../../user-guide/projects/project-status/) on the project overview page.
-
-For more advanced project reporting requirements, using the [Wiki module](../../user-guide/wiki/) is another powerful tool. The Wiki allows you to build complete custom reports using embedded work package tables, macros and even embedded calculations.
-
-Here is an example of how a project report wiki could look:
-
-
-
-And how the dynamic data, such as calculations, filters, macros and reference language work behind the scenes:
-
-
-
-For more information about the syntax and how the attributes work, please look [here](../../user-guide/wysiwyg/).
-
-If you want to work with multiple Wiki-based reports, you can create a parent Wiki page as a table of contents, for example, on which all the other reports are listed.
-
-See more info on Wiki and the use of Macros [here](../../user-guide/wiki/).
+This allows you to manage growth, align initiatives with organizational goals, and maintain transparency across your entire project landscape.
\ No newline at end of file
diff --git a/docs/use-cases/portfolio-management/openproject_use_case_portfolios_filters.png b/docs/use-cases/portfolio-management/openproject_use_case_portfolios_filters.png
new file mode 100644
index 00000000000..2e7941cb8f3
Binary files /dev/null and b/docs/use-cases/portfolio-management/openproject_use_case_portfolios_filters.png differ
diff --git a/docs/use-cases/portfolio-management/openproject_use_case_portfolios_filters_detailed.png b/docs/use-cases/portfolio-management/openproject_use_case_portfolios_filters_detailed.png
new file mode 100644
index 00000000000..774d0ed6c0d
Binary files /dev/null and b/docs/use-cases/portfolio-management/openproject_use_case_portfolios_filters_detailed.png differ
diff --git a/docs/use-cases/portfolio-management/openproject_use_case_portfolios_hierarchy_examples.png b/docs/use-cases/portfolio-management/openproject_use_case_portfolios_hierarchy_examples.png
new file mode 100644
index 00000000000..d5f721d82aa
Binary files /dev/null and b/docs/use-cases/portfolio-management/openproject_use_case_portfolios_hierarchy_examples.png differ
diff --git a/docs/use-cases/portfolio-management/openproject_use_case_portfolios_subitems_widget.png b/docs/use-cases/portfolio-management/openproject_use_case_portfolios_subitems_widget.png
new file mode 100644
index 00000000000..3ffb6d7eefd
Binary files /dev/null and b/docs/use-cases/portfolio-management/openproject_use_case_portfolios_subitems_widget.png differ
diff --git a/docs/use-cases/portfolio-management/openproject_use_case_select_portfolios_module.png b/docs/use-cases/portfolio-management/openproject_use_case_select_portfolios_module.png
new file mode 100644
index 00000000000..a714c98ab90
Binary files /dev/null and b/docs/use-cases/portfolio-management/openproject_use_case_select_portfolios_module.png differ
diff --git a/extensions/op-blocknote-hocuspocus/package-lock.json b/extensions/op-blocknote-hocuspocus/package-lock.json
index ea6a539d1af..a5e1eb211ae 100644
--- a/extensions/op-blocknote-hocuspocus/package-lock.json
+++ b/extensions/op-blocknote-hocuspocus/package-lock.json
@@ -10,6 +10,7 @@
"license": "GPLv3",
"dependencies": {
"@blocknote/server-util": "^0.44.2",
+ "@hocuspocus/extension-logger": "^3.4.4",
"@hocuspocus/server": "^3.4.0",
"op-blocknote-extensions": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.0.18/op-blocknote-extensions-0.0.18.tgz",
"tsx": "^4.21.0"
@@ -262,6 +263,7 @@
}
],
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=18"
},
@@ -284,6 +286,7 @@
}
],
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=18"
}
@@ -944,6 +947,7 @@
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz",
"integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@floating-ui/core": "^1.7.3",
"@floating-ui/utils": "^0.2.10"
@@ -999,21 +1003,30 @@
}
},
"node_modules/@hocuspocus/common": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@hocuspocus/common/-/common-3.4.0.tgz",
- "integrity": "sha512-vN0kE/mGTjuwchq16naq+nEjFDmeSLNCkDSAB7DKvpZnuG4KQi5oC42VFdKbq/baQTbDMSe82rI7f9riOR8idQ==",
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/@hocuspocus/common/-/common-3.4.4.tgz",
+ "integrity": "sha512-RykIJ0tsHHMP4Xk+4UCbc7SO5LgGxGUSTdbh6anJEsaALAyqinf1Nn5HYuMjLPolAmsar1v++m9zufR09NLpXA==",
"license": "MIT",
"dependencies": {
"lib0": "^0.2.87"
}
},
- "node_modules/@hocuspocus/server": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@hocuspocus/server/-/server-3.4.0.tgz",
- "integrity": "sha512-ludVWFkos7FgOmdGxn5UxhV7H0K4mMly8mq+wXAK8fOuW+9vrjQDfd23tOOcQPbZ0aGyPC0FMmEZ1GsFpVArCg==",
+ "node_modules/@hocuspocus/extension-logger": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/@hocuspocus/extension-logger/-/extension-logger-3.4.4.tgz",
+ "integrity": "sha512-GEnjmvQlrDlr5hoTQ8NHStZkzpL42wkwZ5XOBMkEX/TgqcnEtKCK1SOK0xj+px9tEHaflDLtCq6f5oy4gOCkPQ==",
"license": "MIT",
"dependencies": {
- "@hocuspocus/common": "^3.4.0",
+ "@hocuspocus/server": "^3.4.4"
+ }
+ },
+ "node_modules/@hocuspocus/server": {
+ "version": "3.4.4",
+ "resolved": "https://registry.npmjs.org/@hocuspocus/server/-/server-3.4.4.tgz",
+ "integrity": "sha512-UV+oaONAejOzeYgUygNcgsc8RdZvSokVvAxluZJIisLACpRO/VsseQ5lWKDRwLd7Fn6+rHWDH3hGuQ1fdX1Ycg==",
+ "license": "MIT",
+ "dependencies": {
+ "@hocuspocus/common": "^3.4.4",
"async-lock": "^1.3.1",
"async-mutex": "^0.5.0",
"kleur": "^4.1.4",
@@ -1596,6 +1609,7 @@
"resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.13.0.tgz",
"integrity": "sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@shikijs/vscode-textmate": "^10.0.2",
"@types/hast": "^3.0.4"
@@ -1668,6 +1682,7 @@
"resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.13.0.tgz",
"integrity": "sha512-iUelgiTMgPVMpY5ZqASUpk8mC8HuR9FWKaDzK27w9oWip9tuB54Z8mePTxNcQaSPb6ErzEaC8x8egrRt7OsdGQ==",
"license": "MIT",
+ "peer": true,
"funding": {
"type": "github",
"url": "https://github.com/sponsors/ueberdosis"
@@ -1865,6 +1880,7 @@
"resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.13.0.tgz",
"integrity": "sha512-WKR4ucALq+lwx0WJZW17CspeTpXorbIOpvKv5mulZica6QxqfMhn8n1IXCkDws/mCoLRx4Drk5d377tIjFNsvQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"prosemirror-changeset": "^2.3.0",
"prosemirror-collab": "^1.3.1",
@@ -2010,6 +2026,7 @@
"integrity": "sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"undici-types": "~7.16.0"
}
@@ -2105,6 +2122,7 @@
"integrity": "sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "8.48.1",
"@typescript-eslint/types": "8.48.1",
@@ -2439,6 +2457,7 @@
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true,
"license": "MIT",
+ "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -2720,7 +2739,6 @@
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
"integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=6"
}
@@ -2852,8 +2870,7 @@
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
"integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/data-urls": {
"version": "5.0.0",
@@ -2933,8 +2950,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
"integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/devlop": {
"version": "1.1.0",
@@ -3110,6 +3126,7 @@
"integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
@@ -3451,7 +3468,6 @@
"resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
"integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=6"
}
@@ -3945,6 +3961,7 @@
}
],
"license": "MIT",
+ "peer": true,
"dependencies": {
"@babel/runtime": "^7.28.4"
},
@@ -5671,6 +5688,7 @@
"resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.4.tgz",
"integrity": "sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"orderedmap": "^2.0.0"
}
@@ -5700,6 +5718,7 @@
"resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz",
"integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"prosemirror-model": "^1.0.0",
"prosemirror-transform": "^1.0.0",
@@ -5748,6 +5767,7 @@
"resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.3.tgz",
"integrity": "sha512-SqMiYMUQNNBP9kfPhLO8WXEk/fon47vc52FQsUiJzTBuyjKgEcoAwMyF04eQ4WZ2ArMn7+ReypYL60aKngbACQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"prosemirror-model": "^1.20.0",
"prosemirror-state": "^1.0.0",
@@ -5836,7 +5856,6 @@
"resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.4.tgz",
"integrity": "sha512-wOmoNZoOpvMminhifQYiYSTCLUDOiUbBunrMrMjA+dV52sY+vck1S4UhR6PkgnoCquvvMSeJjErXZ4qSaWCliA==",
"license": "MIT",
- "peer": true,
"peerDependencies": {
"react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
@@ -5847,7 +5866,6 @@
"resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz",
"integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==",
"license": "MIT",
- "peer": true,
"dependencies": {
"react-remove-scroll-bar": "^2.3.7",
"react-style-singleton": "^2.2.3",
@@ -5873,7 +5891,6 @@
"resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz",
"integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==",
"license": "MIT",
- "peer": true,
"dependencies": {
"react-style-singleton": "^2.2.2",
"tslib": "^2.0.0"
@@ -5896,7 +5913,6 @@
"resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
"integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==",
"license": "MIT",
- "peer": true,
"dependencies": {
"get-nonce": "^1.0.0",
"tslib": "^2.0.0"
@@ -5919,7 +5935,6 @@
"resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.9.tgz",
"integrity": "sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@babel/runtime": "^7.20.13",
"use-composed-ref": "^1.3.0",
@@ -6185,8 +6200,7 @@
"version": "0.27.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
"integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/semver": {
"version": "7.7.3",
@@ -7068,7 +7082,6 @@
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
"integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
"license": "(MIT OR CC0-1.0)",
- "peer": true,
"engines": {
"node": ">=16"
},
@@ -7254,7 +7267,6 @@
"resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz",
"integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==",
"license": "MIT",
- "peer": true,
"dependencies": {
"tslib": "^2.0.0"
},
@@ -7276,7 +7288,6 @@
"resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.4.0.tgz",
"integrity": "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==",
"license": "MIT",
- "peer": true,
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
},
@@ -7291,7 +7302,6 @@
"resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz",
"integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==",
"license": "MIT",
- "peer": true,
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
},
@@ -7306,7 +7316,6 @@
"resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.3.0.tgz",
"integrity": "sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==",
"license": "MIT",
- "peer": true,
"dependencies": {
"use-isomorphic-layout-effect": "^1.1.1"
},
@@ -7324,7 +7333,6 @@
"resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz",
"integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==",
"license": "MIT",
- "peer": true,
"dependencies": {
"detect-node-es": "^1.1.0",
"tslib": "^2.0.0"
@@ -7408,6 +7416,7 @@
"integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"esbuild": "^0.25.0",
"fdir": "^6.5.0",
@@ -7787,6 +7796,7 @@
"resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.6.tgz",
"integrity": "sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"lib0": "^0.2.85"
},
@@ -7846,6 +7856,7 @@
"resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.27.tgz",
"integrity": "sha512-OIDwaflOaq4wC6YlPBy2L6ceKeKuF7DeTxx+jPzv1FHn9tCZ0ZwSRnUBxD05E3yed46fv/FWJbvR+Ud7x0L7zw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"lib0": "^0.2.99"
},
diff --git a/extensions/op-blocknote-hocuspocus/package.json b/extensions/op-blocknote-hocuspocus/package.json
index 9ffc23cc3f3..53c994eb0e5 100644
--- a/extensions/op-blocknote-hocuspocus/package.json
+++ b/extensions/op-blocknote-hocuspocus/package.json
@@ -24,6 +24,7 @@
},
"dependencies": {
"@blocknote/server-util": "^0.44.2",
+ "@hocuspocus/extension-logger": "^3.4.4",
"@hocuspocus/server": "^3.4.0",
"op-blocknote-extensions": "https://github.com/opf/op-blocknote-extensions/releases/download/v0.0.18/op-blocknote-extensions-0.0.18.tgz",
"tsx": "^4.21.0"
diff --git a/extensions/op-blocknote-hocuspocus/src/extensions/openProjectApi.ts b/extensions/op-blocknote-hocuspocus/src/extensions/openProjectApi.ts
index 134cc767653..ef107e22f82 100644
--- a/extensions/op-blocknote-hocuspocus/src/extensions/openProjectApi.ts
+++ b/extensions/op-blocknote-hocuspocus/src/extensions/openProjectApi.ts
@@ -77,9 +77,6 @@ export class OpenProjectApi implements Extension {
*/
async onLoadDocument(data: onLoadDocumentPayload) {
const { resourceUrl } = data.context;
-
- printLog(`[onLoadDocument] GET ${resourceUrl}`);
-
const response = await fetchResource(resourceUrl, data.context.token);
if (response.status != 200) {
@@ -111,8 +108,6 @@ export class OpenProjectApi implements Extension {
return;
}
- printLog(`[onStoreDocument] PATCH ${resourceUrl}`);
-
const base64Data = Buffer.from(Y.encodeStateAsUpdate(data.document)).toString("base64");
// Create a copy of the document to avoid side effects
diff --git a/extensions/op-blocknote-hocuspocus/src/index.ts b/extensions/op-blocknote-hocuspocus/src/index.ts
index 10f2af827f8..f972be60ad8 100644
--- a/extensions/op-blocknote-hocuspocus/src/index.ts
+++ b/extensions/op-blocknote-hocuspocus/src/index.ts
@@ -1,12 +1,15 @@
+import { Logger } from "@hocuspocus/extension-logger";
import { Server } from "@hocuspocus/server";
import { OpenProjectApi } from "./extensions/openProjectApi";
-
const server = new Server({
port: 1234,
quiet: false,
extensions: [
new OpenProjectApi(),
+ new Logger({
+ onChange: false,
+ }),
],
});
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index ab2ef48df52..b94ddb03e83 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -9,18 +9,18 @@
"version": "0.1.0",
"license": "GPLv3",
"dependencies": {
- "@angular/animations": "^21.1.3",
- "@angular/cdk": "^21.1.3",
- "@angular/cli": "^21.1.3",
- "@angular/common": "^21.1.3",
- "@angular/compiler": "^21.1.3",
- "@angular/compiler-cli": "^21.1.3",
- "@angular/core": "^21.1.3",
- "@angular/elements": "^21.1.3",
- "@angular/forms": "^21.1.3",
- "@angular/platform-browser": "^21.1.3",
- "@angular/platform-browser-dynamic": "^21.1.3",
- "@angular/router": "^21.1.3",
+ "@angular/animations": "^21.1.4",
+ "@angular/cdk": "^21.1.4",
+ "@angular/cli": "^21.1.4",
+ "@angular/common": "^21.1.4",
+ "@angular/compiler": "^21.1.4",
+ "@angular/compiler-cli": "^21.1.4",
+ "@angular/core": "^21.1.4",
+ "@angular/elements": "^21.1.4",
+ "@angular/forms": "^21.1.4",
+ "@angular/platform-browser": "^21.1.4",
+ "@angular/platform-browser-dynamic": "^21.1.4",
+ "@angular/router": "^21.1.4",
"@appsignal/javascript": "^1.6.1",
"@appsignal/plugin-breadcrumbs-console": "^1.1.37",
"@appsignal/plugin-breadcrumbs-network": "^1.1.24",
@@ -130,13 +130,13 @@
},
"devDependencies": {
"@angular-builders/custom-esbuild": "^21.0.3",
- "@angular-devkit/build-angular": "^21.1.3",
+ "@angular-devkit/build-angular": "^21.1.4",
"@angular-eslint/builder": "20.7.0",
"@angular-eslint/eslint-plugin": "20.7.0",
"@angular-eslint/eslint-plugin-template": "20.7.0",
"@angular-eslint/schematics": "20.7.0",
"@angular-eslint/template-parser": "20.7.0",
- "@angular/language-service": "21.1.3",
+ "@angular/language-service": "21.1.4",
"@eslint/js": "^9.39.2",
"@html-eslint/eslint-plugin": "^0.54.2",
"@html-eslint/parser": "^0.54.0",
@@ -648,16 +648,16 @@
}
},
"node_modules/@angular-devkit/build-angular": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-21.1.3.tgz",
- "integrity": "sha512-02mA04tz9UshwPTv8lBkLcMPpMFh7YnAMXM6u0fL558rU7UrBxsm3XfMmDao3f+jT8umA1mDHBx9OW9LIF4Ewg==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-21.1.4.tgz",
+ "integrity": "sha512-2HPCo6vEu5EIwxxFYhnmdfbktRBoOVQD3q7lG9PMQPf/jRCnyIZ70qSbXbAV96IMDLFl8mLRfY4scoaFMIYGMw==",
"dev": true,
"dependencies": {
"@ampproject/remapping": "2.3.0",
- "@angular-devkit/architect": "0.2101.3",
- "@angular-devkit/build-webpack": "0.2101.3",
- "@angular-devkit/core": "21.1.3",
- "@angular/build": "21.1.3",
+ "@angular-devkit/architect": "0.2101.4",
+ "@angular-devkit/build-webpack": "0.2101.4",
+ "@angular-devkit/core": "21.1.4",
+ "@angular/build": "21.1.4",
"@babel/core": "7.28.5",
"@babel/generator": "7.28.5",
"@babel/helper-annotate-as-pure": "7.27.3",
@@ -668,7 +668,7 @@
"@babel/preset-env": "7.28.5",
"@babel/runtime": "7.28.4",
"@discoveryjs/json-ext": "0.6.3",
- "@ngtools/webpack": "21.1.3",
+ "@ngtools/webpack": "21.1.4",
"ansi-colors": "4.1.3",
"autoprefixer": "10.4.23",
"babel-loader": "10.0.0",
@@ -723,7 +723,7 @@
"@angular/platform-browser": "^21.0.0",
"@angular/platform-server": "^21.0.0",
"@angular/service-worker": "^21.0.0",
- "@angular/ssr": "^21.1.3",
+ "@angular/ssr": "^21.1.4",
"@web/test-runner": "^0.20.0",
"browser-sync": "^3.0.2",
"jest": "^30.2.0",
@@ -780,12 +780,12 @@
}
},
"node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": {
- "version": "0.2101.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.3.tgz",
- "integrity": "sha512-vKz8aPA62W+e9+pF6ct4CRDG/MjlIH7sWFGYkxPPRst2g46ZQsRkrzfMZAWv/wnt6OZ1OwyRuO3RW83EMhag8g==",
+ "version": "0.2101.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.4.tgz",
+ "integrity": "sha512-3yyebORk+ovtO+LfDjIGbGCZhCMDAsyn9vkCljARj3sSshS4blOQBar0g+V3kYAweLT5Gf+rTKbN5jneOkBAFQ==",
"dev": true,
"dependencies": {
- "@angular-devkit/core": "21.1.3",
+ "@angular-devkit/core": "21.1.4",
"rxjs": "7.8.2"
},
"bin": {
@@ -798,9 +798,9 @@
}
},
"node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.3.tgz",
- "integrity": "sha512-huEXd1tWQHwwN+0VGRT+vSVplV0KNrGFUGJzkIW6iJE1SQElxn6etMai+pSd5DJcePkx6+SuscVsxbfwf70hnA==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz",
+ "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==",
"dev": true,
"dependencies": {
"ajv": "8.17.1",
@@ -1046,12 +1046,12 @@
}
},
"node_modules/@angular-devkit/build-webpack": {
- "version": "0.2101.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2101.3.tgz",
- "integrity": "sha512-M2o79NbnrjKC78DBdPcJ/ZDSvTi1rpvWBhAa0TN/HZhW33xf9pkYCBOfHIowv+m/tPA1KqL7Ww3qNhRmzId6yg==",
+ "version": "0.2101.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2101.4.tgz",
+ "integrity": "sha512-lPjPxeEzUha4bnlGzD3KFFf3yxcQjOfV9wwZIa4XLsqjCZsUk95TzHQH7i64OCTw9uKTEQkJBAuO6v2WXHxopw==",
"dev": true,
"dependencies": {
- "@angular-devkit/architect": "0.2101.3",
+ "@angular-devkit/architect": "0.2101.4",
"rxjs": "7.8.2"
},
"engines": {
@@ -1065,12 +1065,12 @@
}
},
"node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": {
- "version": "0.2101.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.3.tgz",
- "integrity": "sha512-vKz8aPA62W+e9+pF6ct4CRDG/MjlIH7sWFGYkxPPRst2g46ZQsRkrzfMZAWv/wnt6OZ1OwyRuO3RW83EMhag8g==",
+ "version": "0.2101.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.4.tgz",
+ "integrity": "sha512-3yyebORk+ovtO+LfDjIGbGCZhCMDAsyn9vkCljARj3sSshS4blOQBar0g+V3kYAweLT5Gf+rTKbN5jneOkBAFQ==",
"dev": true,
"dependencies": {
- "@angular-devkit/core": "21.1.3",
+ "@angular-devkit/core": "21.1.4",
"rxjs": "7.8.2"
},
"bin": {
@@ -1083,9 +1083,9 @@
}
},
"node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.3.tgz",
- "integrity": "sha512-huEXd1tWQHwwN+0VGRT+vSVplV0KNrGFUGJzkIW6iJE1SQElxn6etMai+pSd5DJcePkx6+SuscVsxbfwf70hnA==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz",
+ "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==",
"dev": true,
"dependencies": {
"ajv": "8.17.1",
@@ -1373,9 +1373,9 @@
"license": "MIT"
},
"node_modules/@angular/animations": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.1.3.tgz",
- "integrity": "sha512-UADMncDd9lkmIT1NPVFcufyP5gJHMPzxNaQpojiGrxT1aT8Du30mao0KSrB4aTwcicv6/cdD5bZbIyg+FL6LkQ==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.1.4.tgz",
+ "integrity": "sha512-8xQ0Ylw7qqVyw4ZJ/Tyw/z5Mtqtp8AMj+R+Z1sCWcyxBgDU4+qfxteVYdiipWC3tX77A0FTsXqwvNP9WVY2/WA==",
"dependencies": {
"tslib": "^2.3.0"
},
@@ -1383,17 +1383,17 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/core": "21.1.3"
+ "@angular/core": "21.1.4"
}
},
"node_modules/@angular/build": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.1.3.tgz",
- "integrity": "sha512-RXVRuamfrSPwsFCLJgsO2ucp+dwWDbGbhXrQnMrGXm0qdgYpI8bAsBMd8wOeUA6vn4fRmjaRFQZbL/rcIVrkzw==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.1.4.tgz",
+ "integrity": "sha512-7CAAQPWFMMqod40ox5MOVB/CnoBXFDehyQhs0hls6lu7bOy/M0EDy0v6bERkyNGRz1mihWWBiCV8XzEinrlq1A==",
"dev": true,
"dependencies": {
"@ampproject/remapping": "2.3.0",
- "@angular-devkit/architect": "0.2101.3",
+ "@angular-devkit/architect": "0.2101.4",
"@babel/core": "7.28.5",
"@babel/helper-annotate-as-pure": "7.27.3",
"@babel/helper-split-export-declaration": "7.24.7",
@@ -1436,7 +1436,7 @@
"@angular/platform-browser": "^21.0.0",
"@angular/platform-server": "^21.0.0",
"@angular/service-worker": "^21.0.0",
- "@angular/ssr": "^21.1.3",
+ "@angular/ssr": "^21.1.4",
"karma": "^6.4.0",
"less": "^4.2.0",
"ng-packagr": "^21.0.0",
@@ -1486,12 +1486,12 @@
}
},
"node_modules/@angular/build/node_modules/@angular-devkit/architect": {
- "version": "0.2101.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.3.tgz",
- "integrity": "sha512-vKz8aPA62W+e9+pF6ct4CRDG/MjlIH7sWFGYkxPPRst2g46ZQsRkrzfMZAWv/wnt6OZ1OwyRuO3RW83EMhag8g==",
+ "version": "0.2101.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.4.tgz",
+ "integrity": "sha512-3yyebORk+ovtO+LfDjIGbGCZhCMDAsyn9vkCljARj3sSshS4blOQBar0g+V3kYAweLT5Gf+rTKbN5jneOkBAFQ==",
"dev": true,
"dependencies": {
- "@angular-devkit/core": "21.1.3",
+ "@angular-devkit/core": "21.1.4",
"rxjs": "7.8.2"
},
"bin": {
@@ -1504,9 +1504,9 @@
}
},
"node_modules/@angular/build/node_modules/@angular-devkit/core": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.3.tgz",
- "integrity": "sha512-huEXd1tWQHwwN+0VGRT+vSVplV0KNrGFUGJzkIW6iJE1SQElxn6etMai+pSd5DJcePkx6+SuscVsxbfwf70hnA==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz",
+ "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==",
"dev": true,
"dependencies": {
"ajv": "8.17.1",
@@ -1587,9 +1587,9 @@
}
},
"node_modules/@angular/cdk": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.1.3.tgz",
- "integrity": "sha512-jMiEKCcZMIAnyx2jxrJHmw5c7JXAiN56ErZ4X+OuQ5yFvYRocRVEs25I0OMxntcXNdPTJQvpGwGlhWhS0yDorg==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.1.4.tgz",
+ "integrity": "sha512-PElA4Ww4TIa3+B/ND+fm8ZPDKONTIqc9a/s0qNxhcAD9IpDqjaBVi/fyg+ZWBtS+x0DQgJtKeCsSZ6sr2aFQaQ==",
"dependencies": {
"parse5": "^8.0.0",
"tslib": "^2.3.0"
@@ -1626,17 +1626,17 @@
}
},
"node_modules/@angular/cli": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.1.3.tgz",
- "integrity": "sha512-UPtDcpKyrKZRPfym9gTovcibPzl2O/Woy7B8sm45sAnjDH+jDUCcCvuIak7GpH47shQkC2J4yvnHZbD4c6XxcQ==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.1.4.tgz",
+ "integrity": "sha512-XsMHgxTvHGiXXrhYZz3zMZYhYU0gHdpoHKGiEKXwcx+S1KoYbIssyg6oF2Kq49ZaE0OYCTKjnvgDce6ZqdkJ/A==",
"dependencies": {
- "@angular-devkit/architect": "0.2101.3",
- "@angular-devkit/core": "21.1.3",
- "@angular-devkit/schematics": "21.1.3",
+ "@angular-devkit/architect": "0.2101.4",
+ "@angular-devkit/core": "21.1.4",
+ "@angular-devkit/schematics": "21.1.4",
"@inquirer/prompts": "7.10.1",
"@listr2/prompt-adapter-inquirer": "3.0.5",
"@modelcontextprotocol/sdk": "1.26.0",
- "@schematics/angular": "21.1.3",
+ "@schematics/angular": "21.1.4",
"@yarnpkg/lockfile": "1.1.0",
"algoliasearch": "5.46.2",
"ini": "6.0.0",
@@ -1660,11 +1660,11 @@
}
},
"node_modules/@angular/cli/node_modules/@angular-devkit/architect": {
- "version": "0.2101.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.3.tgz",
- "integrity": "sha512-vKz8aPA62W+e9+pF6ct4CRDG/MjlIH7sWFGYkxPPRst2g46ZQsRkrzfMZAWv/wnt6OZ1OwyRuO3RW83EMhag8g==",
+ "version": "0.2101.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.4.tgz",
+ "integrity": "sha512-3yyebORk+ovtO+LfDjIGbGCZhCMDAsyn9vkCljARj3sSshS4blOQBar0g+V3kYAweLT5Gf+rTKbN5jneOkBAFQ==",
"dependencies": {
- "@angular-devkit/core": "21.1.3",
+ "@angular-devkit/core": "21.1.4",
"rxjs": "7.8.2"
},
"bin": {
@@ -1677,9 +1677,9 @@
}
},
"node_modules/@angular/cli/node_modules/@angular-devkit/core": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.3.tgz",
- "integrity": "sha512-huEXd1tWQHwwN+0VGRT+vSVplV0KNrGFUGJzkIW6iJE1SQElxn6etMai+pSd5DJcePkx6+SuscVsxbfwf70hnA==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz",
+ "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==",
"dependencies": {
"ajv": "8.17.1",
"ajv-formats": "3.0.1",
@@ -1703,11 +1703,11 @@
}
},
"node_modules/@angular/cli/node_modules/@angular-devkit/schematics": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.3.tgz",
- "integrity": "sha512-Ps7bRl5uOcM7WpNJHbSls/jz5/wAI0ldkTlKyiBFA7RtNeQIABAV+hvlw5DJuEb1Lo5hnK0hXj90AyZdOxzY+w==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.4.tgz",
+ "integrity": "sha512-Nqq0ioCUxrbEX+L4KOarETcZZJNnJ1mAJ0ubO4VM91qnn8RBBM9SnQ91590TfC34Szk/wh+3+Uj6KUvTJNuegQ==",
"dependencies": {
- "@angular-devkit/core": "21.1.3",
+ "@angular-devkit/core": "21.1.4",
"jsonc-parser": "3.3.1",
"magic-string": "0.30.21",
"ora": "9.0.0",
@@ -1847,12 +1847,12 @@
}
},
"node_modules/@angular/cli/node_modules/ora/node_modules/string-width": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.1.tgz",
- "integrity": "sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==",
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz",
+ "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==",
"dependencies": {
- "get-east-asian-width": "^1.3.0",
- "strip-ansi": "^7.1.0"
+ "get-east-asian-width": "^1.5.0",
+ "strip-ansi": "^7.1.2"
},
"engines": {
"node": ">=20"
@@ -1948,9 +1948,9 @@
}
},
"node_modules/@angular/common": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.1.3.tgz",
- "integrity": "sha512-Wdbln/UqZM5oVnpfIydRdhhL8A9x3bKZ9Zy1/mM0q+qFSftPvmFZIXhEpFqbDwNYbGUhGzx7t8iULC4sVVp/zA==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.1.4.tgz",
+ "integrity": "sha512-1uOxPrHO9PFZBU/JavzYzjxAm+5x7vD2z6AeUndqdT4LjqOBIePswxFDRqM9dlfF8FIwnnfmNFipiC/yQjJSnA==",
"dependencies": {
"tslib": "^2.3.0"
},
@@ -1958,14 +1958,14 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/core": "21.1.3",
+ "@angular/core": "21.1.4",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/compiler": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.1.3.tgz",
- "integrity": "sha512-gDNLh7MEf7Qf88ktZzS4LJQXCA5U8aQTfK9ak+0mi2ruZ0x4XSjQCro4H6OPKrrbq94+6GcnlSX5+oVIajEY3w==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.1.4.tgz",
+ "integrity": "sha512-H0qtASeqOTaS44ioF4DYE/yNqwzUmEJpMYrcNEUFEwA20/DkLzyoaEx4y1CjIxtXxuhtge95PNymDBOLWSjIdg==",
"dependencies": {
"tslib": "^2.3.0"
},
@@ -1974,9 +1974,9 @@
}
},
"node_modules/@angular/compiler-cli": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.1.3.tgz",
- "integrity": "sha512-nKxoQ89W2B1WdonNQ9kgRnvLNS6DAxDrRHBslsKTlV+kbdv7h59M9PjT4ZZ2sp1M/M8LiofnUfa/s2jd/xYj5w==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.1.4.tgz",
+ "integrity": "sha512-Uw8KmpVCo58/f5wf6pY8ZS5fodv65hn5jxms8Nv/K7/LVe3i1nNFrHyneBx5+a7qkz93nSV4rdwBVnMvjIyr+g==",
"dependencies": {
"@babel/core": "7.28.5",
"@jridgewell/sourcemap-codec": "^1.4.14",
@@ -1995,7 +1995,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/compiler": "21.1.3",
+ "@angular/compiler": "21.1.4",
"typescript": ">=5.9 <6.0"
},
"peerDependenciesMeta": {
@@ -2152,9 +2152,9 @@
}
},
"node_modules/@angular/core": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.1.3.tgz",
- "integrity": "sha512-TbhQxRC7Lb/3WBdm1n8KRsktmVEuGBBp0WRF5mq0Ze4s1YewIM6cULrSw9ACtcL5jdcq7c74ms+uKQsaP/gdcQ==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.1.4.tgz",
+ "integrity": "sha512-QBDO5SaVYTVQ0fIN9Qd7US9cUCgs2vM9x6K18PTUKmygIkHVHTFdzwm4MO5gpCOFzJseGbS+dNzqn+v0PaKf9g==",
"dependencies": {
"tslib": "^2.3.0"
},
@@ -2162,7 +2162,7 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/compiler": "21.1.3",
+ "@angular/compiler": "21.1.4",
"rxjs": "^6.5.3 || ^7.4.0",
"zone.js": "~0.15.0 || ~0.16.0"
},
@@ -2176,9 +2176,9 @@
}
},
"node_modules/@angular/elements": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-21.1.3.tgz",
- "integrity": "sha512-nuXv4Nzmfl/m7d8shDCpSt7v1uKqWBj9QMNLpR8pzqa6I9cVyvT5fXVA0OF74b+3n8tzVActxcqtH+I8avt08A==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-21.1.4.tgz",
+ "integrity": "sha512-OJTxfzdh77LeoFiAbW/s38Kks4HTEyeJTxMzZqA3aWF8ZCa5DNai6aB2F20QbhJdrr/NAITjlDf8gM4c2XJgxw==",
"dependencies": {
"tslib": "^2.3.0"
},
@@ -2186,14 +2186,14 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/core": "21.1.3",
+ "@angular/core": "21.1.4",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/forms": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.1.3.tgz",
- "integrity": "sha512-YW/YdjM9suZUeJam9agHFXIEE3qQIhGYXMjnnX7xGjOe+CuR2R0qsWn1AR0yrKrNmFspb0lKgM7kTTJyzt8gZg==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.1.4.tgz",
+ "integrity": "sha512-duVT/eOncmFNBYRlK/F7WDg6GD1vL1mxUrDdnp7M9J8JvNrKH0PvdfzuOAmjbB8/bsvUNTLFXCV4+43Mc2Hqsw==",
"dependencies": {
"@standard-schema/spec": "^1.0.0",
"tslib": "^2.3.0"
@@ -2202,25 +2202,25 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/common": "21.1.3",
- "@angular/core": "21.1.3",
- "@angular/platform-browser": "21.1.3",
+ "@angular/common": "21.1.4",
+ "@angular/core": "21.1.4",
+ "@angular/platform-browser": "21.1.4",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
"node_modules/@angular/language-service": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-21.1.3.tgz",
- "integrity": "sha512-i7iMIMt2rbCDXRuVULbi0I5v4a7ldBgoGdPvHQ17poohTjU4NJ2Jm7p7mUYCGcDlYmWOvgxMGaoiqUs6S5lFPA==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-21.1.4.tgz",
+ "integrity": "sha512-E0OKcbYMJPaWlDsz4clPoFJRCgpWBSmMZtgzd4Py3C6yxTyPCZYgA43UyzUDiQI7rHHjD5V6d5EvocgSq6uBfQ==",
"dev": true,
"engines": {
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
}
},
"node_modules/@angular/platform-browser": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.1.3.tgz",
- "integrity": "sha512-W+ZMXAioaP7CsACafBCHsIxiiKrRTPOlQ+hcC7XNBwy+bn5mjGONoCgLreQs76M8HNWLtr/OAUAr6h26OguOuA==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.1.4.tgz",
+ "integrity": "sha512-S6Iw5CkORih5omh+MQY35w0bUBxdSFAPLDg386S6/9fEUjDClo61hvXNKxaNh9g7tnh1LD7zmTmKrqufnhnFDQ==",
"dependencies": {
"tslib": "^2.3.0"
},
@@ -2228,9 +2228,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/animations": "21.1.3",
- "@angular/common": "21.1.3",
- "@angular/core": "21.1.3"
+ "@angular/animations": "21.1.4",
+ "@angular/common": "21.1.4",
+ "@angular/core": "21.1.4"
},
"peerDependenciesMeta": {
"@angular/animations": {
@@ -2239,9 +2239,9 @@
}
},
"node_modules/@angular/platform-browser-dynamic": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.1.3.tgz",
- "integrity": "sha512-wWEjrNtJfxzZmbDWdJSyRau7NWpQ6IFM9QAyn7xH3cQDGCj+Gy9lTU5sUIYQc+7sx3nKWztolc7h/M5meYCTAg==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.1.4.tgz",
+ "integrity": "sha512-lThgNDFHPQyrx0liNX3x8wHcgp1sd/Dym19zm1PSQ67k6J4snwxZFhNlwFHVr1K86XvX/vilyeR2edPLe9lF3Q==",
"dependencies": {
"tslib": "^2.3.0"
},
@@ -2249,16 +2249,16 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/common": "21.1.3",
- "@angular/compiler": "21.1.3",
- "@angular/core": "21.1.3",
- "@angular/platform-browser": "21.1.3"
+ "@angular/common": "21.1.4",
+ "@angular/compiler": "21.1.4",
+ "@angular/core": "21.1.4",
+ "@angular/platform-browser": "21.1.4"
}
},
"node_modules/@angular/router": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.1.3.tgz",
- "integrity": "sha512-uAw4LAMHXAPCe4SywhlUEWjMYVbbLHwTxLyduSp1b+9aVwep0juy5O/Xttlxd/oigVe0NMnOyJG9y1Br/ubnrg==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.1.4.tgz",
+ "integrity": "sha512-nPYuRJ8ub/X8GK55U2KqYy/ducVRn6HSoDmZz0yiXtI6haFsZlv9R1j5zi0EDIqrrN0HGARMs6jNDXZC1Ded3w==",
"dependencies": {
"tslib": "^2.3.0"
},
@@ -2266,9 +2266,9 @@
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
},
"peerDependencies": {
- "@angular/common": "21.1.3",
- "@angular/core": "21.1.3",
- "@angular/platform-browser": "21.1.3",
+ "@angular/common": "21.1.4",
+ "@angular/core": "21.1.4",
+ "@angular/platform-browser": "21.1.4",
"rxjs": "^6.5.3 || ^7.4.0"
}
},
@@ -5679,25 +5679,6 @@
}
}
},
- "node_modules/@isaacs/balanced-match": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
- "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==",
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/@isaacs/brace-expansion": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz",
- "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==",
- "dependencies": {
- "@isaacs/balanced-match": "^4.0.1"
- },
- "engines": {
- "node": "20 || >=22"
- }
- },
"node_modules/@isaacs/fs-minipass": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
@@ -7065,9 +7046,9 @@
}
},
"node_modules/@ngtools/webpack": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-21.1.3.tgz",
- "integrity": "sha512-Un4dHHELxuFwlSfjsHlmw73col+t0NID2hhx1JPRmKXBXAd4nDRJKX2LPouQLL0FFF+gOtA4mxabf5NruDTQNg==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-21.1.4.tgz",
+ "integrity": "sha512-CgKnMofIVGTwNPqFNZmkmr2aLOFUG/AKm8lauXU+juwSaY7Z28eguFd+J42uVUOnasLxINQY9y7kr9f6deTrcg==",
"dev": true,
"engines": {
"node": "^20.19.0 || ^22.12.0 || >=24.0.0",
@@ -8364,12 +8345,12 @@
"dev": true
},
"node_modules/@schematics/angular": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.1.3.tgz",
- "integrity": "sha512-obJvWBhzRdsYL2msM4+8bQD21vFl3VxaVsuiq6iIfYsxhU5i2Iar2wM9NaRaIIqAYhZ8ehQQ/moB9BEbWvDCTw==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.1.4.tgz",
+ "integrity": "sha512-I1zdSNzdbrVCWpeE2NsZQmIoa9m0nlw4INgdGIkqUH6FgwvoGKC0RoOxKAmm6HHVJ48FE/sPI13dwAeK89ow5A==",
"dependencies": {
- "@angular-devkit/core": "21.1.3",
- "@angular-devkit/schematics": "21.1.3",
+ "@angular-devkit/core": "21.1.4",
+ "@angular-devkit/schematics": "21.1.4",
"jsonc-parser": "3.3.1"
},
"engines": {
@@ -8379,9 +8360,9 @@
}
},
"node_modules/@schematics/angular/node_modules/@angular-devkit/core": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.3.tgz",
- "integrity": "sha512-huEXd1tWQHwwN+0VGRT+vSVplV0KNrGFUGJzkIW6iJE1SQElxn6etMai+pSd5DJcePkx6+SuscVsxbfwf70hnA==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz",
+ "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==",
"dependencies": {
"ajv": "8.17.1",
"ajv-formats": "3.0.1",
@@ -8405,11 +8386,11 @@
}
},
"node_modules/@schematics/angular/node_modules/@angular-devkit/schematics": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.3.tgz",
- "integrity": "sha512-Ps7bRl5uOcM7WpNJHbSls/jz5/wAI0ldkTlKyiBFA7RtNeQIABAV+hvlw5DJuEb1Lo5hnK0hXj90AyZdOxzY+w==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.4.tgz",
+ "integrity": "sha512-Nqq0ioCUxrbEX+L4KOarETcZZJNnJ1mAJ0ubO4VM91qnn8RBBM9SnQ91590TfC34Szk/wh+3+Uj6KUvTJNuegQ==",
"dependencies": {
- "@angular-devkit/core": "21.1.3",
+ "@angular-devkit/core": "21.1.4",
"jsonc-parser": "3.3.1",
"magic-string": "0.30.21",
"ora": "9.0.0",
@@ -8527,12 +8508,12 @@
}
},
"node_modules/@schematics/angular/node_modules/string-width": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.1.tgz",
- "integrity": "sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==",
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz",
+ "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==",
"dependencies": {
- "get-east-asian-width": "^1.3.0",
- "strip-ansi": "^7.1.0"
+ "get-east-asian-width": "^1.5.0",
+ "strip-ansi": "^7.1.2"
},
"engines": {
"node": ">=20"
@@ -9050,16 +9031,34 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/@tufjs/models/node_modules/minimatch": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
- "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
- "license": "BlueOak-1.0.0",
+ "node_modules/@tufjs/models/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/@tufjs/models/node_modules/brace-expansion": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
"dependencies": {
- "@isaacs/brace-expansion": "^5.0.0"
+ "balanced-match": "^4.0.2"
},
"engines": {
- "node": "20 || >=22"
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/@tufjs/models/node_modules/minimatch": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz",
+ "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==",
+ "dependencies": {
+ "brace-expansion": "^5.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
@@ -9706,13 +9705,25 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
"node_modules/@typescript-eslint/eslint-plugin/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
"dev": true,
"dependencies": {
- "balanced-match": "^1.0.0"
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": {
@@ -9754,12 +9765,12 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "version": "9.0.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz",
+ "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==",
"dev": true,
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "brace-expansion": "^5.0.2"
},
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -10038,13 +10049,25 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/@typescript-eslint/type-utils/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
"node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
"dev": true,
"dependencies": {
- "balanced-match": "^1.0.0"
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
}
},
"node_modules/@typescript-eslint/type-utils/node_modules/debug": {
@@ -10077,12 +10100,12 @@
}
},
"node_modules/@typescript-eslint/type-utils/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "version": "9.0.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz",
+ "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==",
"dev": true,
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "brace-expansion": "^5.0.2"
},
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -10131,13 +10154,25 @@
"typescript": ">=4.8.4 <6.0.0"
}
},
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
"dev": true,
"dependencies": {
- "balanced-match": "^1.0.0"
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/debug": {
@@ -10158,12 +10193,12 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "version": "9.0.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz",
+ "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==",
"dev": true,
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "brace-expansion": "^5.0.2"
},
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -10306,13 +10341,25 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/@typescript-eslint/utils/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
"node_modules/@typescript-eslint/utils/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
"dev": true,
"dependencies": {
- "balanced-match": "^1.0.0"
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
}
},
"node_modules/@typescript-eslint/utils/node_modules/debug": {
@@ -10345,12 +10392,12 @@
}
},
"node_modules/@typescript-eslint/utils/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "version": "9.0.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz",
+ "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==",
"dev": true,
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "brace-expansion": "^5.0.2"
},
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -14712,9 +14759,9 @@
}
},
"node_modules/filelist/node_modules/minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "version": "5.1.7",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.7.tgz",
+ "integrity": "sha512-FjiwU9HaHW6YB3H4a1sFudnv93lvydNjz2lmyUXR6IwKhGI+bgL3SOZrBGn6kvvX2pJvhEkGSGjyTHN47O4rqA==",
"dev": true,
"dependencies": {
"brace-expansion": "^2.0.1"
@@ -15002,10 +15049,9 @@
}
},
"node_modules/get-east-asian-width": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz",
- "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==",
- "license": "MIT",
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz",
+ "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==",
"engines": {
"node": ">=18"
},
@@ -15128,6 +15174,25 @@
"dev": true,
"license": "BSD-2-Clause"
},
+ "node_modules/glob/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
"node_modules/glob/node_modules/lru-cache": {
"version": "11.2.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.1.tgz",
@@ -15137,14 +15202,14 @@
}
},
"node_modules/glob/node_modules/minimatch": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
- "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz",
+ "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==",
"dependencies": {
- "@isaacs/brace-expansion": "^5.0.0"
+ "brace-expansion": "^5.0.2"
},
"engines": {
- "node": "20 || >=22"
+ "node": "18 || 20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
@@ -15614,9 +15679,9 @@
}
},
"node_modules/hono": {
- "version": "4.11.9",
- "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.9.tgz",
- "integrity": "sha512-Eaw2YTGM6WOxA6CXbckaEvslr2Ne4NFsKrvc0v97JD5awbmeBLO5w9Ho9L9kmKonrwF9RJlW6BxT1PVv/agBHQ==",
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.0.tgz",
+ "integrity": "sha512-NekXntS5M94pUfiVZ8oXXK/kkri+5WpX2/Ik+LVsl+uvw+soj4roXIsPqO+XsWrAw20mOzaXOZf3Q7PfB9A/IA==",
"engines": {
"node": ">=16.9.0"
}
@@ -16020,16 +16085,34 @@
"node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/ignore-walk/node_modules/minimatch": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
- "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
- "license": "BlueOak-1.0.0",
+ "node_modules/ignore-walk/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/ignore-walk/node_modules/brace-expansion": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
"dependencies": {
- "@isaacs/brace-expansion": "^5.0.0"
+ "balanced-match": "^4.0.2"
},
"engines": {
- "node": "20 || >=22"
+ "node": "18 || 20 || >=22"
+ }
+ },
+ "node_modules/ignore-walk/node_modules/minimatch": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz",
+ "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==",
+ "dependencies": {
+ "brace-expansion": "^5.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
@@ -19192,9 +19275,9 @@
"dev": true
},
"node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz",
+ "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==",
"dev": true,
"dependencies": {
"brace-expansion": "^1.1.7"
@@ -21162,10 +21245,9 @@
"integrity": "sha512-C0cqfbS1P5hfqN4NhsYsUXePlk9BO+a45bAQ3xLYjBL3bOIFzoVEjs79Fado9u9BPBD3buHi3+vY+C8tHh4qMQ=="
},
"node_modules/qs": {
- "version": "6.14.1",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
- "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
- "license": "BSD-3-Clause",
+ "version": "6.14.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz",
+ "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==",
"dependencies": {
"side-channel": "^1.1.0"
},
@@ -24222,13 +24304,25 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/typescript-eslint/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
"node_modules/typescript-eslint/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
"dev": true,
"dependencies": {
- "balanced-match": "^1.0.0"
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
}
},
"node_modules/typescript-eslint/node_modules/debug": {
@@ -24270,12 +24364,12 @@
}
},
"node_modules/typescript-eslint/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "version": "9.0.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz",
+ "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==",
"dev": true,
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "brace-expansion": "^5.0.2"
},
"engines": {
"node": ">=16 || 14 >=14.17"
@@ -26040,16 +26134,16 @@
}
},
"@angular-devkit/build-angular": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-21.1.3.tgz",
- "integrity": "sha512-02mA04tz9UshwPTv8lBkLcMPpMFh7YnAMXM6u0fL558rU7UrBxsm3XfMmDao3f+jT8umA1mDHBx9OW9LIF4Ewg==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-21.1.4.tgz",
+ "integrity": "sha512-2HPCo6vEu5EIwxxFYhnmdfbktRBoOVQD3q7lG9PMQPf/jRCnyIZ70qSbXbAV96IMDLFl8mLRfY4scoaFMIYGMw==",
"dev": true,
"requires": {
"@ampproject/remapping": "2.3.0",
- "@angular-devkit/architect": "0.2101.3",
- "@angular-devkit/build-webpack": "0.2101.3",
- "@angular-devkit/core": "21.1.3",
- "@angular/build": "21.1.3",
+ "@angular-devkit/architect": "0.2101.4",
+ "@angular-devkit/build-webpack": "0.2101.4",
+ "@angular-devkit/core": "21.1.4",
+ "@angular/build": "21.1.4",
"@babel/core": "7.28.5",
"@babel/generator": "7.28.5",
"@babel/helper-annotate-as-pure": "7.27.3",
@@ -26060,7 +26154,7 @@
"@babel/preset-env": "7.28.5",
"@babel/runtime": "7.28.4",
"@discoveryjs/json-ext": "0.6.3",
- "@ngtools/webpack": "21.1.3",
+ "@ngtools/webpack": "21.1.4",
"ansi-colors": "4.1.3",
"autoprefixer": "10.4.23",
"babel-loader": "10.0.0",
@@ -26103,19 +26197,19 @@
},
"dependencies": {
"@angular-devkit/architect": {
- "version": "0.2101.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.3.tgz",
- "integrity": "sha512-vKz8aPA62W+e9+pF6ct4CRDG/MjlIH7sWFGYkxPPRst2g46ZQsRkrzfMZAWv/wnt6OZ1OwyRuO3RW83EMhag8g==",
+ "version": "0.2101.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.4.tgz",
+ "integrity": "sha512-3yyebORk+ovtO+LfDjIGbGCZhCMDAsyn9vkCljARj3sSshS4blOQBar0g+V3kYAweLT5Gf+rTKbN5jneOkBAFQ==",
"dev": true,
"requires": {
- "@angular-devkit/core": "21.1.3",
+ "@angular-devkit/core": "21.1.4",
"rxjs": "7.8.2"
}
},
"@angular-devkit/core": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.3.tgz",
- "integrity": "sha512-huEXd1tWQHwwN+0VGRT+vSVplV0KNrGFUGJzkIW6iJE1SQElxn6etMai+pSd5DJcePkx6+SuscVsxbfwf70hnA==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz",
+ "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==",
"dev": true,
"requires": {
"ajv": "8.17.1",
@@ -26260,29 +26354,29 @@
}
},
"@angular-devkit/build-webpack": {
- "version": "0.2101.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2101.3.tgz",
- "integrity": "sha512-M2o79NbnrjKC78DBdPcJ/ZDSvTi1rpvWBhAa0TN/HZhW33xf9pkYCBOfHIowv+m/tPA1KqL7Ww3qNhRmzId6yg==",
+ "version": "0.2101.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.2101.4.tgz",
+ "integrity": "sha512-lPjPxeEzUha4bnlGzD3KFFf3yxcQjOfV9wwZIa4XLsqjCZsUk95TzHQH7i64OCTw9uKTEQkJBAuO6v2WXHxopw==",
"dev": true,
"requires": {
- "@angular-devkit/architect": "0.2101.3",
+ "@angular-devkit/architect": "0.2101.4",
"rxjs": "7.8.2"
},
"dependencies": {
"@angular-devkit/architect": {
- "version": "0.2101.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.3.tgz",
- "integrity": "sha512-vKz8aPA62W+e9+pF6ct4CRDG/MjlIH7sWFGYkxPPRst2g46ZQsRkrzfMZAWv/wnt6OZ1OwyRuO3RW83EMhag8g==",
+ "version": "0.2101.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.4.tgz",
+ "integrity": "sha512-3yyebORk+ovtO+LfDjIGbGCZhCMDAsyn9vkCljARj3sSshS4blOQBar0g+V3kYAweLT5Gf+rTKbN5jneOkBAFQ==",
"dev": true,
"requires": {
- "@angular-devkit/core": "21.1.3",
+ "@angular-devkit/core": "21.1.4",
"rxjs": "7.8.2"
}
},
"@angular-devkit/core": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.3.tgz",
- "integrity": "sha512-huEXd1tWQHwwN+0VGRT+vSVplV0KNrGFUGJzkIW6iJE1SQElxn6etMai+pSd5DJcePkx6+SuscVsxbfwf70hnA==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz",
+ "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==",
"dev": true,
"requires": {
"ajv": "8.17.1",
@@ -26478,21 +26572,21 @@
}
},
"@angular/animations": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.1.3.tgz",
- "integrity": "sha512-UADMncDd9lkmIT1NPVFcufyP5gJHMPzxNaQpojiGrxT1aT8Du30mao0KSrB4aTwcicv6/cdD5bZbIyg+FL6LkQ==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-21.1.4.tgz",
+ "integrity": "sha512-8xQ0Ylw7qqVyw4ZJ/Tyw/z5Mtqtp8AMj+R+Z1sCWcyxBgDU4+qfxteVYdiipWC3tX77A0FTsXqwvNP9WVY2/WA==",
"requires": {
"tslib": "^2.3.0"
}
},
"@angular/build": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.1.3.tgz",
- "integrity": "sha512-RXVRuamfrSPwsFCLJgsO2ucp+dwWDbGbhXrQnMrGXm0qdgYpI8bAsBMd8wOeUA6vn4fRmjaRFQZbL/rcIVrkzw==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/build/-/build-21.1.4.tgz",
+ "integrity": "sha512-7CAAQPWFMMqod40ox5MOVB/CnoBXFDehyQhs0hls6lu7bOy/M0EDy0v6bERkyNGRz1mihWWBiCV8XzEinrlq1A==",
"dev": true,
"requires": {
"@ampproject/remapping": "2.3.0",
- "@angular-devkit/architect": "0.2101.3",
+ "@angular-devkit/architect": "0.2101.4",
"@babel/core": "7.28.5",
"@babel/helper-annotate-as-pure": "7.27.3",
"@babel/helper-split-export-declaration": "7.24.7",
@@ -26522,19 +26616,19 @@
},
"dependencies": {
"@angular-devkit/architect": {
- "version": "0.2101.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.3.tgz",
- "integrity": "sha512-vKz8aPA62W+e9+pF6ct4CRDG/MjlIH7sWFGYkxPPRst2g46ZQsRkrzfMZAWv/wnt6OZ1OwyRuO3RW83EMhag8g==",
+ "version": "0.2101.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.4.tgz",
+ "integrity": "sha512-3yyebORk+ovtO+LfDjIGbGCZhCMDAsyn9vkCljARj3sSshS4blOQBar0g+V3kYAweLT5Gf+rTKbN5jneOkBAFQ==",
"dev": true,
"requires": {
- "@angular-devkit/core": "21.1.3",
+ "@angular-devkit/core": "21.1.4",
"rxjs": "7.8.2"
}
},
"@angular-devkit/core": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.3.tgz",
- "integrity": "sha512-huEXd1tWQHwwN+0VGRT+vSVplV0KNrGFUGJzkIW6iJE1SQElxn6etMai+pSd5DJcePkx6+SuscVsxbfwf70hnA==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz",
+ "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==",
"dev": true,
"requires": {
"ajv": "8.17.1",
@@ -26585,9 +26679,9 @@
}
},
"@angular/cdk": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.1.3.tgz",
- "integrity": "sha512-jMiEKCcZMIAnyx2jxrJHmw5c7JXAiN56ErZ4X+OuQ5yFvYRocRVEs25I0OMxntcXNdPTJQvpGwGlhWhS0yDorg==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-21.1.4.tgz",
+ "integrity": "sha512-PElA4Ww4TIa3+B/ND+fm8ZPDKONTIqc9a/s0qNxhcAD9IpDqjaBVi/fyg+ZWBtS+x0DQgJtKeCsSZ6sr2aFQaQ==",
"requires": {
"parse5": "^8.0.0",
"tslib": "^2.3.0"
@@ -26609,17 +26703,17 @@
}
},
"@angular/cli": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.1.3.tgz",
- "integrity": "sha512-UPtDcpKyrKZRPfym9gTovcibPzl2O/Woy7B8sm45sAnjDH+jDUCcCvuIak7GpH47shQkC2J4yvnHZbD4c6XxcQ==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-21.1.4.tgz",
+ "integrity": "sha512-XsMHgxTvHGiXXrhYZz3zMZYhYU0gHdpoHKGiEKXwcx+S1KoYbIssyg6oF2Kq49ZaE0OYCTKjnvgDce6ZqdkJ/A==",
"requires": {
- "@angular-devkit/architect": "0.2101.3",
- "@angular-devkit/core": "21.1.3",
- "@angular-devkit/schematics": "21.1.3",
+ "@angular-devkit/architect": "0.2101.4",
+ "@angular-devkit/core": "21.1.4",
+ "@angular-devkit/schematics": "21.1.4",
"@inquirer/prompts": "7.10.1",
"@listr2/prompt-adapter-inquirer": "3.0.5",
"@modelcontextprotocol/sdk": "1.26.0",
- "@schematics/angular": "21.1.3",
+ "@schematics/angular": "21.1.4",
"@yarnpkg/lockfile": "1.1.0",
"algoliasearch": "5.46.2",
"ini": "6.0.0",
@@ -26635,18 +26729,18 @@
},
"dependencies": {
"@angular-devkit/architect": {
- "version": "0.2101.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.3.tgz",
- "integrity": "sha512-vKz8aPA62W+e9+pF6ct4CRDG/MjlIH7sWFGYkxPPRst2g46ZQsRkrzfMZAWv/wnt6OZ1OwyRuO3RW83EMhag8g==",
+ "version": "0.2101.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2101.4.tgz",
+ "integrity": "sha512-3yyebORk+ovtO+LfDjIGbGCZhCMDAsyn9vkCljARj3sSshS4blOQBar0g+V3kYAweLT5Gf+rTKbN5jneOkBAFQ==",
"requires": {
- "@angular-devkit/core": "21.1.3",
+ "@angular-devkit/core": "21.1.4",
"rxjs": "7.8.2"
}
},
"@angular-devkit/core": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.3.tgz",
- "integrity": "sha512-huEXd1tWQHwwN+0VGRT+vSVplV0KNrGFUGJzkIW6iJE1SQElxn6etMai+pSd5DJcePkx6+SuscVsxbfwf70hnA==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz",
+ "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==",
"requires": {
"ajv": "8.17.1",
"ajv-formats": "3.0.1",
@@ -26657,11 +26751,11 @@
}
},
"@angular-devkit/schematics": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.3.tgz",
- "integrity": "sha512-Ps7bRl5uOcM7WpNJHbSls/jz5/wAI0ldkTlKyiBFA7RtNeQIABAV+hvlw5DJuEb1Lo5hnK0hXj90AyZdOxzY+w==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.4.tgz",
+ "integrity": "sha512-Nqq0ioCUxrbEX+L4KOarETcZZJNnJ1mAJ0ubO4VM91qnn8RBBM9SnQ91590TfC34Szk/wh+3+Uj6KUvTJNuegQ==",
"requires": {
- "@angular-devkit/core": "21.1.3",
+ "@angular-devkit/core": "21.1.4",
"jsonc-parser": "3.3.1",
"magic-string": "0.30.21",
"ora": "9.0.0",
@@ -26745,12 +26839,12 @@
},
"dependencies": {
"string-width": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.1.tgz",
- "integrity": "sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==",
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz",
+ "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==",
"requires": {
- "get-east-asian-width": "^1.3.0",
- "strip-ansi": "^7.1.0"
+ "get-east-asian-width": "^1.5.0",
+ "strip-ansi": "^7.1.2"
}
}
}
@@ -26809,25 +26903,25 @@
}
},
"@angular/common": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.1.3.tgz",
- "integrity": "sha512-Wdbln/UqZM5oVnpfIydRdhhL8A9x3bKZ9Zy1/mM0q+qFSftPvmFZIXhEpFqbDwNYbGUhGzx7t8iULC4sVVp/zA==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/common/-/common-21.1.4.tgz",
+ "integrity": "sha512-1uOxPrHO9PFZBU/JavzYzjxAm+5x7vD2z6AeUndqdT4LjqOBIePswxFDRqM9dlfF8FIwnnfmNFipiC/yQjJSnA==",
"requires": {
"tslib": "^2.3.0"
}
},
"@angular/compiler": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.1.3.tgz",
- "integrity": "sha512-gDNLh7MEf7Qf88ktZzS4LJQXCA5U8aQTfK9ak+0mi2ruZ0x4XSjQCro4H6OPKrrbq94+6GcnlSX5+oVIajEY3w==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-21.1.4.tgz",
+ "integrity": "sha512-H0qtASeqOTaS44ioF4DYE/yNqwzUmEJpMYrcNEUFEwA20/DkLzyoaEx4y1CjIxtXxuhtge95PNymDBOLWSjIdg==",
"requires": {
"tslib": "^2.3.0"
}
},
"@angular/compiler-cli": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.1.3.tgz",
- "integrity": "sha512-nKxoQ89W2B1WdonNQ9kgRnvLNS6DAxDrRHBslsKTlV+kbdv7h59M9PjT4ZZ2sp1M/M8LiofnUfa/s2jd/xYj5w==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-21.1.4.tgz",
+ "integrity": "sha512-Uw8KmpVCo58/f5wf6pY8ZS5fodv65hn5jxms8Nv/K7/LVe3i1nNFrHyneBx5+a7qkz93nSV4rdwBVnMvjIyr+g==",
"requires": {
"@babel/core": "7.28.5",
"@jridgewell/sourcemap-codec": "^1.4.14",
@@ -26926,56 +27020,56 @@
}
},
"@angular/core": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.1.3.tgz",
- "integrity": "sha512-TbhQxRC7Lb/3WBdm1n8KRsktmVEuGBBp0WRF5mq0Ze4s1YewIM6cULrSw9ACtcL5jdcq7c74ms+uKQsaP/gdcQ==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/core/-/core-21.1.4.tgz",
+ "integrity": "sha512-QBDO5SaVYTVQ0fIN9Qd7US9cUCgs2vM9x6K18PTUKmygIkHVHTFdzwm4MO5gpCOFzJseGbS+dNzqn+v0PaKf9g==",
"requires": {
"tslib": "^2.3.0"
}
},
"@angular/elements": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-21.1.3.tgz",
- "integrity": "sha512-nuXv4Nzmfl/m7d8shDCpSt7v1uKqWBj9QMNLpR8pzqa6I9cVyvT5fXVA0OF74b+3n8tzVActxcqtH+I8avt08A==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-21.1.4.tgz",
+ "integrity": "sha512-OJTxfzdh77LeoFiAbW/s38Kks4HTEyeJTxMzZqA3aWF8ZCa5DNai6aB2F20QbhJdrr/NAITjlDf8gM4c2XJgxw==",
"requires": {
"tslib": "^2.3.0"
}
},
"@angular/forms": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.1.3.tgz",
- "integrity": "sha512-YW/YdjM9suZUeJam9agHFXIEE3qQIhGYXMjnnX7xGjOe+CuR2R0qsWn1AR0yrKrNmFspb0lKgM7kTTJyzt8gZg==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-21.1.4.tgz",
+ "integrity": "sha512-duVT/eOncmFNBYRlK/F7WDg6GD1vL1mxUrDdnp7M9J8JvNrKH0PvdfzuOAmjbB8/bsvUNTLFXCV4+43Mc2Hqsw==",
"requires": {
"@standard-schema/spec": "^1.0.0",
"tslib": "^2.3.0"
}
},
"@angular/language-service": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-21.1.3.tgz",
- "integrity": "sha512-i7iMIMt2rbCDXRuVULbi0I5v4a7ldBgoGdPvHQ17poohTjU4NJ2Jm7p7mUYCGcDlYmWOvgxMGaoiqUs6S5lFPA==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-21.1.4.tgz",
+ "integrity": "sha512-E0OKcbYMJPaWlDsz4clPoFJRCgpWBSmMZtgzd4Py3C6yxTyPCZYgA43UyzUDiQI7rHHjD5V6d5EvocgSq6uBfQ==",
"dev": true
},
"@angular/platform-browser": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.1.3.tgz",
- "integrity": "sha512-W+ZMXAioaP7CsACafBCHsIxiiKrRTPOlQ+hcC7XNBwy+bn5mjGONoCgLreQs76M8HNWLtr/OAUAr6h26OguOuA==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-21.1.4.tgz",
+ "integrity": "sha512-S6Iw5CkORih5omh+MQY35w0bUBxdSFAPLDg386S6/9fEUjDClo61hvXNKxaNh9g7tnh1LD7zmTmKrqufnhnFDQ==",
"requires": {
"tslib": "^2.3.0"
}
},
"@angular/platform-browser-dynamic": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.1.3.tgz",
- "integrity": "sha512-wWEjrNtJfxzZmbDWdJSyRau7NWpQ6IFM9QAyn7xH3cQDGCj+Gy9lTU5sUIYQc+7sx3nKWztolc7h/M5meYCTAg==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-21.1.4.tgz",
+ "integrity": "sha512-lThgNDFHPQyrx0liNX3x8wHcgp1sd/Dym19zm1PSQ67k6J4snwxZFhNlwFHVr1K86XvX/vilyeR2edPLe9lF3Q==",
"requires": {
"tslib": "^2.3.0"
}
},
"@angular/router": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.1.3.tgz",
- "integrity": "sha512-uAw4LAMHXAPCe4SywhlUEWjMYVbbLHwTxLyduSp1b+9aVwep0juy5O/Xttlxd/oigVe0NMnOyJG9y1Br/ubnrg==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular/router/-/router-21.1.4.tgz",
+ "integrity": "sha512-nPYuRJ8ub/X8GK55U2KqYy/ducVRn6HSoDmZz0yiXtI6haFsZlv9R1j5zi0EDIqrrN0HGARMs6jNDXZC1Ded3w==",
"requires": {
"tslib": "^2.3.0"
}
@@ -29113,19 +29207,6 @@
"resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz",
"integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA=="
},
- "@isaacs/balanced-match": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
- "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="
- },
- "@isaacs/brace-expansion": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.1.tgz",
- "integrity": "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ==",
- "requires": {
- "@isaacs/balanced-match": "^4.0.1"
- }
- },
"@isaacs/fs-minipass": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
@@ -29960,9 +30041,9 @@
}
},
"@ngtools/webpack": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-21.1.3.tgz",
- "integrity": "sha512-Un4dHHELxuFwlSfjsHlmw73col+t0NID2hhx1JPRmKXBXAd4nDRJKX2LPouQLL0FFF+gOtA4mxabf5NruDTQNg==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-21.1.4.tgz",
+ "integrity": "sha512-CgKnMofIVGTwNPqFNZmkmr2aLOFUG/AKm8lauXU+juwSaY7Z28eguFd+J42uVUOnasLxINQY9y7kr9f6deTrcg==",
"dev": true
},
"@npmcli/agent": {
@@ -30654,19 +30735,19 @@
"dev": true
},
"@schematics/angular": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.1.3.tgz",
- "integrity": "sha512-obJvWBhzRdsYL2msM4+8bQD21vFl3VxaVsuiq6iIfYsxhU5i2Iar2wM9NaRaIIqAYhZ8ehQQ/moB9BEbWvDCTw==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-21.1.4.tgz",
+ "integrity": "sha512-I1zdSNzdbrVCWpeE2NsZQmIoa9m0nlw4INgdGIkqUH6FgwvoGKC0RoOxKAmm6HHVJ48FE/sPI13dwAeK89ow5A==",
"requires": {
- "@angular-devkit/core": "21.1.3",
- "@angular-devkit/schematics": "21.1.3",
+ "@angular-devkit/core": "21.1.4",
+ "@angular-devkit/schematics": "21.1.4",
"jsonc-parser": "3.3.1"
},
"dependencies": {
"@angular-devkit/core": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.3.tgz",
- "integrity": "sha512-huEXd1tWQHwwN+0VGRT+vSVplV0KNrGFUGJzkIW6iJE1SQElxn6etMai+pSd5DJcePkx6+SuscVsxbfwf70hnA==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.1.4.tgz",
+ "integrity": "sha512-ObPTI5gYCB1jGxTRhcqZ6oQVUBFVJ8GH4LksVuAiz0nFX7xxpzARWvlhq943EtnlovVlUd9I8fM3RQqjfGVVAQ==",
"requires": {
"ajv": "8.17.1",
"ajv-formats": "3.0.1",
@@ -30677,11 +30758,11 @@
}
},
"@angular-devkit/schematics": {
- "version": "21.1.3",
- "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.3.tgz",
- "integrity": "sha512-Ps7bRl5uOcM7WpNJHbSls/jz5/wAI0ldkTlKyiBFA7RtNeQIABAV+hvlw5DJuEb1Lo5hnK0hXj90AyZdOxzY+w==",
+ "version": "21.1.4",
+ "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.1.4.tgz",
+ "integrity": "sha512-Nqq0ioCUxrbEX+L4KOarETcZZJNnJ1mAJ0ubO4VM91qnn8RBBM9SnQ91590TfC34Szk/wh+3+Uj6KUvTJNuegQ==",
"requires": {
- "@angular-devkit/core": "21.1.3",
+ "@angular-devkit/core": "21.1.4",
"jsonc-parser": "3.3.1",
"magic-string": "0.30.21",
"ora": "9.0.0",
@@ -30750,12 +30831,12 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="
},
"string-width": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.1.tgz",
- "integrity": "sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==",
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz",
+ "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==",
"requires": {
- "get-east-asian-width": "^1.3.0",
- "strip-ansi": "^7.1.0"
+ "get-east-asian-width": "^1.5.0",
+ "strip-ansi": "^7.1.2"
}
},
"strip-ansi": {
@@ -31048,12 +31129,25 @@
"minimatch": "^10.1.1"
},
"dependencies": {
- "minimatch": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
- "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
+ "balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="
+ },
+ "brace-expansion": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
"requires": {
- "@isaacs/brace-expansion": "^5.0.0"
+ "balanced-match": "^4.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz",
+ "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==",
+ "requires": {
+ "brace-expansion": "^5.0.2"
}
}
}
@@ -31605,13 +31699,19 @@
"eslint-visitor-keys": "^4.2.1"
}
},
+ "balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true
+ },
"brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
"dev": true,
"requires": {
- "balanced-match": "^1.0.0"
+ "balanced-match": "^4.0.2"
}
},
"debug": {
@@ -31636,12 +31736,12 @@
"dev": true
},
"minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "version": "9.0.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz",
+ "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==",
"dev": true,
"requires": {
- "brace-expansion": "^2.0.1"
+ "brace-expansion": "^5.0.2"
}
}
}
@@ -31793,13 +31893,19 @@
"eslint-visitor-keys": "^4.2.1"
}
},
+ "balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true
+ },
"brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
"dev": true,
"requires": {
- "balanced-match": "^1.0.0"
+ "balanced-match": "^4.0.2"
}
},
"debug": {
@@ -31818,12 +31924,12 @@
"dev": true
},
"minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "version": "9.0.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz",
+ "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==",
"dev": true,
"requires": {
- "brace-expansion": "^2.0.1"
+ "brace-expansion": "^5.0.2"
}
}
}
@@ -31851,13 +31957,19 @@
"ts-api-utils": "^2.4.0"
},
"dependencies": {
+ "balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true
+ },
"brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
"dev": true,
"requires": {
- "balanced-match": "^1.0.0"
+ "balanced-match": "^4.0.2"
}
},
"debug": {
@@ -31870,12 +31982,12 @@
}
},
"minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "version": "9.0.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz",
+ "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==",
"dev": true,
"requires": {
- "brace-expansion": "^2.0.1"
+ "brace-expansion": "^5.0.2"
}
}
}
@@ -31952,13 +32064,19 @@
"eslint-visitor-keys": "^4.2.1"
}
},
+ "balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true
+ },
"brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
"dev": true,
"requires": {
- "balanced-match": "^1.0.0"
+ "balanced-match": "^4.0.2"
}
},
"debug": {
@@ -31977,12 +32095,12 @@
"dev": true
},
"minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "version": "9.0.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz",
+ "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==",
"dev": true,
"requires": {
- "brace-expansion": "^2.0.1"
+ "brace-expansion": "^5.0.2"
}
}
}
@@ -35087,9 +35205,9 @@
}
},
"minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "version": "5.1.7",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.7.tgz",
+ "integrity": "sha512-FjiwU9HaHW6YB3H4a1sFudnv93lvydNjz2lmyUXR6IwKhGI+bgL3SOZrBGn6kvvX2pJvhEkGSGjyTHN47O4rqA==",
"dev": true,
"requires": {
"brace-expansion": "^2.0.1"
@@ -35287,9 +35405,9 @@
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
},
"get-east-asian-width": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz",
- "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz",
+ "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA=="
},
"get-intrinsic": {
"version": "1.3.0",
@@ -35343,17 +35461,30 @@
"path-scurry": "^2.0.0"
},
"dependencies": {
+ "balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="
+ },
+ "brace-expansion": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
+ "requires": {
+ "balanced-match": "^4.0.2"
+ }
+ },
"lru-cache": {
"version": "11.2.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.1.tgz",
"integrity": "sha512-r8LA6i4LP4EeWOhqBaZZjDWwehd1xUJPCJd9Sv300H0ZmcUER4+JPh7bqqZeqs1o5pgtgvXm+d9UGrB5zZGDiQ=="
},
"minimatch": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
- "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz",
+ "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==",
"requires": {
- "@isaacs/brace-expansion": "^5.0.0"
+ "brace-expansion": "^5.0.2"
}
},
"path-scurry": {
@@ -35693,9 +35824,9 @@
}
},
"hono": {
- "version": "4.11.9",
- "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.9.tgz",
- "integrity": "sha512-Eaw2YTGM6WOxA6CXbckaEvslr2Ne4NFsKrvc0v97JD5awbmeBLO5w9Ho9L9kmKonrwF9RJlW6BxT1PVv/agBHQ=="
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.0.tgz",
+ "integrity": "sha512-NekXntS5M94pUfiVZ8oXXK/kkri+5WpX2/Ik+LVsl+uvw+soj4roXIsPqO+XsWrAw20mOzaXOZf3Q7PfB9A/IA=="
},
"hosted-git-info": {
"version": "9.0.2",
@@ -35976,12 +36107,25 @@
"minimatch": "^10.0.3"
},
"dependencies": {
- "minimatch": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
- "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
+ "balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="
+ },
+ "brace-expansion": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
"requires": {
- "@isaacs/brace-expansion": "^5.0.0"
+ "balanced-match": "^4.0.2"
+ }
+ },
+ "minimatch": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz",
+ "integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==",
+ "requires": {
+ "brace-expansion": "^5.0.2"
}
}
}
@@ -38097,9 +38241,9 @@
"dev": true
},
"minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz",
+ "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
@@ -39468,9 +39612,9 @@
"integrity": "sha512-C0cqfbS1P5hfqN4NhsYsUXePlk9BO+a45bAQ3xLYjBL3bOIFzoVEjs79Fado9u9BPBD3buHi3+vY+C8tHh4qMQ=="
},
"qs": {
- "version": "6.14.1",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
- "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
+ "version": "6.14.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz",
+ "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==",
"requires": {
"side-channel": "^1.1.0"
}
@@ -41542,13 +41686,19 @@
"eslint-visitor-keys": "^4.2.1"
}
},
+ "balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true
+ },
"brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
+ "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
"dev": true,
"requires": {
- "balanced-match": "^1.0.0"
+ "balanced-match": "^4.0.2"
}
},
"debug": {
@@ -41573,12 +41723,12 @@
"dev": true
},
"minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "version": "9.0.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz",
+ "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==",
"dev": true,
"requires": {
- "brace-expansion": "^2.0.1"
+ "brace-expansion": "^5.0.2"
}
}
}
diff --git a/frontend/package.json b/frontend/package.json
index 20c3c97e6df..d402501607d 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -6,13 +6,13 @@
"private": true,
"devDependencies": {
"@angular-builders/custom-esbuild": "^21.0.3",
- "@angular-devkit/build-angular": "^21.1.3",
+ "@angular-devkit/build-angular": "^21.1.4",
"@angular-eslint/builder": "20.7.0",
"@angular-eslint/eslint-plugin": "20.7.0",
"@angular-eslint/eslint-plugin-template": "20.7.0",
"@angular-eslint/schematics": "20.7.0",
"@angular-eslint/template-parser": "20.7.0",
- "@angular/language-service": "21.1.3",
+ "@angular/language-service": "21.1.4",
"@eslint/js": "^9.39.2",
"@html-eslint/eslint-plugin": "^0.54.2",
"@html-eslint/parser": "^0.54.0",
@@ -64,18 +64,18 @@
"wscat": "^6.1.0"
},
"dependencies": {
- "@angular/animations": "^21.1.3",
- "@angular/cdk": "^21.1.3",
- "@angular/cli": "^21.1.3",
- "@angular/common": "^21.1.3",
- "@angular/compiler": "^21.1.3",
- "@angular/compiler-cli": "^21.1.3",
- "@angular/core": "^21.1.3",
- "@angular/elements": "^21.1.3",
- "@angular/forms": "^21.1.3",
- "@angular/platform-browser": "^21.1.3",
- "@angular/platform-browser-dynamic": "^21.1.3",
- "@angular/router": "^21.1.3",
+ "@angular/animations": "^21.1.4",
+ "@angular/cdk": "^21.1.4",
+ "@angular/cli": "^21.1.4",
+ "@angular/common": "^21.1.4",
+ "@angular/compiler": "^21.1.4",
+ "@angular/compiler-cli": "^21.1.4",
+ "@angular/core": "^21.1.4",
+ "@angular/elements": "^21.1.4",
+ "@angular/forms": "^21.1.4",
+ "@angular/platform-browser": "^21.1.4",
+ "@angular/platform-browser-dynamic": "^21.1.4",
+ "@angular/router": "^21.1.4",
"@appsignal/javascript": "^1.6.1",
"@appsignal/plugin-breadcrumbs-console": "^1.1.37",
"@appsignal/plugin-breadcrumbs-network": "^1.1.24",
diff --git a/frontend/src/app/shared/components/grids/grid/grid.component.html b/frontend/src/app/shared/components/grids/grid/grid.component.html
index 805893d881a..8e47165da89 100644
--- a/frontend/src/app/shared/components/grids/grid/grid.component.html
+++ b/frontend/src/app/shared/components/grids/grid/grid.component.html
@@ -3,7 +3,7 @@
[style.grid-template-rows]="gridRowStyle">
- @for (area of layout.widgetAreas; track identifyGridArea($index, area)) {
+ @for (area of widgetAreasForDisplay; track identifyGridArea($index, area)) {
+ (a.startRow - 1) * this.layout.numColumns + a.startColumn;
+
+ const key = (a:GridWidgetArea) =>
+ (a.widget?.id ?? a.guid).toString();
+
+ return [...(this.layout.widgetAreas || [])].sort((a, b) => {
+ const diff = index(a) - index(b);
+ return diff !== 0 ? diff : key(a).localeCompare(key(b));
+ });
+ }
+
public identifyGridArea(index:number, area:GridArea) {
return area.guid;
}
diff --git a/frontend/src/app/shared/components/grids/widgets/header/header.component.html b/frontend/src/app/shared/components/grids/widgets/header/header.component.html
index 1d0db85e286..913865975d8 100644
--- a/frontend/src/app/shared/components/grids/widgets/header/header.component.html
+++ b/frontend/src/app/shared/components/grids/widgets/header/header.component.html
@@ -1,20 +1,22 @@
- |