From 86909ef4575f2b4d4ef5a8931d30aa734b7f99b2 Mon Sep 17 00:00:00 2001 From: Ivan Kuchin <i.kuchin@openproject.com> Date: Tue, 14 May 2024 15:48:22 +0200 Subject: [PATCH 01/40] rename persisted project query --- .../index_page_header_component.html.erb | 13 ++++++-- .../projects/index_page_header_component.rb | 2 ++ .../projects/queries_controller.rb | 8 ++++- .../queries/projects/{create.rb => form.rb} | 9 +++-- config/routes.rb | 2 +- .../projects/queries_controller_spec.rb | 33 +++++++++++++++++++ .../features/projects/persisted_lists_spec.rb | 24 ++++++++++---- spec/support/pages/projects/index.rb | 10 ++++++ 8 files changed, 89 insertions(+), 12 deletions(-) rename app/forms/queries/projects/{create.rb => form.rb} (92%) diff --git a/app/components/projects/index_page_header_component.html.erb b/app/components/projects/index_page_header_component.html.erb index 6d9c1e479e8c..b1a4364777aa 100644 --- a/app/components/projects/index_page_header_component.html.erb +++ b/app/components/projects/index_page_header_component.html.erb @@ -29,6 +29,15 @@ "aria-label": t(:label_more), data: { "test-selector": "project-more-dropdown-menu" } }) do |menu| + if can_rename? + menu.with_item( + label: t('button_rename'), + href: edit_projects_query_path(query), + ) do |item| + item.with_leading_visual_icon(icon: :pencil) + end + end + if gantt_portfolio_project_ids.any? menu.with_item( tag: :a, @@ -92,7 +101,7 @@ render(Primer::OpenProject::PageHeader.new) do |header| header.with_title(data: { 'test-selector': 'project-query-name'}) do primer_form_with(model: query, - url: projects_queries_path, + url: @query.new_record? ? projects_queries_path : projects_query_path(@query), scope: 'query', data: { controller: "params-from-query", @@ -100,7 +109,7 @@ 'params-from-query-allowed-value': '["filters", "columns", "query_id", "sortBy"]' }, id: 'project-save-form') do |f| - render(Queries::Projects::Create.new(f)) + render(Queries::Projects::Form.new(f, query:)) end end header.with_breadcrumbs(breadcrumb_items) diff --git a/app/components/projects/index_page_header_component.rb b/app/components/projects/index_page_header_component.rb index c49a6dc05405..6031a85ce51e 100644 --- a/app/components/projects/index_page_header_component.rb +++ b/app/components/projects/index_page_header_component.rb @@ -75,6 +75,8 @@ def can_save_as? = may_save_as? && query.changed? def can_save? = can_save_as? && query.persisted? && query.user == current_user + def can_rename? = may_save_as? && query.persisted? && query.user == current_user + def show_state? state == :show end diff --git a/app/controllers/projects/queries_controller.rb b/app/controllers/projects/queries_controller.rb index a3a62aa642f7..5a41c5a71e1a 100644 --- a/app/controllers/projects/queries_controller.rb +++ b/app/controllers/projects/queries_controller.rb @@ -31,7 +31,7 @@ class Projects::QueriesController < ApplicationController # No need for a more specific authorization check. That is carried out in the contracts. before_action :require_login - before_action :find_query, only: %i[update destroy] + before_action :find_query, only: %i[edit update destroy] before_action :build_query_or_deny_access, only: %i[new create] current_menu_item [:new, :create] do @@ -44,6 +44,12 @@ def new locals: { query: @query, state: :edit } end + def edit + render template: "/projects/index", + layout: "global", + locals: { query: @query, state: :edit } + end + def create call = Queries::Projects::ProjectQueries::CreateService .new(from: @query, user: current_user) diff --git a/app/forms/queries/projects/create.rb b/app/forms/queries/projects/form.rb similarity index 92% rename from app/forms/queries/projects/create.rb rename to app/forms/queries/projects/form.rb index f6cc39ce1a29..4de5994d4a4b 100644 --- a/app/forms/queries/projects/create.rb +++ b/app/forms/queries/projects/form.rb @@ -26,7 +26,7 @@ # See COPYRIGHT and LICENSE files for more details. # ++ -class Queries::Projects::Create < ApplicationForm +class Queries::Projects::Form < ApplicationForm include OpenProject::StaticRouting::UrlHelpers form do |query_form| @@ -52,8 +52,13 @@ class Queries::Projects::Create < ApplicationForm label: I18n.t(:button_cancel), tag: :a, data: { "params-from-query-target": "anchor" }, - href: OpenProject::StaticRouting::StaticUrlHelpers.new.projects_path + href: projects_path(query_id: @query) ) end end + + def initialize(query:) + super() + @query = query + end end diff --git a/config/routes.rb b/config/routes.rb index 88a188eb2d22..264b799aa8da 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -181,7 +181,7 @@ namespace :projects do resource :menu, only: %i[show] - resources :queries, only: %i[new create update destroy] + resources :queries, only: %i[new edit create update destroy] end resources :projects, except: %i[show edit create update] do diff --git a/spec/controllers/projects/queries_controller_spec.rb b/spec/controllers/projects/queries_controller_spec.rb index ad5214713acb..c22cd39e6a6d 100644 --- a/spec/controllers/projects/queries_controller_spec.rb +++ b/spec/controllers/projects/queries_controller_spec.rb @@ -67,6 +67,39 @@ end end + describe "#edit" do + it "requires login" do + get "edit", params: { id: 42 } + + expect(response).not_to be_successful + end + + context "when logged in" do + let(:query) { build_stubbed(:project_query) } + let(:query_id) { "42" } + + before do + allow(Queries::Projects::ProjectQuery).to receive(:find).with(query_id).and_return(query) + + login_as user + end + + it "renders projects/index" do + get "edit", params: { id: 42 } + + expect(response).to render_template("projects/index") + end + + it "passes variables to template" do + allow(controller).to receive(:render).and_call_original + + get "edit", params: { id: 42 } + + expect(controller).to have_received(:render).with(include(locals: { query:, state: :edit })) + end + end + end + describe "#create" do let(:service_class) { Queries::Projects::ProjectQueries::CreateService } diff --git a/spec/features/projects/persisted_lists_spec.rb b/spec/features/projects/persisted_lists_spec.rb index e8976c70003b..e404654c9899 100644 --- a/spec/features/projects/persisted_lists_spec.rb +++ b/spec/features/projects/persisted_lists_spec.rb @@ -214,18 +214,20 @@ let!(:project_member) { create(:member, principal: user, project:, roles: [developer]) } let!(:development_project_member) { create(:member, principal: user, project: development_project, roles: [developer]) } - it "allows saving, loading and deleting persisted filters and columns" do + it "allows saving, renaming, loading and deleting persisted filters and columns" do projects_page.visit! # The default filter is active projects_page.expect_title("Active projects") - # Since the query is static, no save button is shown + # Since the query is static, no save button an no menu item is shown projects_page.expect_no_notification("Save") projects_page.expect_no_menu_item("Save", visible: false) # Since the query is unchanged, no save as button is shown projects_page.expect_no_notification("Save as") # But save as menu item is always present projects_page.expect_menu_item("Save as", visible: false) + # Since the query is not persisted, no rename button is shown + projects_page.expect_no_menu_item("Rename", visible: false) # Default filters are applied projects_page.expect_projects_listed(project, public_project, development_project) @@ -238,12 +240,14 @@ # By applying another filter, the title is changed as it does not longer match the default filter projects_page.expect_title("Projects") - # Since the query is static, no save button is shown + # Since the query is static, no save button an no menu item is shown projects_page.expect_no_notification("Save") projects_page.expect_no_menu_item("Save", visible: false) - # Since the query changed, save as button is shown + # Since the query changed, save as button and menu item are shown projects_page.expect_notification("Save as") projects_page.expect_menu_item("Save as", visible: false) + # Since the query is not persisted, no rename button is shown + projects_page.expect_no_menu_item("Rename", visible: false) # The filters are applied projects_page.expect_projects_listed(project, development_project) @@ -279,6 +283,8 @@ projects_page.expect_no_menu_item("Save", visible: false) # But save as menu item is always present projects_page.expect_menu_item("Save as", visible: false) + # Since the query is persisted, rename button is shown + projects_page.expect_menu_item("Rename", visible: false) # Modifying to save again projects_page.set_columns("Name", "Public") @@ -292,6 +298,12 @@ # Duplicating (without changes) projects_page.save_query_as("My duplicated query") + projects_page.expect_sidebar_filter("My duplicated query", selected: false) + + # Renaming + projects_page.rename_to("My renamed query") + projects_page.expect_no_sidebar_filter("My duplicated query") + projects_page.expect_sidebar_filter("My renamed query", selected: false) # Modifying to save as again projects_page.set_columns("Name", "Status", "Public") @@ -303,8 +315,8 @@ projects_page.expect_columns("Name", "Public") projects_page.expect_no_columns("Status") - # Checked duplicated query - projects_page.set_sidebar_filter("My duplicated query") + # Checked renamed query + projects_page.set_sidebar_filter("My renamed query") projects_page.expect_columns("Name", "Public") projects_page.expect_no_columns("Status") diff --git a/spec/support/pages/projects/index.rb b/spec/support/pages/projects/index.rb index 298029ae77fc..2b664c2414ca 100644 --- a/spec/support/pages/projects/index.rb +++ b/spec/support/pages/projects/index.rb @@ -334,6 +334,16 @@ def save_query_as(name) click_on "Save" end + def rename_to(name) + click_more_menu_item("Rename") + + within '[data-test-selector="project-query-name"]' do + fill_in "Name", with: name + end + + click_on "Save" + end + def delete_query click_more_menu_item("Delete") From 6b5f4618ba248dc025e46b34c26adf5650869081 Mon Sep 17 00:00:00 2001 From: Ivan Kuchin <i.kuchin@openproject.com> Date: Thu, 16 May 2024 19:41:29 +0200 Subject: [PATCH 02/40] fix projects menu --- .../projects/index_page_header_component.rb | 17 ++-- app/controllers/projects/menus_controller.rb | 7 +- .../projects/queries_controller.rb | 2 +- .../menus/{projects_helper.rb => projects.rb} | 86 +++++++++++-------- app/models/queries/projects/factory.rb | 2 + app/views/projects/menus/_menu.html.erb | 5 +- 6 files changed, 72 insertions(+), 47 deletions(-) rename app/helpers/menus/{projects_helper.rb => projects.rb} (54%) diff --git a/app/components/projects/index_page_header_component.rb b/app/components/projects/index_page_header_component.rb index 6031a85ce51e..64fbe7a62507 100644 --- a/app/components/projects/index_page_header_component.rb +++ b/app/components/projects/index_page_header_component.rb @@ -31,7 +31,6 @@ class Projects::IndexPageHeaderComponent < ApplicationComponent include OpPrimer::ComponentHelpers include Primer::FetchOrFallbackHelper - include Menus::ProjectsHelper attr_accessor :current_user, :query, @@ -91,17 +90,21 @@ def breadcrumb_items def current_breadcrumb_element return page_title if query.name.blank? - current_object = first_level_menu_items.find do |section| - section.children.any?(&:selected) - end - - if current_object && current_object.header.present? - I18n.t("menus.breadcrumb.nested_element", section_header: current_object.header, title: query.name).html_safe + if current_section && current_section.header.present? + I18n.t("menus.breadcrumb.nested_element", section_header: current_section.header, title: query.name).html_safe else page_title end end + def current_section + return @current_section if defined?(@current_section) + + projects_menu = Menus::Projects.new(controller_path:, params:, current_user:) + + @current_section = projects_menu.first_level_menu_items.find { |section| section.children.any?(&:selected) } + end + def header_save_action(header:, message:, label:, href:, method: nil) header.with_action_text { message } diff --git a/app/controllers/projects/menus_controller.rb b/app/controllers/projects/menus_controller.rb index fe5559240f37..57edb6124e8f 100644 --- a/app/controllers/projects/menus_controller.rb +++ b/app/controllers/projects/menus_controller.rb @@ -27,13 +27,14 @@ # ++ module Projects class MenusController < ApplicationController - include Menus::ProjectsHelper - # No authorize as every user (or logged in user) # is allowed to see the menu. def show - @sidebar_menu_items = first_level_menu_items + projects_menu = Menus::Projects.new(controller_path: params[:controller_path], params:, current_user:) + + @sidebar_menu_items = projects_menu.first_level_menu_items + render layout: nil end end diff --git a/app/controllers/projects/queries_controller.rb b/app/controllers/projects/queries_controller.rb index 5a41c5a71e1a..dc0597067fd1 100644 --- a/app/controllers/projects/queries_controller.rb +++ b/app/controllers/projects/queries_controller.rb @@ -34,7 +34,7 @@ class Projects::QueriesController < ApplicationController before_action :find_query, only: %i[edit update destroy] before_action :build_query_or_deny_access, only: %i[new create] - current_menu_item [:new, :create] do + current_menu_item [:new, :edit, :create, :update] do :projects end diff --git a/app/helpers/menus/projects_helper.rb b/app/helpers/menus/projects.rb similarity index 54% rename from app/helpers/menus/projects_helper.rb rename to app/helpers/menus/projects.rb index 09a84b395ba4..fae5464c58ea 100644 --- a/app/helpers/menus/projects_helper.rb +++ b/app/helpers/menus/projects.rb @@ -27,70 +27,86 @@ #++ module Menus - module ProjectsHelper + class Projects + include Rails.application.routes.url_helpers + + attr_reader :controller_path, :params, :current_user + + def initialize(controller_path:, params:, current_user:) + # rubocop:disable Rails/HelperInstanceVariable + @controller_path = controller_path + @params = params + @current_user = current_user + # rubocop:enable Rails/HelperInstanceVariable + end + def first_level_menu_items [ OpenProject::Menu::MenuGroup.new(header: nil, - children: static_filters), + children: main_static_filters), OpenProject::Menu::MenuGroup.new(header: I18n.t(:"projects.lists.my_private"), children: my_filters), OpenProject::Menu::MenuGroup.new(header: I18n.t(:"activerecord.attributes.project.status_code"), - children: static_status_filters) + children: status_static_filters) ] end private - def static_filters - [ - query_menu_item(::Queries::Projects::Factory.static_query_active, selected: no_query_props?), - query_menu_item(::Queries::Projects::Factory.static_query_favored, - id: ::Queries::Projects::Factory::STATIC_FAVORED), - query_menu_item(::Queries::Projects::Factory.static_query_my, - id: ::Queries::Projects::Factory::STATIC_MY), - query_menu_item(::Queries::Projects::Factory.static_query_archived, - id: ::Queries::Projects::Factory::STATIC_ARCHIVED) - ].compact + def main_static_filters + static_filters [ + ::Queries::Projects::Factory::STATIC_ACTIVE, + ::Queries::Projects::Factory::STATIC_MY, + ::Queries::Projects::Factory::STATIC_FAVORED, + ::Queries::Projects::Factory::STATIC_ARCHIVED + ] end - def static_status_filters - [ - query_menu_item(::Queries::Projects::Factory.static_query_status_on_track, - id: ::Queries::Projects::Factory::STATIC_ON_TRACK), - query_menu_item(::Queries::Projects::Factory.static_query_status_off_track, - id: ::Queries::Projects::Factory::STATIC_OFF_TRACK), - query_menu_item(::Queries::Projects::Factory.static_query_status_at_risk, - id: ::Queries::Projects::Factory::STATIC_AT_RISK) + def status_static_filters + static_filters [ + ::Queries::Projects::Factory::STATIC_ON_TRACK, + ::Queries::Projects::Factory::STATIC_OFF_TRACK, + ::Queries::Projects::Factory::STATIC_AT_RISK ] end + def static_filters(ids) + ids.map do |id| + query_menu_item(::Queries::Projects::Factory.static_query(id), id:) + end + end + def my_filters ::Queries::Projects::ProjectQuery .where(user: current_user) .order(:name) - .map do |query| - query_menu_item(query) - end + .map { |query| query_menu_item(query) } end - def query_menu_item(query, id: nil, selected: query_item_selected?(id || query.id)) + def query_menu_item(query, id: nil) OpenProject::Menu::MenuItem.new(title: query.name, href: projects_path(query_id: id || query.id), - selected:) - end - - def projects_path_with_filters(filters) - return projects_path if filters.empty? - - projects_path(filters: filters.to_json, hide_filters_section: true) + selected: query_item_selected?(id || query.id)) end def query_item_selected?(id) - id.to_s == params[:query_id] && params[:filters].nil? + case controller_path + when "projects" + case params[:query_id] + when nil + id.to_s == Queries::Projects::Factory::DEFAULT_STATIC + when /\A\d+\z/ + id.to_s == params[:query_id] + else + id.to_s == params[:query_id] unless modification_params? + end + when "projects/queries" + id.to_s == params[:id] + end end - def no_query_props? - params[:query_id].nil? && params[:filters].nil? && params[:sortBy].nil? + def modification_params? + params.values_at(:filters, :columns, :sortBy).any? end end end diff --git a/app/models/queries/projects/factory.rb b/app/models/queries/projects/factory.rb index 7268b57ac770..818c7dd2594e 100644 --- a/app/models/queries/projects/factory.rb +++ b/app/models/queries/projects/factory.rb @@ -35,6 +35,8 @@ class Queries::Projects::Factory STATIC_OFF_TRACK = "off_track".freeze STATIC_AT_RISK = "at_risk".freeze + DEFAULT_STATIC = STATIC_ACTIVE + class << self def find(id, params:, user:, duplicate: false) find_static_query_and_set_attributes(id, params, user, duplicate:) || diff --git a/app/views/projects/menus/_menu.html.erb b/app/views/projects/menus/_menu.html.erb index d856f3e617a6..56256b5e2acd 100644 --- a/app/views/projects/menus/_menu.html.erb +++ b/app/views/projects/menus/_menu.html.erb @@ -1,5 +1,8 @@ <%= turbo_frame_tag "projects_sidemenu", - src: projects_menu_path(params.permit(:filters, :sortBy, :query_id)), + src: projects_menu_path( + controller_path:, + **params.permit(:filters, :columns, :sortBy, :id, :query_id) + ), target: '_top', data: { turbo: false }, loading: :lazy %> From 5ddcb59b28bde7065d6a61ceca53f9fac6c2c10a Mon Sep 17 00:00:00 2001 From: Ivan Kuchin <i.kuchin@openproject.com> Date: Fri, 17 May 2024 18:44:20 +0200 Subject: [PATCH 03/40] test projects menu --- spec/helpers/menus/projects_spec.rb | 184 ++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 spec/helpers/menus/projects_spec.rb diff --git a/spec/helpers/menus/projects_spec.rb b/spec/helpers/menus/projects_spec.rb new file mode 100644 index 000000000000..71a2cdfe40c2 --- /dev/null +++ b/spec/helpers/menus/projects_spec.rb @@ -0,0 +1,184 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) 2012-2024 the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "spec_helper" + +RSpec.describe Menus::Projects do + let(:instance) { described_class.new(controller_path:, params:, current_user:) } + let(:controller_path) { "foo" } + let(:params) { {} } + + shared_let(:current_user) { build(:user) } + + shared_let(:current_user_query) do + Queries::Projects::ProjectQuery.create!(name: "Current user query", user: current_user) + end + + shared_let(:other_user_query) do + Queries::Projects::ProjectQuery.create!(name: "Other user query", user: build(:user)) + end + + subject(:first_level_menu_items) { instance.first_level_menu_items } + + it "returns 3 menu groups" do + expect(first_level_menu_items).to all(be_a(OpenProject::Menu::MenuGroup)) + expect(first_level_menu_items.length).to eq(3) + end + + describe "children items" do + subject(:children_menu_items) { first_level_menu_items.flat_map(&:children) } + + it "contains menu items" do + expect(children_menu_items).to all(be_a(OpenProject::Menu::MenuItem)) + end + + it "contains item for current user query" do + expect(children_menu_items).to include(have_attributes(title: "Current user query")) + end + + it "doesn't contain item for other user query" do + expect(children_menu_items).not_to include(have_attributes(title: "Other user query")) + end + end + + describe "selected children items" do + subject(:selected_menu_items) { first_level_menu_items.flat_map(&:children).select(&:selected) } + + context "when on homescreen page" do + let(:controller_path) { "homescreen" } + + context "without params" do + it "has no selected items" do + expect(selected_menu_items).to be_empty + end + end + + context "with query_id param" do + let(:params) { { query_id: current_user_query.id.to_s } } + + it "has no selected items" do + expect(selected_menu_items).to be_empty + end + end + + context "with id param" do + let(:params) { { id: current_user_query.id.to_s } } + + it "has no selected items" do + expect(selected_menu_items).to be_empty + end + end + end + + context "when on projects page" do + let(:controller_path) { "projects" } + + context "without params" do + it "has default item selected" do + expect(selected_menu_items).to contain_exactly(have_attributes(title: "Active projects")) + end + end + + context "with id param" do + let(:params) { { id: current_user_query.id.to_s } } + + it "has default item selected" do + expect(selected_menu_items).to contain_exactly(have_attributes(title: "Active projects")) + end + end + + context "with query_id param for active projects" do + let(:params) { { query_id: "active" } } + + it "has active projects selected" do + expect(selected_menu_items).to contain_exactly(have_attributes(title: "Active projects")) + end + end + + context "with query_id param for at_risk projects" do + let(:params) { { query_id: "at_risk" } } + + it "has active projects selected" do + expect(selected_menu_items).to contain_exactly(have_attributes(title: "At risk")) + end + end + + context "with query_id param for current user query" do + let(:params) { { query_id: current_user_query.id.to_s } } + + it "has current user query selected" do + expect(selected_menu_items).to contain_exactly(have_attributes(title: "Current user query")) + end + end + + context "with query_id param for active projects and modifications to query" do + let(:params) { { query_id: "active", columns: "foo" } } + + it "has no selected items" do + expect(selected_menu_items).to be_empty + end + end + + context "with query_id param for current user query and modifications to query" do + let(:params) { { query_id: current_user_query.id.to_s, columns: "foo" } } + + it "has current user query selected" do + expect(selected_menu_items).to contain_exactly(have_attributes(title: "Current user query")) + end + end + end + + context "when on project queries page" do + let(:controller_path) { "projects/queries" } + + context "without params" do + it "has no selected items" do + expect(selected_menu_items).to be_empty + end + end + + context "with query_id param" do + let(:params) { { query_id: current_user_query.id.to_s } } + + it "has no selected items" do + expect(selected_menu_items).to be_empty + end + end + + context "with id param for current user query" do + let(:params) { { id: current_user_query.id.to_s } } + + it "has current user query selected" do + expect(selected_menu_items).to contain_exactly(have_attributes(title: "Current user query")) + end + end + end + end +end From e4690618c4baa5a4e07b421c0ebb8056f4b72a62 Mon Sep 17 00:00:00 2001 From: Ivan Kuchin <i.kuchin@openproject.com> Date: Tue, 21 May 2024 15:59:12 +0200 Subject: [PATCH 04/40] split single huge persisting queries spec into multiple --- .../features/projects/persisted_lists_spec.rb | 107 ++++++++++-------- spec/support/pages/projects/index.rb | 4 +- 2 files changed, 65 insertions(+), 46 deletions(-) diff --git a/spec/features/projects/persisted_lists_spec.rb b/spec/features/projects/persisted_lists_spec.rb index e404654c9899..67e66e4bae66 100644 --- a/spec/features/projects/persisted_lists_spec.rb +++ b/spec/features/projects/persisted_lists_spec.rb @@ -213,12 +213,20 @@ let!(:project_member) { create(:member, principal: user, project:, roles: [developer]) } let!(:development_project_member) { create(:member, principal: user, project: development_project, roles: [developer]) } + let!(:persisted_query) do + build(:project_query, user:, name: "Persisted query") + .where("active", "=", "t") + .select("name") + .save! + end - it "allows saving, renaming, loading and deleting persisted filters and columns" do + before do projects_page.visit! + end - # The default filter is active + it "starts at active projects static query" do projects_page.expect_title("Active projects") + # Since the query is static, no save button an no menu item is shown projects_page.expect_no_notification("Save") projects_page.expect_no_menu_item("Save", visible: false) @@ -229,17 +237,15 @@ # Since the query is not persisted, no rename button is shown projects_page.expect_no_menu_item("Rename", visible: false) - # Default filters are applied projects_page.expect_projects_listed(project, public_project, development_project) projects_page.expect_columns("Name", "Status") projects_page.expect_no_columns("Public") + end - # Adding some filters + it "allows changing filters" do projects_page.open_filters projects_page.filter_by_membership("yes") - # By applying another filter, the title is changed as it does not longer match the default filter - projects_page.expect_title("Projects") # Since the query is static, no save button an no menu item is shown projects_page.expect_no_notification("Save") projects_page.expect_no_menu_item("Save", visible: false) @@ -249,18 +255,35 @@ # Since the query is not persisted, no rename button is shown projects_page.expect_no_menu_item("Rename", visible: false) - # The filters are applied + # By applying another filter, the title is changed as it does not longer match the default filter + projects_page.expect_title("Projects") projects_page.expect_projects_listed(project, development_project) projects_page.expect_projects_not_listed(public_project) + end + it "allows changing columns" do projects_page.set_columns("Name") + projects_page.expect_columns("Name") projects_page.expect_no_columns("Status", "Public") + end - # Saving the query + it "allows saving static query as persisted list without changes" do + projects_page.save_query_as("Active project copy") + + projects_page.expect_sidebar_filter("Active project copy", selected: true) + projects_page.expect_columns("Name", "Status") + projects_page.expect_no_columns("Public") + end + + it "allows saving static query as user list" do + projects_page.open_filters + projects_page.filter_by_membership("yes") + projects_page.set_columns("Name") projects_page.save_query_as("My saved query") + # It will be displayed in the sidebar - projects_page.expect_sidebar_filter("My saved query", selected: false) + projects_page.expect_sidebar_filter("My saved query", selected: true) # Opening the default filter again to reset the values projects_page.set_sidebar_filter("Active projects") @@ -277,59 +300,53 @@ projects_page.expect_projects_not_listed(public_project) projects_page.expect_columns("Name") projects_page.expect_no_columns("Status", "Public") + # Since the query was not changed, no save or save as button is shown projects_page.expect_no_notification("Save") - projects_page.expect_no_notification("Save as") projects_page.expect_no_menu_item("Save", visible: false) + projects_page.expect_no_notification("Save as") # But save as menu item is always present projects_page.expect_menu_item("Save as", visible: false) # Since the query is persisted, rename button is shown projects_page.expect_menu_item("Rename", visible: false) + end - # Modifying to save again - projects_page.set_columns("Name", "Public") - # Since the query was changed, there is a save button and both save and save as in the menu - projects_page.expect_notification("Save") - projects_page.expect_no_notification("Save as") - projects_page.expect_menu_item("Save", visible: false) - projects_page.expect_menu_item("Save as", visible: false) - # Save inplace - projects_page.save_query - - # Duplicating (without changes) - projects_page.save_query_as("My duplicated query") - projects_page.expect_sidebar_filter("My duplicated query", selected: false) - - # Renaming - projects_page.rename_to("My renamed query") - projects_page.expect_no_sidebar_filter("My duplicated query") - projects_page.expect_sidebar_filter("My renamed query", selected: false) - - # Modifying to save as again + it "allows saving persisted query with new name" do + projects_page.set_sidebar_filter("Persisted query") projects_page.set_columns("Name", "Status", "Public") projects_page.save_query_as("My new saved query") - projects_page.expect_sidebar_filter("My new saved query", selected: false) - # Checked query saved inplace - projects_page.set_sidebar_filter("My saved query") - projects_page.expect_columns("Name", "Public") - projects_page.expect_no_columns("Status") + projects_page.expect_sidebar_filter("Persisted query", selected: false) + projects_page.expect_sidebar_filter("My new saved query", selected: true) + projects_page.expect_columns("Name", "Status", "Public") + end - # Checked renamed query - projects_page.set_sidebar_filter("My renamed query") - projects_page.expect_columns("Name", "Public") - projects_page.expect_no_columns("Status") + it "allows duplicating persisted query without changes" do + projects_page.set_sidebar_filter("Persisted query") + projects_page.save_query_as("My duplicated query") - # Checked second saved query - projects_page.set_sidebar_filter("My new saved query") - projects_page.expect_columns("Name", "Status", "Public") + projects_page.expect_sidebar_filter("Persisted query", selected: false) + projects_page.expect_sidebar_filter("My duplicated query", selected: true) + projects_page.expect_columns("Name") + projects_page.expect_no_columns("Status", "Public") + end + + it "allows renaming persisted query" do + projects_page.set_sidebar_filter("Persisted query") + projects_page.rename_to("My renamed query") + + projects_page.expect_no_sidebar_filter("Persisted query") + projects_page.expect_sidebar_filter("My renamed query", selected: true) + projects_page.expect_columns("Name") + projects_page.expect_no_columns("Status", "Public") + end - # The query can be deleted + it "allows deleting persisted query" do + projects_page.set_sidebar_filter("Persisted query") projects_page.delete_query - # It will then also be removed from the sidebar projects_page.expect_no_sidebar_filter("My new saved query") - # And the default filter will be active again + # Default filter will be active again projects_page.expect_title("Active projects") projects_page.expect_projects_listed(project, public_project, development_project) projects_page.expect_columns("Name", "Status") diff --git a/spec/support/pages/projects/index.rb b/spec/support/pages/projects/index.rb index 2b664c2414ca..e25c5dc39f9d 100644 --- a/spec/support/pages/projects/index.rb +++ b/spec/support/pages/projects/index.rb @@ -77,7 +77,9 @@ def expect_title(name) def expect_sidebar_filter(filter_name, selected: false) within "#main-menu" do - expect(page).to have_css(".op-sidemenu--item-action#{selected ? '.selected' : ''}", text: filter_name) + selected_specifier = selected ? ".selected" : ":not(.selected)" + + expect(page).to have_css(".op-sidemenu--item-action#{selected_specifier}", text: filter_name) end end From 9adc0ec75172aab198b7a7741929ce0adcd13699 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= <mail@oliverguenther.de> Date: Wed, 22 May 2024 09:21:40 +0200 Subject: [PATCH 05/40] Prevent plain text from being inlinable --- app/models/attachment.rb | 7 +- lib/api/helpers/attachment_renderer.rb | 13 +++- .../security/plain_text_content_type.rb | 74 +++++++++++++++++++ 3 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 spec/features/security/plain_text_content_type.rb diff --git a/app/models/attachment.rb b/app/models/attachment.rb index 2dbce28730ef..3772a2c6ca00 100644 --- a/app/models/attachment.rb +++ b/app/models/attachment.rb @@ -137,9 +137,10 @@ def pending_virus_scan? status_uploaded? && Setting::VirusScanning.enabled? end - # images are sent inline + # Determine mime types that we deem safe for inline content disposition + # e.g., which will be loaded by the browser without forcing to download them def inlineable? - is_plain_text? || is_image? || is_movie? || is_pdf? + is_text? || is_image? || is_movie? || is_pdf? end # rubocop:disable Naming/PredicateName @@ -163,7 +164,7 @@ def is_pdf? end def is_text? - content_type =~ /\Atext\/.+/ + content_type.match?(/\Atext\/.+/) end def is_diff? diff --git a/lib/api/helpers/attachment_renderer.rb b/lib/api/helpers/attachment_renderer.rb index e4d13a939d7c..440b0935aa37 100644 --- a/lib/api/helpers/attachment_renderer.rb +++ b/lib/api/helpers/attachment_renderer.rb @@ -86,12 +86,23 @@ def redirect_to_external_attachment(attachment, cache_seconds) end def send_attachment(attachment) - content_type attachment.content_type + content_type attachment_content_type(attachment) header["Content-Disposition"] = attachment.content_disposition env["api.format"] = :binary sendfile attachment.diskfile.path end + def attachment_content_type(attachment) + if attachment.is_text? + "text/plain" + elsif attachment.inlineable? + attachment.content_type + else + # For security reasons, mark all non-inlinable files as an octet-stream first + "application/octet-stream" + end + end + def set_cache_headers set_cache_headers! if @stream end diff --git a/spec/features/security/plain_text_content_type.rb b/spec/features/security/plain_text_content_type.rb new file mode 100644 index 000000000000..1179304f25bb --- /dev/null +++ b/spec/features/security/plain_text_content_type.rb @@ -0,0 +1,74 @@ +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) 2012-2024 the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "spec_helper" + +RSpec.describe "Session TTL", + with_settings: { session_ttl_enabled?: true, session_ttl: "10" } do + shared_let(:admin) { create(:admin) } + let(:admin_password) { "adminADMIN!" } + + let!(:work_package) { create(:work_package) } + + before do + login_with(admin.login, admin_password) + end + + def expire! + page.set_rack_session(updated_at: Time.now - 1.hour) + end + + describe "outdated TTL on Rails request" do + it "expires on the next Rails request" do + visit "/my/account" + expect(page).to have_css(".form--field-container", text: admin.login) + + # Expire the session + expire! + + visit "/" + expect(page).to have_css(".action-login") + end + end + + describe "outdated TTL on API request" do + it "expires on the next APIv3 request" do + page.driver.header("X-Requested-With", "XMLHttpRequest") + visit "/api/v3/work_packages/#{work_package.id}" + + body = JSON.parse(page.body) + expect(body["id"]).to eq(work_package.id) + + # Expire the session + expire! + visit "/api/v3/work_packages/#{work_package.id}" + + expect(page.body).to eq("unauthorized") + end + end +end From aec8632d38f6e623602e77a500e0546ea4db2da1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= <mail@oliverguenther.de> Date: Wed, 22 May 2024 10:56:02 +0200 Subject: [PATCH 06/40] Add spec --- lib/api/helpers/attachment_renderer.rb | 2 + .../security/plain_text_content_type.rb | 62 +++++++++---------- spec/fixtures/files/test.js | 1 + .../attachment_resource_shared_examples.rb | 13 +++- 4 files changed, 46 insertions(+), 32 deletions(-) create mode 100644 spec/fixtures/files/test.js diff --git a/lib/api/helpers/attachment_renderer.rb b/lib/api/helpers/attachment_renderer.rb index 440b0935aa37..25ae274267be 100644 --- a/lib/api/helpers/attachment_renderer.rb +++ b/lib/api/helpers/attachment_renderer.rb @@ -94,6 +94,8 @@ def send_attachment(attachment) def attachment_content_type(attachment) if attachment.is_text? + # Even if the text mime type might differ, always output plain text + # so this doesn't get interpreted as e.g., a script or html file "text/plain" elsif attachment.inlineable? attachment.content_type diff --git a/spec/features/security/plain_text_content_type.rb b/spec/features/security/plain_text_content_type.rb index 1179304f25bb..465aa49cdbbf 100644 --- a/spec/features/security/plain_text_content_type.rb +++ b/spec/features/security/plain_text_content_type.rb @@ -28,47 +28,47 @@ require "spec_helper" -RSpec.describe "Session TTL", - with_settings: { session_ttl_enabled?: true, session_ttl: "10" } do +RSpec.describe "Plain text content type XSS prevention", :js, :with_cuprite do shared_let(:admin) { create(:admin) } - let(:admin_password) { "adminADMIN!" } + shared_let(:work_package) { create(:work_package) } - let!(:work_package) { create(:work_package) } + let(:wp_page) { Pages::FullWorkPackage.new(work_package) } + let(:attachments) { Components::Attachments.new } + let(:attachments_list) { Components::AttachmentsList.new } + let(:image_fixture) { UploadedFile.load_from("spec/fixtures/files/test.js") } before do - login_with(admin.login, admin_password) + login_as admin end - def expire! - page.set_rack_session(updated_at: Time.now - 1.hour) - end - - describe "outdated TTL on Rails request" do - it "expires on the next Rails request" do - visit "/my/account" - expect(page).to have_css(".form--field-container", text: admin.login) + it "allows accessing text/javascript files as inlinable plain text" do + wp_page.visit_tab!(:files) + attachments_list.wait_until_visible - # Expire the session - expire! - - visit "/" - expect(page).to have_css(".action-login") - end - end + ## + # Attach file manually + attachments_list.expect_empty + attachments.attach_file_on_input(image_fixture.path) + attachments_list.expect_attached("test.js") - describe "outdated TTL on API request" do - it "expires on the next APIv3 request" do - page.driver.header("X-Requested-With", "XMLHttpRequest") - visit "/api/v3/work_packages/#{work_package.id}" + expect(work_package.attachments.count).to eq 1 + attachment = work_package.attachments.first - body = JSON.parse(page.body) - expect(body["id"]).to eq(work_package.id) + expect(attachment.content_type).to eq "text/x-javascript" + expect(attachment).to be_inlineable - # Expire the session - expire! - visit "/api/v3/work_packages/#{work_package.id}" + visit home_path - expect(page.body).to eq("unauthorized") - end + # Assume we have a HTML sanitation issue + expect do + accept_alert(wait: 1) do + page.execute_script <<-JS + const element = document.createElement('script') + element.id = "testscript" + element.src = '/api/v3/attachments/#{attachment.id}/content' + document.body.appendChild(element); + JS + end + end.to raise_error(Capybara::ModalNotFound) end end diff --git a/spec/fixtures/files/test.js b/spec/fixtures/files/test.js new file mode 100644 index 000000000000..3254c929467d --- /dev/null +++ b/spec/fixtures/files/test.js @@ -0,0 +1 @@ +alert("hello"); diff --git a/spec/requests/api/v3/attachments/attachment_resource_shared_examples.rb b/spec/requests/api/v3/attachments/attachment_resource_shared_examples.rb index 10d9a5293358..cc32297a87d6 100644 --- a/spec/requests/api/v3/attachments/attachment_resource_shared_examples.rb +++ b/spec/requests/api/v3/attachments/attachment_resource_shared_examples.rb @@ -219,6 +219,8 @@ def request! let(:missing_permissions_user) { user_with_permissions } + let(:expected_content_type) { "application/octet-stream" } + before do allow(User).to receive(:current).and_return current_user end @@ -452,7 +454,7 @@ def request! .to eql content_disposition expect(subject.headers["Content-Type"]) - .to eql mock_file.content_type + .to eql expected_content_type max_age = OpenProject::Configuration.fog_download_url_expires_in.to_i - 10 @@ -473,11 +475,20 @@ def request! context "for a local text file" do it_behaves_like "for a local file" do + let(:expected_content_type) { "text/plain" } let(:mock_file) { FileHelpers.mock_uploaded_file name: "foobar.txt" } let(:content_disposition) { "inline; filename=foobar.txt" } end end + context "for a local JS file" do + it_behaves_like "for a local file" do + let(:expected_content_type) { "text/plain" } + let(:mock_file) { FileHelpers.mock_uploaded_file name: "foobar.js", content_type: "text/x-javascript" } + let(:content_disposition) { "inline; filename=foobar.js" } + end + end + context "for a local binary file" do it_behaves_like "for a local file" do let(:mock_file) { FileHelpers.mock_uploaded_file name: "foobar.dat", content_type: "application/octet-stream" } From a8b8d9884e1f36811f035e15d25878ef1955b439 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= <mail@oliverguenther.de> Date: Wed, 22 May 2024 11:57:23 +0200 Subject: [PATCH 07/40] Fix eslint template parser to allow eslint to run --- frontend/package-lock.json | 1241 ++++++++++++++---------------------- frontend/package.json | 28 +- 2 files changed, 508 insertions(+), 761 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c0632b77b9c5..516da747fc12 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -107,14 +107,14 @@ }, "devDependencies": { "@angular-devkit/build-angular": "^17.3.4", - "@angular-eslint/builder": "^17.3.0", - "@angular-eslint/eslint-plugin": "^17.3.0", - "@angular-eslint/eslint-plugin-template": "^17.3.0", - "@angular-eslint/schematics": "17.3.0", - "@angular-eslint/template-parser": "^17.3.0", + "@angular-eslint/builder": "^17.4.1", + "@angular-eslint/eslint-plugin": "^17.4.1", + "@angular-eslint/eslint-plugin-template": "^17.4.1", + "@angular-eslint/schematics": "17.4.1", + "@angular-eslint/template-parser": "^17.4.1", "@angular/language-service": "17.3.4", - "@html-eslint/eslint-plugin": "^0.15.0", - "@html-eslint/parser": "^0.15.0", + "@html-eslint/eslint-plugin": "^0.24.1", + "@html-eslint/parser": "^0.24.1", "@jsdevtools/coverage-istanbul-loader": "3.0.5", "@types/codemirror": "5.60.5", "@types/dragula": "^3.7.0", @@ -130,18 +130,18 @@ "@types/urijs": "^1.19.6", "@types/uuid": "^8.3.4", "@types/webpack-env": "^1.16.0", - "@typescript-eslint/eslint-plugin": "^7.7.1", - "@typescript-eslint/parser": "^7.7.1", + "@typescript-eslint/eslint-plugin": "^7.10.0", + "@typescript-eslint/parser": "^7.10.0", "browserslist": "^4.23.0", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^18.0.0", - "eslint-plugin-change-detection-strategy": "^0.1.1", - "eslint-plugin-import": "^2.26.0", + "eslint-plugin-change-detection-strategy": "^0.1.4", + "eslint-plugin-import": "^2.29.1", "eslint-plugin-jasmine": "^4.1.3", - "eslint-plugin-jsx-a11y": "^6.6.1", - "eslint-plugin-react": "^7.31.11", - "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.2", "esprint": "^3.1.0", "jasmine-core": "~3.6.0", "jasmine-spec-reporter": "~5.0.0", @@ -653,13 +653,13 @@ } }, "node_modules/@angular-eslint/builder": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.4.0.tgz", - "integrity": "sha512-+3ujbi+ar/iqAAwnJ2bTdWzQpHh9iVEPgjHUOeQhrEM8gcaOLnZXMlUyZL7D+NlXg7aDoEIxETb73dgbIBm55A==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.4.1.tgz", + "integrity": "sha512-UVnErsAGXTi8OChkoSxDVVGV2jkFpTaXQT+0fgapSwaOt3Ki7BVwJJoNaX0Zs01c64bjNPZ5ONb/i6nC8QiP9Q==", "dev": true, "dependencies": { - "@nx/devkit": "^17.2.8 || ^18.0.0", - "nx": "^17.2.8 || ^18.0.0" + "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", + "nx": "^17.2.8 || ^18.0.0 || ^19.0.0" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", @@ -667,19 +667,19 @@ } }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.3.0.tgz", - "integrity": "sha512-ejfNzRuBeHUV8m2fkgs+M809rj5STuCuQo4fdfc6ccQpzXDI6Ha7BKpTznWfg5g529q/wrkoGSGgFxU9Yc2/dQ==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.4.1.tgz", + "integrity": "sha512-QKQGspxsyMHRwvzqo+Fj42TS/vmnwOHuWC6EN+5KBx3cuImahqFHQW842zVy9f65jfH2xDnNWJ+NW+Tzcgg+pQ==", "dev": true }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.4.0.tgz", - "integrity": "sha512-E+/O83PXttQUACurGEskLDU+wboBqMMVqvo4T8C/iMcpLx+01M5UBzqpCmfz6ri609G96Au7uDbUEedU1hwqmQ==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.4.1.tgz", + "integrity": "sha512-05bN1UB4H2CuX7Sw6fz+rMobsa+Bl3g15IYldH08hbJSnVemO8mf86bIjRN2Th79sO9WOiXXimnfIt7KRf8l0Q==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.4.0", - "@angular-eslint/utils": "17.4.0", + "@angular-eslint/bundled-angular-compiler": "17.4.1", + "@angular-eslint/utils": "17.4.1", "@typescript-eslint/utils": "7.8.0" }, "peerDependencies": { @@ -688,13 +688,13 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.4.0.tgz", - "integrity": "sha512-o1Vb7rt3TpPChVzaxswOKBDWRboMcpC4qUUyoHfeSYa7sDuQHMeIQlCS5QXuykR/RYnIQJSKd89FOd28nGmmRw==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.4.1.tgz", + "integrity": "sha512-oYP7yzOpn63g1Mpwc8F8ERiywaGRhAs27ttI9t+5NXaLrwHSfc/AJleC7jjkB5xu1p88JY1mb4oIYOjeZAhHIg==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.4.0", - "@angular-eslint/utils": "17.4.0", + "@angular-eslint/bundled-angular-compiler": "17.4.1", + "@angular-eslint/utils": "17.4.1", "@typescript-eslint/type-utils": "7.8.0", "@typescript-eslint/utils": "7.8.0", "aria-query": "5.3.0", @@ -705,107 +705,17 @@ "typescript": "*" } }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.4.0.tgz", - "integrity": "sha512-cYEJs4PO+QLDt1wfgWh9q8OjOphnoe1OTTFtMqm9lHl0AkBynPnFA6ghiiG5NaT03l7HXi2TQ23rLFlXl3JOBg==", - "dev": true - }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@angular-eslint/utils": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.4.0.tgz", - "integrity": "sha512-lHgRXyT878fauDITygraICDM6RHLb51QAJ3gWNZLr7SXcywsZg5d3rxRPCjrCnjgdxNPU0fJ+VJZ5AMt5Ibn7w==", - "dev": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.4.0", - "@typescript-eslint/utils": "7.8.0" - }, - "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", - "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "semver": "^7.6.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.4.0.tgz", - "integrity": "sha512-cYEJs4PO+QLDt1wfgWh9q8OjOphnoe1OTTFtMqm9lHl0AkBynPnFA6ghiiG5NaT03l7HXi2TQ23rLFlXl3JOBg==", - "dev": true - }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/@angular-eslint/utils": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.4.0.tgz", - "integrity": "sha512-lHgRXyT878fauDITygraICDM6RHLb51QAJ3gWNZLr7SXcywsZg5d3rxRPCjrCnjgdxNPU0fJ+VJZ5AMt5Ibn7w==", - "dev": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.4.0", - "@typescript-eslint/utils": "7.8.0" - }, - "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", - "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "semver": "^7.6.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, "node_modules/@angular-eslint/schematics": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.3.0.tgz", - "integrity": "sha512-5yssd5EOomxlKt9vN/OXXCTCuI3Pmfj16pkjBDoW0wzC8/M2l5zlXIEfoKumHYv2wtF553LhaMXVYVU35e0lTw==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.4.1.tgz", + "integrity": "sha512-CYpsGc0B/ZGO/RKYlyfeAi1pOvFmVs4pvoHU13uOdhdFJ6nAUTujHiBaULloIrUmuIhGW9S0g6w4ecD6ZP680w==", "dev": true, "dependencies": { - "@angular-eslint/eslint-plugin": "17.3.0", - "@angular-eslint/eslint-plugin-template": "17.3.0", - "@nx/devkit": "^17.2.8 || ^18.0.0", + "@angular-eslint/eslint-plugin": "17.4.1", + "@angular-eslint/eslint-plugin-template": "17.4.1", + "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", "ignore": "5.3.1", - "nx": "^17.2.8 || ^18.0.0", + "nx": "^17.2.8 || ^18.0.0 || ^19.0.0", "strip-json-comments": "3.1.1", "tmp": "0.2.3" }, @@ -813,154 +723,13 @@ "@angular/cli": ">= 17.0.0 < 18.0.0" } }, - "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/eslint-plugin": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.3.0.tgz", - "integrity": "sha512-81cQbOEPoQupFX8WmpqZn+y8VA7JdVRGBtt+uJNKBXcJknTpPWdLBZRFlgVakmC24iEZ0Fint/N3NBBQI3mz2A==", - "dev": true, - "dependencies": { - "@angular-eslint/utils": "17.3.0", - "@typescript-eslint/utils": "7.2.0" - }, - "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/eslint-plugin-template": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.3.0.tgz", - "integrity": "sha512-9l/aRfpE9MCRVDWRb+rSB9Zei0paep1vqV6M/87VUnzBnzqeMRnVuPvQowilh2zweVSGKBF25Vp4HkwOL6ExDQ==", - "dev": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.3.0", - "@angular-eslint/utils": "17.3.0", - "@typescript-eslint/type-utils": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "aria-query": "5.3.0", - "axobject-query": "4.0.0" - }, - "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/schematics/node_modules/@typescript-eslint/type-utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", - "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@angular-eslint/schematics/node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular-eslint/schematics/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@angular-eslint/schematics/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular-eslint/schematics/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@angular-eslint/schematics/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@angular-eslint/template-parser": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.4.0.tgz", - "integrity": "sha512-vT/Tg8dl6Uy++MS9lPS0l37SynH3EaMcggDiTJqn15pIb4ePO65fafOIIKKYG+BN6R6iFe/g9mH/9nb8ohlzdQ==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.4.1.tgz", + "integrity": "sha512-fJQpwQXexgs7Z3yYpQAfuAkFB2Y5H8SSlo+eAPPafOOPpPSIm/yP4dQ2e06tE8zWB5yjYnVBMJnUKSmG5GJSDw==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.4.0", + "@angular-eslint/bundled-angular-compiler": "17.4.1", "eslint-scope": "^8.0.0" }, "peerDependencies": { @@ -968,20 +737,14 @@ "typescript": "*" } }, - "node_modules/@angular-eslint/template-parser/node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.4.0.tgz", - "integrity": "sha512-cYEJs4PO+QLDt1wfgWh9q8OjOphnoe1OTTFtMqm9lHl0AkBynPnFA6ghiiG5NaT03l7HXi2TQ23rLFlXl3JOBg==", - "dev": true - }, "node_modules/@angular-eslint/utils": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.3.0.tgz", - "integrity": "sha512-PJT9pxWqpvI9OXO+7L5SIVhvMW+RFjeafC7PYjtvSbNFpz+kF644BiAcfMJ0YqBnkrw3JXt+RAX25CT4mXIoXw==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.4.1.tgz", + "integrity": "sha512-ptpWSrN7hfLtbStOB5vlwjh088WRu+sT1XIXCROrX5uXR5sQMu5ZitnoObSe+Of+1lugguPvMvFm/pzTMp3LIg==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.3.0", - "@typescript-eslint/utils": "7.2.0" + "@angular-eslint/bundled-angular-compiler": "17.4.1", + "@typescript-eslint/utils": "7.8.0" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", @@ -3714,21 +3477,21 @@ } }, "node_modules/@html-eslint/eslint-plugin": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.15.0.tgz", - "integrity": "sha512-6DUb2ZN1PUlzlNzNj4aBhoObBp3Kl/+YbZ6CnkgFAsQSW0tSFAu7p8WwESkz9RZLZZN9gCUlcaYKJnQjTkmnDA==", + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.24.1.tgz", + "integrity": "sha512-JwNDQBrNIWEPcxgSpla/2jaUXyQCqL7Xp8CmON4Bk5qg8MwiDLXOgjylfVC+tN52i8JeHWMca34I9DqBGRj9Qg==", "dev": true, "engines": { - "node": ">=8.10.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@html-eslint/parser": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.15.0.tgz", - "integrity": "sha512-fA+HQtWnODhOIK6j1p4XWqltINx7hM0WNNTM2RvlH/2glzeRDCcYq3vEmeQhnytvGocidu4ofTzNk80cLnnyiw==", + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.24.1.tgz", + "integrity": "sha512-O13xX/+Ldh0P7VZMpDDYc3XtWiE1cYm5QhVJ0VB5i7D8Q69HrrGN+5BjS17vkCoLTz+3zWWIiJv4oFmyS5LReA==", "dev": true, "dependencies": { - "es-html-parser": "^0.0.8" + "es-html-parser": "^0.0.9" }, "engines": { "node": ">=8.10.0" @@ -5851,21 +5614,19 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz", - "integrity": "sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.10.0.tgz", + "integrity": "sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/type-utils": "7.8.0", - "@typescript-eslint/utils": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", - "debug": "^4.3.4", + "@typescript-eslint/scope-manager": "7.10.0", + "@typescript-eslint/type-utils": "7.10.0", + "@typescript-eslint/utils": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, "engines": { @@ -5885,19 +5646,14 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", - "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz", + "integrity": "sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "semver": "^7.6.0" + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -5905,22 +5661,18 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.10.0.tgz", + "integrity": "sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", - "debug": "^4.3.4" + "@typescript-eslint/typescript-estree": "7.10.0", + "@typescript-eslint/utils": "7.10.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -5938,15 +5690,11 @@ } } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", - "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", + "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0" - }, "engines": { "node": "^18.18.0 || >=20.0.0" }, @@ -5955,15 +5703,19 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", - "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", + "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.8.0", - "@typescript-eslint/utils": "7.8.0", + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, "engines": { @@ -5973,28 +5725,22 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "^8.56.0" - }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", - "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "semver": "^7.6.0" + "@typescript-eslint/scope-manager": "7.10.0", + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/typescript-estree": "7.10.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -6007,11 +5753,15 @@ "eslint": "^8.56.0" } }, - "node_modules/@typescript-eslint/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", - "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", + "integrity": "sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==", "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.10.0", + "eslint-visitor-keys": "^3.4.3" + }, "engines": { "node": "^18.18.0 || >=20.0.0" }, @@ -6020,14 +5770,96 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", - "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.10.0.tgz", + "integrity": "sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.10.0", + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/typescript-estree": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz", + "integrity": "sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", + "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", + "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -6048,7 +5880,24 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", + "integrity": "sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.10.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", @@ -6057,7 +5906,7 @@ "balanced-match": "^1.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "node_modules/@typescript-eslint/parser/node_modules/minimatch": { "version": "9.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", @@ -6072,78 +5921,80 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", - "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", + "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "semver": "^7.5.4" + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "node_modules/@typescript-eslint/type-utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", + "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/utils": "7.8.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "node_modules/@typescript-eslint/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", + "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", "dev": true, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", + "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -6155,24 +6006,7 @@ } } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", @@ -6181,10 +6015,10 @@ "balanced-match": "^1.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -6192,8 +6026,33 @@ "engines": { "node": ">=16 || 14 >=14.17" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", + "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "semver": "^7.6.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" } }, "node_modules/@typescript-eslint/visitor-keys": { @@ -9988,9 +9847,9 @@ } }, "node_modules/es-html-parser": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/es-html-parser/-/es-html-parser-0.0.8.tgz", - "integrity": "sha512-kjMH23xhvTBw/7Ve1Dtb/7yZdFajfvwOpdsgRHmnyt8yvTsDJnkFjUgEEaMZFW+e1OhN/eoZrvF9wehq+waTGg==", + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/es-html-parser/-/es-html-parser-0.0.9.tgz", + "integrity": "sha512-oniQMi+466VFsDzcdron9Ry/sqUJpDJg1bbDn0jFJKDdxXhwIOYDr4DgBnO5/yPLGj2xv+n5yy4L1Q0vAC5TYQ==", "dev": true }, "node_modules/es-iterator-helpers": { @@ -22637,241 +22496,79 @@ } }, "@angular-eslint/builder": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.4.0.tgz", - "integrity": "sha512-+3ujbi+ar/iqAAwnJ2bTdWzQpHh9iVEPgjHUOeQhrEM8gcaOLnZXMlUyZL7D+NlXg7aDoEIxETb73dgbIBm55A==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.4.1.tgz", + "integrity": "sha512-UVnErsAGXTi8OChkoSxDVVGV2jkFpTaXQT+0fgapSwaOt3Ki7BVwJJoNaX0Zs01c64bjNPZ5ONb/i6nC8QiP9Q==", "dev": true, "requires": { - "@nx/devkit": "^17.2.8 || ^18.0.0", - "nx": "^17.2.8 || ^18.0.0" + "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", + "nx": "^17.2.8 || ^18.0.0 || ^19.0.0" } }, "@angular-eslint/bundled-angular-compiler": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.3.0.tgz", - "integrity": "sha512-ejfNzRuBeHUV8m2fkgs+M809rj5STuCuQo4fdfc6ccQpzXDI6Ha7BKpTznWfg5g529q/wrkoGSGgFxU9Yc2/dQ==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.4.1.tgz", + "integrity": "sha512-QKQGspxsyMHRwvzqo+Fj42TS/vmnwOHuWC6EN+5KBx3cuImahqFHQW842zVy9f65jfH2xDnNWJ+NW+Tzcgg+pQ==", "dev": true }, "@angular-eslint/eslint-plugin": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.4.0.tgz", - "integrity": "sha512-E+/O83PXttQUACurGEskLDU+wboBqMMVqvo4T8C/iMcpLx+01M5UBzqpCmfz6ri609G96Au7uDbUEedU1hwqmQ==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.4.1.tgz", + "integrity": "sha512-05bN1UB4H2CuX7Sw6fz+rMobsa+Bl3g15IYldH08hbJSnVemO8mf86bIjRN2Th79sO9WOiXXimnfIt7KRf8l0Q==", "dev": true, "requires": { - "@angular-eslint/bundled-angular-compiler": "17.4.0", - "@angular-eslint/utils": "17.4.0", + "@angular-eslint/bundled-angular-compiler": "17.4.1", + "@angular-eslint/utils": "17.4.1", "@typescript-eslint/utils": "7.8.0" - }, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.4.0.tgz", - "integrity": "sha512-cYEJs4PO+QLDt1wfgWh9q8OjOphnoe1OTTFtMqm9lHl0AkBynPnFA6ghiiG5NaT03l7HXi2TQ23rLFlXl3JOBg==", - "dev": true - }, - "@angular-eslint/utils": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.4.0.tgz", - "integrity": "sha512-lHgRXyT878fauDITygraICDM6RHLb51QAJ3gWNZLr7SXcywsZg5d3rxRPCjrCnjgdxNPU0fJ+VJZ5AMt5Ibn7w==", - "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "17.4.0", - "@typescript-eslint/utils": "7.8.0" - } - }, - "@typescript-eslint/utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", - "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "semver": "^7.6.0" - } - } } }, "@angular-eslint/eslint-plugin-template": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.4.0.tgz", - "integrity": "sha512-o1Vb7rt3TpPChVzaxswOKBDWRboMcpC4qUUyoHfeSYa7sDuQHMeIQlCS5QXuykR/RYnIQJSKd89FOd28nGmmRw==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.4.1.tgz", + "integrity": "sha512-oYP7yzOpn63g1Mpwc8F8ERiywaGRhAs27ttI9t+5NXaLrwHSfc/AJleC7jjkB5xu1p88JY1mb4oIYOjeZAhHIg==", "dev": true, "requires": { - "@angular-eslint/bundled-angular-compiler": "17.4.0", - "@angular-eslint/utils": "17.4.0", + "@angular-eslint/bundled-angular-compiler": "17.4.1", + "@angular-eslint/utils": "17.4.1", "@typescript-eslint/type-utils": "7.8.0", "@typescript-eslint/utils": "7.8.0", "aria-query": "5.3.0", "axobject-query": "4.0.0" - }, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.4.0.tgz", - "integrity": "sha512-cYEJs4PO+QLDt1wfgWh9q8OjOphnoe1OTTFtMqm9lHl0AkBynPnFA6ghiiG5NaT03l7HXi2TQ23rLFlXl3JOBg==", - "dev": true - }, - "@angular-eslint/utils": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.4.0.tgz", - "integrity": "sha512-lHgRXyT878fauDITygraICDM6RHLb51QAJ3gWNZLr7SXcywsZg5d3rxRPCjrCnjgdxNPU0fJ+VJZ5AMt5Ibn7w==", - "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "17.4.0", - "@typescript-eslint/utils": "7.8.0" - } - }, - "@typescript-eslint/utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", - "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "semver": "^7.6.0" - } - } } }, "@angular-eslint/schematics": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.3.0.tgz", - "integrity": "sha512-5yssd5EOomxlKt9vN/OXXCTCuI3Pmfj16pkjBDoW0wzC8/M2l5zlXIEfoKumHYv2wtF553LhaMXVYVU35e0lTw==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.4.1.tgz", + "integrity": "sha512-CYpsGc0B/ZGO/RKYlyfeAi1pOvFmVs4pvoHU13uOdhdFJ6nAUTujHiBaULloIrUmuIhGW9S0g6w4ecD6ZP680w==", "dev": true, "requires": { - "@angular-eslint/eslint-plugin": "17.3.0", - "@angular-eslint/eslint-plugin-template": "17.3.0", - "@nx/devkit": "^17.2.8 || ^18.0.0", + "@angular-eslint/eslint-plugin": "17.4.1", + "@angular-eslint/eslint-plugin-template": "17.4.1", + "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", "ignore": "5.3.1", - "nx": "^17.2.8 || ^18.0.0", + "nx": "^17.2.8 || ^18.0.0 || ^19.0.0", "strip-json-comments": "3.1.1", "tmp": "0.2.3" - }, - "dependencies": { - "@angular-eslint/eslint-plugin": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.3.0.tgz", - "integrity": "sha512-81cQbOEPoQupFX8WmpqZn+y8VA7JdVRGBtt+uJNKBXcJknTpPWdLBZRFlgVakmC24iEZ0Fint/N3NBBQI3mz2A==", - "dev": true, - "requires": { - "@angular-eslint/utils": "17.3.0", - "@typescript-eslint/utils": "7.2.0" - } - }, - "@angular-eslint/eslint-plugin-template": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.3.0.tgz", - "integrity": "sha512-9l/aRfpE9MCRVDWRb+rSB9Zei0paep1vqV6M/87VUnzBnzqeMRnVuPvQowilh2zweVSGKBF25Vp4HkwOL6ExDQ==", - "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "17.3.0", - "@angular-eslint/utils": "17.3.0", - "@typescript-eslint/type-utils": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "aria-query": "5.3.0", - "axobject-query": "4.0.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", - "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } } }, "@angular-eslint/template-parser": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.4.0.tgz", - "integrity": "sha512-vT/Tg8dl6Uy++MS9lPS0l37SynH3EaMcggDiTJqn15pIb4ePO65fafOIIKKYG+BN6R6iFe/g9mH/9nb8ohlzdQ==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.4.1.tgz", + "integrity": "sha512-fJQpwQXexgs7Z3yYpQAfuAkFB2Y5H8SSlo+eAPPafOOPpPSIm/yP4dQ2e06tE8zWB5yjYnVBMJnUKSmG5GJSDw==", "dev": true, "requires": { - "@angular-eslint/bundled-angular-compiler": "17.4.0", + "@angular-eslint/bundled-angular-compiler": "17.4.1", "eslint-scope": "^8.0.0" - }, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": { - "version": "17.4.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.4.0.tgz", - "integrity": "sha512-cYEJs4PO+QLDt1wfgWh9q8OjOphnoe1OTTFtMqm9lHl0AkBynPnFA6ghiiG5NaT03l7HXi2TQ23rLFlXl3JOBg==", - "dev": true - } } }, "@angular-eslint/utils": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.3.0.tgz", - "integrity": "sha512-PJT9pxWqpvI9OXO+7L5SIVhvMW+RFjeafC7PYjtvSbNFpz+kF644BiAcfMJ0YqBnkrw3JXt+RAX25CT4mXIoXw==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.4.1.tgz", + "integrity": "sha512-ptpWSrN7hfLtbStOB5vlwjh088WRu+sT1XIXCROrX5uXR5sQMu5ZitnoObSe+Of+1lugguPvMvFm/pzTMp3LIg==", "dev": true, "requires": { - "@angular-eslint/bundled-angular-compiler": "17.3.0", - "@typescript-eslint/utils": "7.2.0" + "@angular-eslint/bundled-angular-compiler": "17.4.1", + "@typescript-eslint/utils": "7.8.0" } }, "@angular/animations": { @@ -24666,18 +24363,18 @@ } }, "@html-eslint/eslint-plugin": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.15.0.tgz", - "integrity": "sha512-6DUb2ZN1PUlzlNzNj4aBhoObBp3Kl/+YbZ6CnkgFAsQSW0tSFAu7p8WwESkz9RZLZZN9gCUlcaYKJnQjTkmnDA==", + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.24.1.tgz", + "integrity": "sha512-JwNDQBrNIWEPcxgSpla/2jaUXyQCqL7Xp8CmON4Bk5qg8MwiDLXOgjylfVC+tN52i8JeHWMca34I9DqBGRj9Qg==", "dev": true }, "@html-eslint/parser": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.15.0.tgz", - "integrity": "sha512-fA+HQtWnODhOIK6j1p4XWqltINx7hM0WNNTM2RvlH/2glzeRDCcYq3vEmeQhnytvGocidu4ofTzNk80cLnnyiw==", + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.24.1.tgz", + "integrity": "sha512-O13xX/+Ldh0P7VZMpDDYc3XtWiE1cYm5QhVJ0VB5i7D8Q69HrrGN+5BjS17vkCoLTz+3zWWIiJv4oFmyS5LReA==", "dev": true, "requires": { - "es-html-parser": "^0.0.8" + "es-html-parser": "^0.0.9" } }, "@humanwhocodes/config-array": { @@ -26273,52 +25970,181 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz", - "integrity": "sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.10.0.tgz", + "integrity": "sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/type-utils": "7.8.0", - "@typescript-eslint/utils": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", - "debug": "^4.3.4", + "@typescript-eslint/scope-manager": "7.10.0", + "@typescript-eslint/type-utils": "7.10.0", + "@typescript-eslint/utils": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz", + "integrity": "sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.10.0.tgz", + "integrity": "sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "7.10.0", + "@typescript-eslint/utils": "7.10.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + } + }, + "@typescript-eslint/types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", + "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", + "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + } + }, "@typescript-eslint/utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", - "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "semver": "^7.6.0" + "@typescript-eslint/scope-manager": "7.10.0", + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/typescript-estree": "7.10.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", + "integrity": "sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.10.0", + "eslint-visitor-keys": "^3.4.3" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" } } } }, "@typescript-eslint/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.10.0.tgz", + "integrity": "sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", + "@typescript-eslint/scope-manager": "7.10.0", + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/typescript-estree": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", "debug": "^4.3.4" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz", + "integrity": "sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0" + } + }, + "@typescript-eslint/types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", + "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", + "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", + "integrity": "sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.10.0", + "eslint-visitor-keys": "^3.4.3" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } } }, "@typescript-eslint/scope-manager": { @@ -26341,23 +26167,6 @@ "@typescript-eslint/utils": "7.8.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" - }, - "dependencies": { - "@typescript-eslint/utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", - "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "semver": "^7.6.0" - } - } } }, "@typescript-eslint/types": { @@ -26403,80 +26212,18 @@ } }, "@typescript-eslint/utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", - "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", + "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "semver": "^7.5.4" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" - } - }, - "@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "semver": "^7.6.0" } }, "@typescript-eslint/visitor-keys": { @@ -29327,9 +29074,9 @@ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" }, "es-html-parser": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/es-html-parser/-/es-html-parser-0.0.8.tgz", - "integrity": "sha512-kjMH23xhvTBw/7Ve1Dtb/7yZdFajfvwOpdsgRHmnyt8yvTsDJnkFjUgEEaMZFW+e1OhN/eoZrvF9wehq+waTGg==", + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/es-html-parser/-/es-html-parser-0.0.9.tgz", + "integrity": "sha512-oniQMi+466VFsDzcdron9Ry/sqUJpDJg1bbDn0jFJKDdxXhwIOYDr4DgBnO5/yPLGj2xv+n5yy4L1Q0vAC5TYQ==", "dev": true }, "es-iterator-helpers": { diff --git a/frontend/package.json b/frontend/package.json index 499e129017e5..c517148e4b6b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -6,14 +6,14 @@ "private": true, "devDependencies": { "@angular-devkit/build-angular": "^17.3.4", - "@angular-eslint/builder": "^17.3.0", - "@angular-eslint/eslint-plugin": "^17.3.0", - "@angular-eslint/eslint-plugin-template": "^17.3.0", - "@angular-eslint/schematics": "17.3.0", - "@angular-eslint/template-parser": "^17.3.0", + "@angular-eslint/builder": "^17.4.1", + "@angular-eslint/eslint-plugin": "^17.4.1", + "@angular-eslint/eslint-plugin-template": "^17.4.1", + "@angular-eslint/schematics": "17.4.1", + "@angular-eslint/template-parser": "^17.4.1", "@angular/language-service": "17.3.4", - "@html-eslint/eslint-plugin": "^0.15.0", - "@html-eslint/parser": "^0.15.0", + "@html-eslint/eslint-plugin": "^0.24.1", + "@html-eslint/parser": "^0.24.1", "@jsdevtools/coverage-istanbul-loader": "3.0.5", "@types/codemirror": "5.60.5", "@types/dragula": "^3.7.0", @@ -29,18 +29,18 @@ "@types/urijs": "^1.19.6", "@types/uuid": "^8.3.4", "@types/webpack-env": "^1.16.0", - "@typescript-eslint/eslint-plugin": "^7.7.1", - "@typescript-eslint/parser": "^7.7.1", + "@typescript-eslint/eslint-plugin": "^7.10.0", + "@typescript-eslint/parser": "^7.10.0", "browserslist": "^4.23.0", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^18.0.0", - "eslint-plugin-change-detection-strategy": "^0.1.1", - "eslint-plugin-import": "^2.26.0", + "eslint-plugin-change-detection-strategy": "^0.1.4", + "eslint-plugin-import": "^2.29.1", "eslint-plugin-jasmine": "^4.1.3", - "eslint-plugin-jsx-a11y": "^6.6.1", - "eslint-plugin-react": "^7.31.11", - "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.2", "esprint": "^3.1.0", "jasmine-core": "~3.6.0", "jasmine-spec-reporter": "~5.0.0", From d3929b572bc322c67814b0277bcdd3de3d0a38cb Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI <operations+ci@openproject.com> Date: Thu, 23 May 2024 03:08:11 +0000 Subject: [PATCH 08/40] update locales from crowdin [ci skip] --- config/locales/crowdin/fr.seeders.yml | 22 ++--- config/locales/crowdin/fr.yml | 62 ++++++------- config/locales/crowdin/js-fr.yml | 28 +++--- config/locales/crowdin/js-no.yml | 28 +++--- config/locales/crowdin/js-ru.yml | 26 +++--- config/locales/crowdin/ms.yml | 2 +- config/locales/crowdin/no.seeders.yml | 22 ++--- config/locales/crowdin/no.yml | 50 +++++----- config/locales/crowdin/ru.yml | 92 +++++++++---------- config/locales/crowdin/zh-CN.seeders.yml | 22 ++--- .../backlogs/config/locales/crowdin/no.yml | 40 ++++---- .../bim/config/locales/crowdin/ms.seeders.yml | 4 +- .../bim/config/locales/crowdin/no.seeders.yml | 4 +- .../config/locales/crowdin/no.yml | 18 ++-- .../config/locales/crowdin/ru.yml | 2 +- .../grids/config/locales/crowdin/js-fr.yml | 4 +- .../grids/config/locales/crowdin/js-no.yml | 4 +- .../grids/config/locales/crowdin/js-ru.yml | 2 +- .../config/locales/crowdin/fr.seeders.yml | 8 +- modules/meeting/config/locales/crowdin/fr.yml | 12 +-- .../config/locales/crowdin/no.seeders.yml | 8 +- modules/meeting/config/locales/crowdin/no.yml | 10 +- .../config/locales/crowdin/ru.seeders.yml | 8 +- modules/meeting/config/locales/crowdin/ru.yml | 2 +- .../config/locales/crowdin/zh-CN.seeders.yml | 8 +- .../config/locales/crowdin/fr.yml | 2 +- .../config/locales/crowdin/no.yml | 2 +- .../storages/config/locales/crowdin/fr.yml | 24 ++--- .../storages/config/locales/crowdin/no.yml | 52 +++++------ .../storages/config/locales/crowdin/zh-CN.yml | 16 ++-- 30 files changed, 292 insertions(+), 292 deletions(-) diff --git a/config/locales/crowdin/fr.seeders.yml b/config/locales/crowdin/fr.seeders.yml index f686a1d96010..6a19f281e1e1 100644 --- a/config/locales/crowdin/fr.seeders.yml +++ b/config/locales/crowdin/fr.seeders.yml @@ -252,20 +252,20 @@ fr: item_4: subject: Fin du projet wiki: | - _In this wiki you can collaboratively create and edit pages and sub-pages to create a project wiki._ + _Dans ce wiki, vous pouvez créer et modifier des pages et des sous-pages de manière collaborative afin de créer un wiki de projet._ - **You can:** + **Vous pouvez :** - * Insert text and images, also with copy and paste from other documents - * Create a page hierarchy with parent pages - * Include wiki pages to the project menu - * Use macros to include, e.g. table of contents, work package lists, or Gantt charts - * Include wiki pages in other text fields, e.g. project overview page - * Include links to other documents - * View the change history - * View as Markdown + * Insérer du texte et des images, y compris par copier-coller à partir d'autres documents + * Créer une hiérarchie de pages avec des pages parentes + * Inclure des pages wiki dans le menu du projet + * Utilisez des macros pour inclure des éléments, tels qu'une table des matières, des listes de lots de travaux ou des diagrammes de Gantt + * Inclure des pages wiki dans d'autres champs de texte, tels que la page de présentation d'un projet + * Inclure des liens vers d'autres documents + * Afficher l'historique des modifications + * Afficher en tant que Markdown - More information: [https://www.openproject.org/docs/user-guide/wiki/](https://www.openproject.org/docs/user-guide/wiki/) + Plus d'informations : [https://www.openproject.org/docs/user-guide/wiki/](https://www.openproject.org/docs/user-guide/wiki/) scrum-project: name: Projet Scrum status_explanation: Toutes les tâches sont en cours. Les personnes concernées connaissent leurs tâches. Le système est entièrement configuré. diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index 421a5ace61d0..a777f8ac4cfa 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -264,7 +264,7 @@ fr: lists: active: "Projets actifs" my: "Mes projets" - favored: "Favorite projects" + favored: "Projets favoris" archived: "Projets archivés" my_private: "Mes listes de projets privés" new: @@ -306,13 +306,13 @@ fr: no_results_title_text: Il n'y a pas d'espace disque supplémentaire utilisé par ce projet. lists: create: - success: "The modified list has been saved as a new list" - failure: "The modified list cannot be saved: %{errors}" + success: "La liste modifiée a été enregistrée en tant que nouvelle liste" + failure: "La liste modifiée ne peut pas être enregistrée : %{errors}" update: - success: "The modified list has been saved" - failure: "The modified list cannot be saved: %{errors}" - can_be_saved: "List modified:" - can_be_saved_as: "The modifications can only be saved in a new list:" + success: "La liste modifiée a été enregistrée" + failure: "La liste modifiée ne peut pas être enregistrée : %{errors}" + can_be_saved: "Liste modifiée :" + can_be_saved_as: "Les modifications ne peuvent être enregistrées que dans une nouvelle liste :" members: index: no_results_title_text: Aucun membre dans ce projet pour le moment. @@ -330,7 +330,7 @@ fr: project_roles: "Rôle du projet" wp_shares: "Partages du lot des travaux" groups: "Groupes" - no_modify_on_shared: "You currently cannot modify or remove shared memberships through the member page. Use the sharing modal instead." + no_modify_on_shared: "Actuellement, vous ne pouvez pas modifier ou supprimer les adhésions partagées depuis la page des membres. Utilisez plutôt la fenêtre modale de partage." delete_member_dialog: title: "Supprimer le membre" will_remove_the_users_role: "Cela supprimera le rôle de l'utilisateur dans ce projet." @@ -494,9 +494,9 @@ fr: unsupported_for_multiple_projects: "Déplacer/copier en masse n'est pas supporté pour des lots de travaux provenant de plusieurs projets" sharing: missing_workflow_warning: - title: "Workflow missing for work package sharing" - message: "No workflow is configured for the 'Work package editor' role. Without a workflow, the shared with user cannot alter the status of the work package. Workflows can be copied. Select a source type (e.g. 'Task') and source role (e.g. 'Member'). Then select the target types. To start with, you could select all the types as targets. Finally, select the 'Work package editor' role as the target and press 'Copy'. After having thus created the defaults, fine tune the workflows as you do for every other role." - link_message: "Configure the workflows in the administration." + title: "Flux de travail manquant pour le partage de lots de travaux" + message: "Aucun flux de travail n'est configuré pour le rôle 'Éditeur de lots de travaux'. Sans flux de travail, le partage avec l'utilisateur ne permet pas de modifier l'état du lot de travaux. Les flux de travail peuvent être copiés. Sélectionnez un type de source (par exemple 'Tâche') et un rôle de source (par exemple 'Membre'). Sélectionnez ensuite les types cibles. Pour commencer, vous pouvez sélectionner tous les types comme cibles. Enfin, sélectionnez le rôle 'Éditeur de lot de travaux' comme cible et cliquez sur 'Copier'. Après avoir ainsi créé les valeurs par défaut, affinez les flux de travail comme vous le faites pour tous les autres rôles." + link_message: "Configurez les flux de travail dans l'administration." summary: reports: category: @@ -791,7 +791,7 @@ fr: not_an_iso_date: "n’est pas une date valide. Format requis : AAAA-MM-JJ." not_same_project: "n'appartient pas au même projet." odd: "doit être impair." - regex_match_failed: "does not match the regular expression %{expression}." + regex_match_failed: "ne correspond pas à l'expression régulière %{expression}." regex_invalid: "n’a pas pu être validé avec l’expression régulière associée." smaller_than_or_equal_to_max_length: "doit être inférieur ou égal à la longueur maximale." taken: "a déjà été pris." @@ -1003,13 +1003,13 @@ fr: only_same_project_categories_allowed: "La catégorie du lot de travaux doit faire partie du même projet que le lot de travaux." does_not_exist: "La catégorie spécifiée n'existe pas." estimated_hours: - cant_be_inferior_to_remaining_work: "Cannot be lower than Remaining work." - must_be_set_when_remaining_work_is_set: "Required when Remaining work is set." - only_values_greater_or_equal_zeroes_allowed: "Must be >= 0." + cant_be_inferior_to_remaining_work: "Ne peut être inférieur au Travail restant." + must_be_set_when_remaining_work_is_set: "Requis lorsque le Travail restant est défini." + only_values_greater_or_equal_zeroes_allowed: "Doit être >= 0." format: "%{message}" remaining_hours: - cant_exceed_work: "Cannot be higher than Work." - must_be_set_when_work_is_set: "Required when Work is set." + cant_exceed_work: "Ne peut être supérieur au Travail." + must_be_set_when_work_is_set: "Requis lorsque le Travail est défini." format: "%{message}" readonly_status: "Le lot de travaux est en lecture seule, ses attributs ne peuvent donc pas être changés." type: @@ -1273,7 +1273,7 @@ fr: button_edit: "Éditer" button_edit_associated_wikipage: "Éditer la page wiki associée : %{page_title}" button_expand_all: "Tout déplier" - button_favorite: "Add to favorites" + button_favorite: "Ajouter aux favoris" button_filter: "Filtrer" button_generate: "Générer" button_list: "Liste" @@ -1301,7 +1301,7 @@ fr: button_unarchive: "Désarchiver" button_uncheck_all: "Tout désélectionner" button_unlock: "Déverrouiller" - button_unfavorite: "Remove from favorites" + button_unfavorite: "Supprimer des favoris" button_unwatch: "Ne plus suivre" button_update: "Mettre à jour" button_upgrade: "Mise à niveau" @@ -1666,11 +1666,11 @@ fr: file_links_journal: > À partir de maintenant, l'activité liée aux liens de fichiers (fichiers stockés sur des supports externes) apparaîtra ici dans l'onglet Activité. Les activités suivantes concernent des liens déjà existants : progress_calculation_adjusted_from_disabled_mode: >- - Progress calculation automatically <a href="%{href}" target="_blank">set to work-based mode and adjusted with version update</a>. + Le calcul de la progression est automatiquement <a href="%{href}" target="_blank">défini en mode travail et ajusté avec la mise à jour de la version</a>. progress_calculation_adjusted: >- - Progress calculation automatically <a href="%{href}" target="_blank">adjusted with version update</a>. + Le calcul de la progression est automatiquement <a href="%{href}" target="_blank">ajusté avec la mise à jour de la version</a>. totals_removed_from_childless_work_packages: >- - Work and progress totals automatically removed for non-parent work packages with <a href="%{href}" target="_blank">version update</a>. This is a maintenance task and can be safely ignored. + Les totaux de travail et de progression sont automatiquement supprimés pour les lots de travaux non parents avec <a href="%{href}" target="_blank">la mise à jour de la version</a>. Il s'agit d'une tâche de maintenance qui peut être ignorée. links: configuration_guide: "Guide de configuration" get_in_touch: "Vous avez des questions ? Contactez-nous." @@ -2002,7 +2002,7 @@ fr: label_learn_more: "En savoir plus" label_less_or_equal: "<=" label_less_than_ago: "il y a moins de quelques jours" - label_link_url: "Link (URL)" + label_link_url: "Lien (URL)" label_list: "Liste" label_loading: "Chargement…" label_lock_user: "Verrouiller l’utilisateur" @@ -2130,7 +2130,7 @@ fr: label_percent_complete: "% réalisé" label_project_activity: "Activité du projet" label_project_attribute_plural: "Attributs du projet" - label_project_attribute_manage_link: "Manage project attributes" + label_project_attribute_manage_link: "Gérer les attributs de projet" label_project_count: "Nombre total de projets" label_project_copy_notifications: "Notifier par courriel lors de la copie du projet" label_project_latest: "Derniers projets" @@ -2145,7 +2145,7 @@ fr: label_project_attributes_settings: "Paramètres des attributs du projet" label_project_storage_plural: "Espaces de stockage des fichiers" label_project_storage_project_folder: "Espaces de stockage des fichiers : dossiers du projet" - label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space" + label_projects_disk_usage_information: "%{count} projets utilisant %{used_disk_space} d'espace disque" label_project_view_all: "Afficher tous les projets" label_project_show_details: "Afficher les détails du projet" label_project_hide_details: "Masquer les détails du projet" @@ -2747,7 +2747,7 @@ fr: member_of_group: "Groupe du Destinataire" name_or_identifier: "Nom ou identifiant" only_subproject_id: "Seulement le sous-projet" - shared_with_user: "Shared with users" + shared_with_user: "Partagés avec des utilisateurs" shared_with_me: "Partagés avec moi" subproject_id: "Inclure le sous-projet" repositories: @@ -2892,7 +2892,7 @@ fr: 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" - setting_show_work_package_attachments: "Show attachments in the files tab by default" + setting_show_work_package_attachments: "Afficher les pièces jointes dans l'onglet des fichiers par défaut" setting_antivirus_scan_mode: "Mode analyse" setting_antivirus_scan_action: "Action sur le fichier infecté" setting_autofetch_changesets: "Rapatrier automatiquement les changements du dépôt" @@ -2995,7 +2995,7 @@ fr: whitelist_text_html: > Définissez une liste d'extensions de fichiers et/ou de types MIME valides pour les fichiers téléversés. <br/> Entrez les extensions de fichier (par exemple, <code>%{ext_example}</code>) ou les types mime (par exemple, <code>%{mime_example}</code>). <br/> Laissez vide pour permettre le téléversement de tout type de fichier. Plusieurs valeurs autorisées (une ligne pour chaque valeur). show_work_package_attachments: > - Deactivating this option will hide the attachments list on the work packages files tab for new projects. The files attached in the description of a work package will still be uploaded in the internal attachments storage. + Si vous désactivez cette option, la liste des pièces jointes dans l'onglet des fichiers des lots de travaux sera masquée pour les nouveaux projets. Les fichiers joints dans la description d'un lot de travaux seront toujours téléchargés dans l'espace de stockage interne des pièces jointes. antivirus: title: "Analyse de virus" clamav_ping_failed: "Échec de la connexion au démon ClamAV. Vérifiez à nouveau la configuration puis réessayez." @@ -3234,8 +3234,8 @@ fr: drag_area_label: "Gérer et réorganiser les colonnes" sort_by: automatic: - heading: "Automatic" - description: "Order the %{plural} by one or more sorting criteria. You will lose the previous sorting." + heading: "Automatique" + description: "Classez les %{pluriel} selon un ou plusieurs critères de tri. Vous perdrez le tri précédent." top_menu: additional_resources: "Ressources supplémentaires" getting_started: "Pour commencer" @@ -3582,7 +3582,7 @@ fr: link: lien plugin_openproject_auth_plugins: name: "Plugins d'authentification OpenProject" - description: "Integration of OmniAuth strategy providers for authentication in OpenProject." + description: "Intégration des fournisseurs de stratégie OmniAuth pour l'authentification dans OpenProject." plugin_openproject_auth_saml: name: "OmniAuth SAML / authentification unique" description: "Ajoute le fournisseur SAML OmniAuth à OpenProject" diff --git a/config/locales/crowdin/js-fr.yml b/config/locales/crowdin/js-fr.yml index 54fa9ab763a7..6dfcfd6cfd11 100644 --- a/config/locales/crowdin/js-fr.yml +++ b/config/locales/crowdin/js-fr.yml @@ -331,17 +331,17 @@ fr: description: > Sélectionnez le niveau de zoom initial qui devrait être affiché lorsque le zoom automatique n'est pas disponible. export: - title: "Gantt chart PDF options" - button_export: "Export" + title: "Options du PDF de diagramme de Gantt" + button_export: "Exporter" column_widths: - narrow: "Narrow" - medium: "Medium" - wide: "Wide" - very_wide: "Very wide" + narrow: "Étroite" + medium: "Moyenne" + wide: "Large" + very_wide: "Très large" options: - date_zoom: "Date zoom" - paper_size: "Paper size" - column_widths: "Column widths" + date_zoom: "Échelle de date" + paper_size: "Format du papier" + column_widths: "Largeur de colonnes" general_text_no: "non" general_text_yes: "oui" general_text_No: "Non" @@ -363,7 +363,7 @@ fr: "14_1": standard: new_features_html: > - The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>PDF export of Gantt view, e.g. for printing (Enterprise add-on)</li> <li>Favorite projects</li> <li>Sections in Meetings</li> <li>Showing meetings on the My page and project overview pages</li> <li>Possibility to hide attachments in the Files tab</li> <li>Custom fields of the type Link (URL)</li> </ul> + Cette version contient différentes nouvelles fonctionnalités et améliorations : <br> <ul class="%{list_styling_class}"> <li>Exportation au format PDF de la vue Gantt, par exemple pour l'impression (add-on Enterprise)</li> <li>Projets favoris</li> <li>Sections dans les réunions</li> <li>Affichage des réunions sur Ma page et les pages de vue d'ensemble des projets</li> <li>Possibilité de masquer les pièces jointes dans l'onglet Fichiers</li> <li>Champs personnalisés de type Lien (URL)</li> </ul> ical_sharing_modal: title: "S'abonner au calendrier" inital_setup_error_message: "Une erreur est survenue lors de la récupération des données." @@ -431,7 +431,7 @@ fr: label_expand_project_menu: "Déplier le menu du projet" label_export: "Exporter" label_export_preparing: "L'export est en cours de préparation et sera téléchargé sous peu." - label_favorites: "Favorites" + label_favorites: "Favoris" label_filename: "Fichier" label_filesize: "Taille" label_general: "Général" @@ -1056,7 +1056,7 @@ fr: sharing: share: "Partager" title: "Partager le lot de travaux" - show_all_users: "Show all users with whom the work package has been shared with" + show_all_users: "Afficher tous les utilisateurs avec lesquels le lot de travaux a été partagé" selected_count: "%{count} sélectionné" selection: mixed: "Mixte" @@ -1283,8 +1283,8 @@ fr: group: "Le groupe fait maintenant partie du %{project}. Entre-temps, vous pouvez déjà planifier avec ce groupe et l'assigner des lots de travaux par exemple." next_button: "Continuer" favorite_projects: - no_results: "You have no favorite projects" - no_results_subtext: "Add one or multiple projects as favorite through their overview or in a project list." + no_results: "Vous n'avez pas de projet favori" + no_results_subtext: "Ajoutez un ou plusieurs projets en tant que favoris via leur vue d'ensemble ou dans une liste de projets." include_projects: toggle_title: "Inclure les projets" title: "Projets" diff --git a/config/locales/crowdin/js-no.yml b/config/locales/crowdin/js-no.yml index 334638ceb8ce..f72b658aafa1 100644 --- a/config/locales/crowdin/js-no.yml +++ b/config/locales/crowdin/js-no.yml @@ -331,17 +331,17 @@ description: > Velg standard zoom-nivå som skal vises når autozoom ikke er tilgjengelig. export: - title: "Gantt chart PDF options" - button_export: "Export" + title: "Gantt-diagram PDF alternativer" + button_export: "Eksportèr" column_widths: - narrow: "Narrow" + narrow: "Smal" medium: "Medium" - wide: "Wide" - very_wide: "Very wide" + wide: "Bred" + very_wide: "Veldig bred" options: - date_zoom: "Date zoom" - paper_size: "Paper size" - column_widths: "Column widths" + date_zoom: "Dato zoom" + paper_size: "Papirstørrelse" + column_widths: "Kolonnebredder" general_text_no: "nei" general_text_yes: "ja" general_text_No: "Nei" @@ -363,7 +363,7 @@ "14_1": standard: new_features_html: > - The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>PDF export of Gantt view, e.g. for printing (Enterprise add-on)</li> <li>Favorite projects</li> <li>Sections in Meetings</li> <li>Showing meetings on the My page and project overview pages</li> <li>Possibility to hide attachments in the Files tab</li> <li>Custom fields of the type Link (URL)</li> </ul> + Utgivelsen inneholder ulike nye funksjoner og forbedringer: <br> <ul class="%{list_styling_class}"> <li>PDF eksport av Gantt visning, f.eks for utskrift (Enterprise add-on)</li> <li>Favorittprosjekter</li> <li>Avsnitt i Møter</li> <li>Viser møter på Min side og i prosjektoversikten</li> <li>Mulighet for å skjule vedlegg i Filer-fanen</li> <li>Egendefinerte felter av typen lenke (URL)</li> </ul> ical_sharing_modal: title: "Abonner på kalender" inital_setup_error_message: "En feil oppstod under henting av data." @@ -431,7 +431,7 @@ label_expand_project_menu: "Utvid prosjektmeny" label_export: "Eksportèr" label_export_preparing: "Eksporten forberedes og lastes ned i løpet av kort tid." - label_favorites: "Favorites" + label_favorites: "Favoritter" label_filename: "Fil" label_filesize: "Størrelse" label_general: "Generell" @@ -656,7 +656,7 @@ no_selection: "Klikk på en melding for å se alle aktivitetsdetaljer." new_notifications: message: "Det finnes nye varsler." - link_text: "Click here to load them." + link_text: "Klikk her for å laste dem" menu: accountable: "Ansvarlig" by_project: "Ulest av prosjektet" @@ -1056,7 +1056,7 @@ sharing: share: "Del" title: "Del arbeidspakke" - show_all_users: "Show all users with whom the work package has been shared with" + show_all_users: "Vis alle brukere som arbeidspakken er delt med" selected_count: "%{count} valgte" selection: mixed: "Blandet" @@ -1283,8 +1283,8 @@ group: "Gruppen er nå en del av %{project}. Dette betyr at du allerede kan planlegge med den gruppen og tildele arbeidspakker for forekomst." next_button: "Fortsett" favorite_projects: - no_results: "You have no favorite projects" - no_results_subtext: "Add one or multiple projects as favorite through their overview or in a project list." + no_results: "Du har ingen favorittprosjekter" + no_results_subtext: "Legg til ett eller flere prosjekter som favoritt via oversikten eller i en prosjektliste." include_projects: toggle_title: "Inkluder prosjekter" title: "Prosjekter" diff --git a/config/locales/crowdin/js-ru.yml b/config/locales/crowdin/js-ru.yml index 1f85332d6bf7..923e4b91f478 100644 --- a/config/locales/crowdin/js-ru.yml +++ b/config/locales/crowdin/js-ru.yml @@ -330,17 +330,17 @@ ru: description: > Выберите начальный уровень масштаба, который должен быть показан, когда автозум недоступен. export: - title: "Gantt chart PDF options" - button_export: "Export" + title: "Параметры диаграммы Гантта в PDF" + button_export: "Экспорт" column_widths: - narrow: "Narrow" - medium: "Medium" - wide: "Wide" - very_wide: "Very wide" + narrow: "Узкий" + medium: "Средний" + wide: "Широкий" + very_wide: "Очень широкий" options: date_zoom: "Date zoom" - paper_size: "Paper size" - column_widths: "Column widths" + paper_size: "Размер бумаги" + column_widths: "Ширина столбца" general_text_no: "нет" general_text_yes: "Да" general_text_No: "Нет" @@ -430,7 +430,7 @@ ru: label_expand_project_menu: "Развернуть меню проекта" label_export: "Экспортировать" label_export_preparing: "Экспорт готовится и будет загружен в ближайшее время." - label_favorites: "Favorites" + label_favorites: "Избранное" label_filename: "Файл" label_filesize: "Размер" label_general: "Общее" @@ -495,7 +495,7 @@ ru: label_report: "Отчет" label_repository_plural: "Репозитории" label_save_as: "Сохранить как" - label_search_columns: "Search a column" + label_search_columns: "Поиск столбца" label_select_project: "Выберите проект" label_select_watcher: "Выберите наблюдателя..." label_selected_filter_list: "Выбранные фильтры" @@ -657,7 +657,7 @@ ru: no_selection: "Нажмите на уведомление, чтобы просмотреть все детали." new_notifications: message: "Есть новые уведомления." - link_text: "Click here to load them." + link_text: "Нажмите здесь, чтобы загрузить их." menu: accountable: "Подотчетный" by_project: "Непрочитано по проекту" @@ -940,7 +940,7 @@ ru: message_work_package_status_blocked: "Статус пакета работ недоступен для записи из-за закрытого статуса и назначенной закрытой версии." placeholder_filter_by_text: "Тема, описание, комментарии, ..." progress: - title: "Work estimates and progress" + title: "Оценки работы и прогресс" baseline: addition_label: "Добавлено для просмотра в период сравнения" removal_label: "Удалено из просмотра в период сравнения" @@ -1288,7 +1288,7 @@ ru: group: "Теперь группа является частью %{project}. Тем временем вы уже можете спланировать работу с этой группой и назначить пакеты работ." next_button: "Продолжить" favorite_projects: - no_results: "You have no favorite projects" + no_results: "У вас нет избранных проектов" no_results_subtext: "Add one or multiple projects as favorite through their overview or in a project list." include_projects: toggle_title: "Включить проекты" diff --git a/config/locales/crowdin/ms.yml b/config/locales/crowdin/ms.yml index 777db77b6ae9..e807c5e3e4d7 100644 --- a/config/locales/crowdin/ms.yml +++ b/config/locales/crowdin/ms.yml @@ -1255,7 +1255,7 @@ ms: button_download: "Muat turun" button_duplicate: "Salinan" button_edit: "Edit" - button_edit_associated_wikipage: "Edit halaman wiki berkaitan: %{page_title}" + button_edit_associated_wikipage: "Edit halaman Wiki berkaitan: %{page_title}" button_expand_all: "Kembangkan semua" button_favorite: "Tambah ke kegemaran" button_filter: "Saring" diff --git a/config/locales/crowdin/no.seeders.yml b/config/locales/crowdin/no.seeders.yml index 1db76e706e40..c7e58ea50a14 100644 --- a/config/locales/crowdin/no.seeders.yml +++ b/config/locales/crowdin/no.seeders.yml @@ -252,20 +252,20 @@ item_4: subject: Slutten av prosjektet wiki: | - _In this wiki you can collaboratively create and edit pages and sub-pages to create a project wiki._ + _På denne wikien kan du opprette og redigere sider og undersider for å opprette en prosjektwiki. - **You can:** + **Du kan:** - * Insert text and images, also with copy and paste from other documents - * Create a page hierarchy with parent pages - * Include wiki pages to the project menu - * Use macros to include, e.g. table of contents, work package lists, or Gantt charts - * Include wiki pages in other text fields, e.g. project overview page - * Include links to other documents - * View the change history - * View as Markdown + * Sett inn tekst og bilder, også med kopier og lim inn fra andre dokumenter + * Lag et sidehierarki med overordnede sider + * Inkluder wiki-sider til prosjektmenyen + * Bruk makroer til å inkludere, f.eks. Liste over innhold, arbeidspakker eller Gantt karter + * Inkluder wiki-sider i andre tekstfelt, f.eks. prosjektoversikten side + * Inkluder lenker til andre dokumenter + * Se endringshistorien + * Vis som Markdown - More information: [https://www.openproject.org/docs/user-guide/wiki/](https://www.openproject.org/docs/user-guide/wiki/) + Mer informasjon: [https://www.openproject.org/docs/user-guide/wiki/](https://www.openproject.org/docs/user-guide/wiki/) scrum-project: name: Scrum prosjekt status_explanation: Alle oppgaver er i rute. Personene som er involvert kjenner sine oppgaver. Systemet er ferdig satt opp. diff --git a/config/locales/crowdin/no.yml b/config/locales/crowdin/no.yml index 80a9d93a9868..25d53d0e09b1 100644 --- a/config/locales/crowdin/no.yml +++ b/config/locales/crowdin/no.yml @@ -264,7 +264,7 @@ lists: active: "Aktive prosjekter" my: "Mine prosjekter" - favored: "Favorite projects" + favored: "Favorittprosjekter" archived: "Arkiverte prosjekter" my_private: "Mine private prosjektlister" new: @@ -306,13 +306,13 @@ no_results_title_text: Det er ingen ekstra registrert diskplass brukt av dette prosjektet. lists: create: - success: "The modified list has been saved as a new list" - failure: "The modified list cannot be saved: %{errors}" + success: "Den endrede listen er lagret som en ny liste" + failure: "Den endrede listen kan ikke lagres: %{errors}" update: - success: "The modified list has been saved" - failure: "The modified list cannot be saved: %{errors}" - can_be_saved: "List modified:" - can_be_saved_as: "The modifications can only be saved in a new list:" + success: "Den endrede listen er lagret" + failure: "Den endrede listen kan ikke lagres: %{errors}" + can_be_saved: "Listen endret:" + can_be_saved_as: "Endringene kan bare lagres i en ny liste." members: index: no_results_title_text: Det er ingen medlemmer i prosjektet. @@ -330,7 +330,7 @@ project_roles: "Prosjekt roller" wp_shares: "Delte arbeidspakker" groups: "Grupper" - no_modify_on_shared: "You currently cannot modify or remove shared memberships through the member page. Use the sharing modal instead." + no_modify_on_shared: "Du kan ikke endre eller fjerne delte medlemskap via medlemsiden. Bruk delingsmodulen i stedet." delete_member_dialog: title: "Fjern medlem" will_remove_the_users_role: "Dette vil fjerne brukerens rolle fra dette prosjektet." @@ -371,7 +371,7 @@ cannot_remove_inherited_with_role: "Arbeidspakkenes delinger med rollen %{shared_role_name} er delt via grupper og kan ikke fjernes." cannot_remove_inherited_note_admin_html: "Du kan enten oppheve delingen til gruppen eller fjerne dette bestemte medlemmet fra gruppen i %{administration_settings_link}." cannot_remove_inherited_note_non_admin: "Du kan enten oppheve delingen til gruppen eller kontakte systemansvarlig for å fjerne dette medlemmet fra gruppen." - will_revoke_directly_granted_access: "This action will revoke their access to all of them, but the work packages shared with a group." + will_revoke_directly_granted_access: "Denne handlingen vil tilbakekalle tilgangen til alle med unntak av arbeidspakker delt med en gruppe." will_revoke_access_to_all: "Denne handlingen vil fjerne deres tilgang til alle." my: access_token: @@ -494,9 +494,9 @@ unsupported_for_multiple_projects: "Bulk flytt/kopi er ikke støttet for arbeidspakker fra flere prosjekter" sharing: missing_workflow_warning: - title: "Workflow missing for work package sharing" - message: "No workflow is configured for the 'Work package editor' role. Without a workflow, the shared with user cannot alter the status of the work package. Workflows can be copied. Select a source type (e.g. 'Task') and source role (e.g. 'Member'). Then select the target types. To start with, you could select all the types as targets. Finally, select the 'Work package editor' role as the target and press 'Copy'. After having thus created the defaults, fine tune the workflows as you do for every other role." - link_message: "Configure the workflows in the administration." + title: "Arbeidsflyt mangler for deling av arbeidspakker" + message: "Ingen arbeidsflyt er konfigurert for rollen 'Arbeidspakke redaktør'. Uten en arbeidsflyt kan ikke brukeren endre status på arbeidspakken. Arbeidsflyt kan kopieres. Velg en kildetype (f.eks. 'oppgave') og en kilderolle (f.eks. 'medlem'). Velg så måltyper. Til å begynne med, kan du velge alle typene som mål. Til slutt velger du \"Redigeringsprogrammet for arbeidspakke\" som mål og klikk \"Kopier\". Etter å ha opprettet standardinnstillingene, kan du finjustere arbeidsflytene som du gjør for enhver annen rolle." + link_message: "Konfigurer arbeidsmetodene i administrasjonen." summary: reports: category: @@ -791,7 +791,7 @@ not_an_iso_date: "er ikke en gyldig dato. Påkrevd format: ÅÅÅÅ-MM-DD." not_same_project: "hører ikke til samme prosjekt." odd: "må være oddetall." - regex_match_failed: "does not match the regular expression %{expression}." + regex_match_failed: "samsvarer ikke med det regulære uttrykket %{expression}." regex_invalid: "kunne ikke valideres med det tilhørende regulære uttrykket." smaller_than_or_equal_to_max_length: "må være mindre enn eller lik maksimumslengden." taken: "er allerede tatt." @@ -1273,7 +1273,7 @@ button_edit: "Rediger" button_edit_associated_wikipage: "Rediger tilknyttet Wiki-side: %{page_title}" button_expand_all: "Utvid alle" - button_favorite: "Add to favorites" + button_favorite: "Legg til i favoritter" button_filter: "Filter" button_generate: "Generer" button_list: "Liste" @@ -1670,7 +1670,7 @@ progress_calculation_adjusted: >- Fremdriftsberegning automatisk <a href="%{href}" target="_blank">justert med versjon</a>. totals_removed_from_childless_work_packages: >- - Work and progress totals automatically removed for non-parent work packages with <a href="%{href}" target="_blank">version update</a>. This is a maintenance task and can be safely ignored. + Arbeids- og fremdriftssummer fjernet automatisk for ikke-overordnede arbeidspakker med <a href="%{href}" target="_blank">-versjon</a>. Dette er en vedlikeholdsoppgave og kan trygt ignoreres. links: configuration_guide: "Konfigurasjonsveiviser" get_in_touch: "Har du spørsmål? Ta kontakt med oss." @@ -2002,7 +2002,7 @@ label_learn_more: "Lær mer" label_less_or_equal: "<=" label_less_than_ago: "mindre enn dager siden" - label_link_url: "Link (URL)" + label_link_url: "Lenke (URL)" label_list: "Liste" label_loading: "Laster..." label_lock_user: "Lås bruker" @@ -2028,7 +2028,7 @@ label_membership_plural: "Medlemskap" lable_membership_added: "Medlem lagt til" lable_membership_updated: "Medlem oppdatert" - label_menu: "Menu" + label_menu: "Meny" label_menu_badge: pre_alpha: "pre-alpha" alpha: "alpha" @@ -2130,7 +2130,7 @@ label_percent_complete: "% Ferdig" label_project_activity: "Aktivitet i prosjektet" label_project_attribute_plural: "Prosjekt egenskaper" - label_project_attribute_manage_link: "Manage project attributes" + label_project_attribute_manage_link: "Administrer prosjektegenskaper" label_project_count: "Antall prosjekter" label_project_copy_notifications: "Send e-postvarsler mens prosjektkopieringen pågår" label_project_latest: "Siste prosjekter" @@ -2145,7 +2145,7 @@ label_project_attributes_settings: "Innstillinger for prosjektegenskaper" label_project_storage_plural: "Fillagringer" label_project_storage_project_folder: "Fillagringer: Prosjektmapper" - label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space" + label_projects_disk_usage_information: "%{count} prosjekter som bruker %{used_disk_space} diskplass" label_project_view_all: "Vis alle prosjekter" label_project_show_details: "Vis prosjektdetaljer" label_project_hide_details: "Skjul prosjektdetaljer" @@ -2747,7 +2747,7 @@ member_of_group: "Deltakers gruppe" name_or_identifier: "Navn eller identifikator" only_subproject_id: "Bare underprosjekt" - shared_with_user: "Shared with users" + shared_with_user: "Delt med brukere" shared_with_me: "Delt med meg" subproject_id: "Inkludert underprosjekt" repositories: @@ -2892,7 +2892,7 @@ setting_app_subtitle: "Undertittel for applikasjon" setting_app_title: "Applikasjonsnavn" setting_attachment_max_size: "Maksstørrelse for vedlegg" - setting_show_work_package_attachments: "Show attachments in the files tab by default" + setting_show_work_package_attachments: "Vis vedlegg i fil-fanen som standard" setting_antivirus_scan_mode: "Skannemodus" setting_antivirus_scan_action: "Handling for infisert fil" setting_autofetch_changesets: "Autofetch kodelagerendringer" @@ -2995,7 +2995,7 @@ whitelist_text_html: > Definer en liste over gydlige fil-typer og/eller mime typer for opplastingsfiler.<br/>Sett inn fil-typer (f.eks. <code>%{ext_example}</code>) eller mime typer (f.eks. <code>%{mime_example}</code>).<br/> La stå tom for å godta at alle filtyper kan lastes opp. Flere verdier er tillatt (en linje for hver verdi). show_work_package_attachments: > - Deactivating this option will hide the attachments list on the work packages files tab for new projects. The files attached in the description of a work package will still be uploaded in the internal attachments storage. + Deaktivering av dette valget vil skjule listen over vedlegg på arbeidspakkefiler for nye prosjekter. Filene som ligger i beskrivelsen av en arbeidspakke vil fortsatt bli lastet opp i den interne lagringen. antivirus: title: "Virusskanning" clamav_ping_failed: "Kan ikke koble til ClamAV daemon. Dobbeltsjekk konfigurasjonen og prøv på nytt." @@ -3234,8 +3234,8 @@ drag_area_label: "Behandle og endre rekkefølgen på kolonner" sort_by: automatic: - heading: "Automatic" - description: "Order the %{plural} by one or more sorting criteria. You will lose the previous sorting." + heading: "Automatisk" + description: "Sorter %{plural} med ett eller flere sorteringskriterier. Du vil miste den forrige sorteringen." top_menu: additional_resources: "Tilleggsressurser" getting_started: "Komme i gang" @@ -3583,7 +3583,7 @@ link: kobling plugin_openproject_auth_plugins: name: "OpenProject Auth utvidelse" - description: "Integration of OmniAuth strategy providers for authentication in OpenProject." + description: "Integrering av OmniAuth strategileverandører for autentisering i Openproject." plugin_openproject_auth_saml: name: "OmniAuth SAML / Enkeltpålogging på" description: "Legger til OmniAuth SAML leverandør til OpenProject" diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index fcf932cfdaed..4afcc61a4ab2 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -335,12 +335,12 @@ ru: will_remove_the_users_role: "Это удалит роль пользователя из этого проекта." will_remove_the_groups_role: "Это удалит роль группы из этого проекта." however_work_packages_shared_with_user_html: - one: "Однако, %{shared_work_packages_link} также был разделен с этим пользователем." - few: "Однако, %{shared_work_packages_link} также был разделен с этим пользователем." + one: "Однако, %{shared_work_packages_link} также был предоставлен этому пользователю.\n" + few: "Однако, %{shared_work_packages_link} также был предоставлен этому пользователю." many: "However, %{shared_work_packages_link} have also been shared with this user." other: "However, %{shared_work_packages_link} have also been shared with this user." however_work_packages_shared_with_group_html: - one: "Однако, %{shared_work_packages_link} также был разделен с этой группой." + one: "Однако, %{shared_work_packages_link} также был предоставлен этой группе." few: "However, %{shared_work_packages_link} have also been shared with this group." many: "However, %{shared_work_packages_link} have also been shared with this group." other: "However, %{shared_work_packages_link} have also been shared with this group." @@ -349,7 +349,7 @@ ru: will_not_affect_inherited_shares: "(Это не повлияет на пакеты работ, разделенные с их группой)." can_remove_direct_but_not_shared_roles: "Вы можете удалить этого пользователя как непосредственного участника проекта, но группа, в которой он состоит, также является участником этого проекта, поэтому он будет продолжать оставаться участником через группу." also_work_packages_shared_with_user_html: - one: "Также, %{shared_work_packages_link} был разделен с этим пользователем." + one: "Также, %{shared_work_packages_link} был предоставлен этому пользователю." few: "Also, %{shared_work_packages_link} have been shared with this user." many: "Also, %{shared_work_packages_link} have been shared with this user." other: "Also, %{shared_work_packages_link} have been shared with this user." @@ -362,12 +362,12 @@ ru: delete_work_package_shares_dialog: title: "Отменить общий доступ к пакету работ" shared_with_this_user_html: - one: "%{all_shared_work_packages_link} был разделен с этим пользователем." + one: "%{all_shared_work_packages_link} был предоставлен этому пользователю." few: "%{all_shared_work_packages_link} have been shared with this user." many: "%{all_shared_work_packages_link} have been shared with this user." other: "%{all_shared_work_packages_link} have been shared with this user." shared_with_this_group_html: - one: "%{all_shared_work_packages_link} был разделен с этой группой." + one: "%{all_shared_work_packages_link} был предоставлен этой группе." few: "%{all_shared_work_packages_link} have been shared with this group." many: "%{all_shared_work_packages_link} have been shared with this group." other: "%{all_shared_work_packages_link} have been shared with this group." @@ -380,8 +380,8 @@ ru: will_not_affect_inherited_shares: "(Это не повлияет на пакеты работ, разделенные с их группой)." cannot_remove_inherited: "Общие пакеты работ, к которым предоставлен общий доступ через группы, не могут быть удалены." cannot_remove_inherited_with_role: "Общие пакеты работ с ролью %{shared_role_name} доступны через группы и не могут быть удалены.\n\n\n\n" - cannot_remove_inherited_note_admin_html: "You can either revoke the share to the group or remove this specific member from the group in the %{administration_settings_link}." - cannot_remove_inherited_note_non_admin: "You can either revoke the share to the group or contact your administrator to remove this specific member from the group." + cannot_remove_inherited_note_admin_html: "Вы можете либо отозвать общий доступ к группе, либо удалить этого конкретного участника из группы в %{administration_settings_link}." + cannot_remove_inherited_note_non_admin: "Вы можете либо отозвать общий доступ к группе, либо обратиться к администратору, чтобы удалить этого конкретного участника из группы." will_revoke_directly_granted_access: "This action will revoke their access to all of them, but the work packages shared with a group." will_revoke_access_to_all: "This action will revoke their access to all of them." my: @@ -1021,8 +1021,8 @@ ru: only_values_greater_or_equal_zeroes_allowed: "Должно быть >= 0." format: "%{message}" remaining_hours: - cant_exceed_work: "Cannot be higher than Work." - must_be_set_when_work_is_set: "Required when Work is set." + cant_exceed_work: "Не может быть выше Работы." + must_be_set_when_work_is_set: "Требуется, если установлен параметр «Работа»." format: "%{message}" readonly_status: "Пакет работ находится в статусе доступном только для чтения, поэтому его атрибуты не могут быть изменены." type: @@ -1138,12 +1138,12 @@ ru: updated_by_on_time_entry: "зарегистрированное время, обновленное %{user} в %{datetime}" updated_on: "обновлено %{datetime}" updated_on_time_entry: "зарегистрированное время обновлено в %{datetime}" - deleted_on: "deleted on %{datetime}" - deleted_by_on: "deleted by %{user} on %{datetime}" - added_on: "added on %{datetime}" - added_by_on: "added by %{user} on %{datetime}" - removed_on: "removed on %{datetime}" - removed_by_on: "removed by %{user} on %{datetime}" + deleted_on: "удалено %{datetime}" + deleted_by_on: "удалено %{user} %{datetime}" + added_on: "добавлено %{datetime}" + added_by_on: "добавлено %{user} %{datetime}" + removed_on: "удалено %{datetime}" + removed_by_on: "удалено %{user} %{datetime}" parent_without_of: "Подпроект" parent_no_longer: "Больше не подпроект" time_entry: @@ -1161,16 +1161,16 @@ ru: logged_for: "Зарегистрирован для" meeting_agenda_item: duration: - added: "set to %{value}" - added_html: "set to <i>%{value}</i>" - removed: "removed" + added: "установлено в %{value}" + added_html: "установлено в <i>%{value}</i>" + removed: "удалено" updated: "изменено с %{old_value} на %{value}" - updated_html: "changed from <i>%{old_value}</i> to <i>%{value}</i>" + updated_html: "изменено с <i>%{old_value}</i> на <i>%{value}</i>" position: - updated: "reordered" + updated: "переупорядочено" work_package: updated: "изменено с %{old_value} на %{value}" - updated_html: "changed from <i>%{old_value}</i> to <i>%{value}</i>" + updated_html: "изменено с <i>%{old_value}</i> на <i>%{value}</i>" filter: changeset: "Наборы изменений" message: "Форумы" @@ -1302,7 +1302,7 @@ ru: button_edit: "Правка" button_edit_associated_wikipage: "Редактирование связанной wiki-страницы: %{page_title}" button_expand_all: "Развернуть все" - button_favorite: "Add to favorites" + button_favorite: "Добавить в избранное" button_filter: "Фильтр" button_generate: "Генерировать" button_list: "Список" @@ -1330,7 +1330,7 @@ ru: button_unarchive: "Разархивировать" button_uncheck_all: "Снять все отметки" button_unlock: "Разблокировать" - button_unfavorite: "Remove from favorites" + button_unfavorite: "Удалить из избранного" button_unwatch: "Прекратить наблюдение" button_update: "Обновление" button_upgrade: "Обновить" @@ -1342,13 +1342,13 @@ ru: button_configure_menu_entry: "Настройка пункта меню" button_delete_menu_entry: "Удаление пункта меню" button_view_shared_work_packages: "Просмотр общих пакетов работ" - button_manage_roles: "Manage roles" - button_remove_member: "Remove member" - button_remove_member_and_shares: "Remove member and shares" - button_revoke_work_package_shares: "Revoke work package shares" - button_revoke_access: "Revoke access" - button_revoke_all: "Revoke all" - button_revoke_only: "Revoke only %{shared_role_name}" + button_manage_roles: "Управление ролями" + button_remove_member: "Удалить участника" + button_remove_member_and_shares: "Удалить участника и общие ресурсы" + button_revoke_work_package_shares: "Отменить общий доступ к пакету работ" + button_revoke_access: "Отменить доступ" + button_revoke_all: "Отменить всё" + button_revoke_only: "Отменить только %{shared_role_name}" consent: checkbox_label: Принимаю к сведению и соглашаюсь с вышеизложенным. failure_message: Согласие не получено, продолжение невозможно. @@ -1652,7 +1652,7 @@ ru: pdf_overview_table: "PDF таблица" pdf_report_with_images: "PDF отчёт с изображениями" pdf_report: "PDF отчёт" - pdf_gantt: "PDF Gantt" + pdf_gantt: "Диаграмма Гантта в PDF" image: omitted: "Изображение не экспортировано." units: @@ -1706,9 +1706,9 @@ ru: changes_retracted: "Изменения отменены." caused_changes: dates_changed: "Даты изменены" - default_attribute_written: "Read-only attributes written" - progress_mode_changed_to_status_based: "Progress calculation updated" - status_p_complete_changed: "Status % Complete changed" + default_attribute_written: "Запись атрибутов со свойством \"только для чтения\"" + progress_mode_changed_to_status_based: "Расчет прогресса обновлен" + status_p_complete_changed: "Статус \"% завершения\" изменен" system_update: "Обновление системы OpenProject:" cause_descriptions: work_package_predecessor_changed_times: внесением изменений в предшественника %{link} @@ -1724,16 +1724,16 @@ ru: dates: working: "%{date} сейчас рабочий" non_working: "%{date} теперь нерабочий" - progress_mode_changed_to_status_based: Progress calculation mode set to status-based + progress_mode_changed_to_status_based: Режим расчета прогресса установлен на основе статуса status_p_complete_changed: >- - % complete value for status '%{status_name}' changed from %{old_value}% to %{new_value}% + "% завершения" для статуса '%{status_name}' изменено с %{old_value}% на %{new_value}% system_update: file_links_journal: > Теперь на вкладке Активность появится активность, связанная со ссылками файлов (файлы, хранящиеся во внешних хранилищах). Ниже описывается деятельность по уже существующим ссылкам: progress_calculation_adjusted_from_disabled_mode: >- - Progress calculation automatically <a href="%{href}" target="_blank">set to work-based mode and adjusted with version update</a>. + Расчет прогресса автоматически <a href="%{href}" target="_blank">переводится в рабочий режим и корректируется при обновлении версии</a>. progress_calculation_adjusted: >- - Progress calculation automatically <a href="%{href}" target="_blank">adjusted with version update</a>. + Расчет прогресса автоматически <a href="%{href}" target="_blank">корректируется при обновлении версии</a>. totals_removed_from_childless_work_packages: >- Work and progress totals automatically removed for non-parent work packages with <a href="%{href}" target="_blank">version update</a>. This is a maintenance task and can be safely ignored. links: @@ -2815,7 +2815,7 @@ ru: member_of_group: "Группа назначенного" name_or_identifier: "Имя или идентификатор" only_subproject_id: "Только подпроект" - shared_with_user: "Shared with users" + shared_with_user: "Доступно пользователям" shared_with_me: "В общем доступе с" subproject_id: "Включая подпроект" repositories: @@ -2990,7 +2990,7 @@ ru: setting_emails_footer: "содержимое нижней части почтовых сообщений" setting_emails_header: "Заголовок письма" setting_email_login: "Использовать email как логин" - setting_enabled_scm: "Вклченные SCM (системы управления исходным кодом)" + setting_enabled_scm: "Включенные SCM (системы управления исходным кодом)" setting_enabled_projects_columns: "Столбцы в списке проектов, отображаемые по умолчанию" setting_feeds_enabled: "Включить новостные ленты" setting_ical_enabled: "Включить подписку на iCalendar" @@ -3042,7 +3042,7 @@ ru: setting_session_ttl_hint: "При значении ниже 5-ти отключено" setting_session_ttl_enabled: "Сессия истекает" setting_start_of_week: "Начало недели в" - setting_sys_api_enabled: "Разрешить веб-сервис управления репоторием" + setting_sys_api_enabled: "Разрешить веб-сервис управления репозиторием" setting_sys_api_description: "Веб-сервис управления репозиторием обеспечивает интеграцию и авторизацию пользователя для доступа к репозиторию." setting_time_format: "Время" setting_accessibility_mode_for_anonymous: "Разрешить режим доступа людей с ограниченными возможностями для анонимных пользователей" @@ -3116,12 +3116,12 @@ ru: label_edit_section: "Переименовать" label_section_actions: "Действия в разделе" heading_description: "These project attributes appear in the overview page of each project. You can add new attributes, group them into sections and re-order them as you please. These attributes can be enabled or disabled but not re-ordered at a project level." - label_project_custom_field_actions: "Project attribute actions" + label_project_custom_field_actions: "Действия с атрибутами проекта" label_no_project_custom_fields: "No project attributes defined in this section" edit: description: "Changes to this project attribute will be reflected in all projects where it is enabled. Required attributes cannot be disabled on a per-project basis." new: - heading: "New attribute" + heading: "Новый атрибут" description: "Changes to this project attribute will be reflected in all projects where it is enabled. Required attributes cannot be disabled on a per-project basis." projects: missing_dependencies: "Был проверен модуль проекта %{module}, который зависит от %{dependencies}. Вам также необходимо проверить эти зависимости." @@ -3300,7 +3300,7 @@ ru: drag_area_label: "Управляйте колонками и изменяйте их порядок" sort_by: automatic: - heading: "Automatic" + heading: "Автоматически" description: "Order the %{plural} by one or more sorting criteria. You will lose the previous sorting." top_menu: additional_resources: "Дополнительные ресурсы" @@ -3384,7 +3384,7 @@ ru: info: "Удаление рабочего пакета – действие необратимое." title: "Удалить пакет работ" progress: - label_note: "Note:" + label_note: "Примечание:" modal: work_based_help_text: "% Complete is automatically derived from Work and Remaining work." status_based_help_text: "% Complete is set by work package status." diff --git a/config/locales/crowdin/zh-CN.seeders.yml b/config/locales/crowdin/zh-CN.seeders.yml index 4110817e86f9..8c753fa24088 100644 --- a/config/locales/crowdin/zh-CN.seeders.yml +++ b/config/locales/crowdin/zh-CN.seeders.yml @@ -252,20 +252,20 @@ zh-CN: item_4: subject: 项目结束 wiki: | - _In this wiki you can collaboratively create and edit pages and sub-pages to create a project wiki._ + _在这个wiki中,您可以协作创建和编辑页面及子页面,以创建项目wiki._ - **You can:** + **您可以:** - * Insert text and images, also with copy and paste from other documents - * Create a page hierarchy with parent pages - * Include wiki pages to the project menu - * Use macros to include, e.g. table of contents, work package lists, or Gantt charts - * Include wiki pages in other text fields, e.g. project overview page - * Include links to other documents - * View the change history - * View as Markdown + * 插入文本和图片,也可以从其他文档中复制和粘贴 + * 创建带父页面的页面层次结构 + * 在项目菜单中包含wiki页面 + * 使用宏来包含,例如:目录、工作包列表或甘特图 + * 在其他文本字段中包含wiki页面,例如:项目概览页面 + * 包含指向其他文档的链接 + * 查看更改历史 + * 以 Markdown 格式查看 - More information: [https://www.openproject.org/docs/user-guide/wiki/](https://www.openproject.org/docs/user-guide/wiki/) + 更多信息:[https://www.openproject.org/docs/user-guide/wiki/](https://www.openproject.org/docs/user-guide/wiki/) scrum-project: name: Scrum 项目 status_explanation: 所有任务都按计划进行。相关人员均知晓各自任务。系统已完全建立。 diff --git a/modules/backlogs/config/locales/crowdin/no.yml b/modules/backlogs/config/locales/crowdin/no.yml index 0b8e9a210f15..1701425b130c 100644 --- a/modules/backlogs/config/locales/crowdin/no.yml +++ b/modules/backlogs/config/locales/crowdin/no.yml @@ -57,7 +57,7 @@ label_versions_default_fold_state: "Vis versjoner kollapset" work_package_is_closed: "Arbeidspakke er ferdig, når" label_is_done_status: "Status %{status_name} betyr fullført" - no_burndown_data: "Ingen burndown-data tilgjengelig. Det er nødvendig å ha sprintens start- og sluttdatoer satt." + no_burndown_data: "Ingen burndown-data tilgjengelig. Det er nødvendig å ha etappens start- og sluttdatoer satt." points: "Poeng" positions_could_not_be_rebuilt: "Posisjoner kunne ikke gjenoppbygges." positions_rebuilt_successfully: "Vellykket gjenoppbygging av posisjoner." @@ -82,7 +82,7 @@ backlogs_product_backlog_is_empty: "Produktforsinkelser er tom" backlogs_product_backlog_unsized: "Toppen av produktforsinkelser har historier uten størrelser" backlogs_sizing_inconsistent: "Historiestørrelsene varierer fra estimater" - backlogs_sprint_notes_missing: "Stengte etapperr uten påfølgende/gjennomgangsnotater" + backlogs_sprint_notes_missing: "Stengte etapper uten tilbakeskuende/gjennomgangsnotater" backlogs_sprint_unestimated: "Lukkede eller aktive etapper med uestimerte historier" backlogs_sprint_unsized: "Prosjektet har historier i aktive eller nylig lukkede etapper uten størrelse" backlogs_sprints: "Etapper" @@ -90,12 +90,12 @@ backlogs_story_type: "Historietyper" backlogs_task: "Oppgave" backlogs_task_type: "Oppgavetype" - backlogs_velocity_missing: "Ingen hastighet kan beregnes for dette prosjektet" - backlogs_velocity_varies: "Hastigheten varierer betydelig over sprinter" - backlogs_wiki_template: "Mal for sprint wiki-side" - backlogs_empty_title: "Ingen versjoner er definert til å brukes i backlogs" - backlogs_empty_action_text: "For å komme i gang med backlogs, lag en ny versjon og legg den til i en backlog-kolonne" - button_edit_wiki: "Rediger Wiki-sider" + backlogs_velocity_missing: "Ingen fremdrift kan beregnes for dette prosjektet" + backlogs_velocity_varies: "Fremdriften varierer betydelig over etapper" + backlogs_wiki_template: "Mal for etappe wiki-side" + backlogs_empty_title: "Ingen versjoner er definert til å brukes i forsinkelser" + backlogs_empty_action_text: "For å komme i gang med forsinkelser, lag en ny versjon og legg den til i en forsinkelse-kolonne" + button_edit_wiki: "Rediger Wiki-side" error_backlogs_task_cannot_be_story: "Instillingene er ugyldige. Den valgte oppgavetypen kan ikke også være en historietype." error_intro_plural: "Møtte på følgende feil:" error_intro_singular: "Møtte på følgende feil:" @@ -106,11 +106,11 @@ inclusion: "er ikke inkludert i listen" label_back_to_project: "Tilbake til projektsiden" label_backlog: "Backlog" - label_backlogs: "Backlogs" - label_backlogs_unconfigured: "Du har ikke konfigurert Backlogs enda. Gå til %{administration} > %{plugins}og klikk deretter på %{configure} linken for denne utvidelsen. Når du har angitt felter, kom du tilbake til denne siden for å begynne å bruke verktøyet." - label_blocks_ids: "IDer for blokkerte arbeidspakker" + label_backlogs: "Forsinkelser" + label_backlogs_unconfigured: "Du har ikke konfigurert Forsinkelser enda. Gå til %{administration} > %{plugins}og klikk deretter på %{configure} lenken for denne utvidelsen. Når du har angitt felter, går du tilbake til denne siden for å begynne å bruke verktøyet." + label_blocks_ids: "ID'er for blokkerte arbeidspakker" label_burndown: "Gjenstående" - label_column_in_backlog: "Kolonne i backlog" + label_column_in_backlog: "Kolonne i forsinkelse" label_hours: " timer" label_work_package_hierarchy: "Hierarki for arbeidspakker" label_master_backlog: "Master Backlog" @@ -118,13 +118,13 @@ label_points: "punkter" label_points_burn_down: "Ned" label_points_burn_up: "Opp" - label_product_backlog: "Produkt-backlog" + label_product_backlog: "produkt-forsinkelse" label_select_all: "Velg alle" label_sprint_backlog: "sprint backlog" label_sprint_cards: "Eksporter kort" - label_sprint_impediments: "Sprint hindring" - label_sprint_name: "Sprint \"%{name}\"" - label_sprint_velocity: "Hastighet %{velocity}, basert på %{sprints} sprints med gjennomsnittlig %{days} dager" + label_sprint_impediments: "Hindring i etappe" + label_sprint_name: "Etappe \"%{name}\"" + label_sprint_velocity: "Fremdrift %{velocity}, basert på %{sprints} etapper med gjennomsnittlig %{days} dager" label_stories: "Historier" label_stories_tasks: "Historier/Oppgaver" label_task_board: "Oppgavetavle" @@ -135,13 +135,13 @@ permission_view_master_backlog: "Vis master backlog" permission_view_taskboards: "Vis oppgavetavler" permission_select_done_statuses: "Velg ferdige statuser" - permission_update_sprints: "Oppdater sprinter" + permission_update_sprints: "Oppdater etapper" points_accepted: "poeng akseptert" - points_committed: "Poeng investert" + points_committed: "Poeng innsendt" points_resolved: "Poeng løst" points_to_accept: "Poeng ikke akseptert" points_to_resolve: "Poeng ikke løst" - project_module_backlogs: "Backlogs" + project_module_backlogs: "Forsinkelser" rb_label_copy_tasks: "Kopier arbeidspakker" rb_label_copy_tasks_all: "Alle" rb_label_copy_tasks_none: "Ingen" @@ -152,7 +152,7 @@ required_burn_rate_points: "Nødvendig brennetid (poeng)" todo_work_package_description: "%{summary}: %{url}\n%{description}" todo_work_package_summary: "%{type}: %{summary}" - version_settings_display_label: "Kolonne i backlog" + version_settings_display_label: "Kolonne i forsinkelse" version_settings_display_option_left: "venstre" version_settings_display_option_none: "ingen" version_settings_display_option_right: "høyre" diff --git a/modules/bim/config/locales/crowdin/ms.seeders.yml b/modules/bim/config/locales/crowdin/ms.seeders.yml index 9257a180411d..0e5ecb33376c 100644 --- a/modules/bim/config/locales/crowdin/ms.seeders.yml +++ b/modules/bim/config/locales/crowdin/ms.seeders.yml @@ -80,7 +80,7 @@ ms: * [(Demo) Projek BIM]({{opSetting:base_url}}/projects/demo-bim-project): Proses dan koordinasi BIM. * [(Demo) Pengurusan BCF]({{opSetting:base_url}}/projects/demo-bcf-management-project): Pengurusan BCF. - Anda juga boleh mencipta [projek baru]({{opSetting:base_url}}/projects/new) yang baru. + Anda juga boleh mencipta [projek baharu]({{opSetting:base_url}}/projects/new) yang baharu. Jangan berhenti bekerjasama. Dengan sumber dan minda terbuka. @@ -631,7 +631,7 @@ ms: ## Deskripsi * Permulaan ditapak pembinaan termasuk pengenalan kepada model - * Semua objek perlu ada maklumat yang diperlukan untuk tugasan. JIka tidak, penambahan data model perlu dilakukan + * Semua objek perlu ada maklumat yang diperlukan untuk tugasan. Jika tidak, penambahan data model perlu dilakukan * ... item_1: subject: Bina bangunan diff --git a/modules/bim/config/locales/crowdin/no.seeders.yml b/modules/bim/config/locales/crowdin/no.seeders.yml index 9e82f50b2fca..c8821450c053 100644 --- a/modules/bim/config/locales/crowdin/no.seeders.yml +++ b/modules/bim/config/locales/crowdin/no.seeders.yml @@ -47,7 +47,7 @@ name: Konflikt global_queries: item_0: - name: 'Innebygd tabell: Barn' + name: 'Innebygd tabell: Underordnet' type_configuration: item_0: form_configuration: @@ -61,7 +61,7 @@ item_2: name: BIM -ledere item_3: - name: BIM-modeller + name: BIM utviklere item_4: name: Ledende BIM-koordinatorer item_5: diff --git a/modules/gitlab_integration/config/locales/crowdin/no.yml b/modules/gitlab_integration/config/locales/crowdin/no.yml index bdd36496e963..4802685a8f03 100644 --- a/modules/gitlab_integration/config/locales/crowdin/no.yml +++ b/modules/gitlab_integration/config/locales/crowdin/no.yml @@ -44,23 +44,23 @@ merge_request_reopened_comment: > **MR gjenåpnet:** Sammenføyningsforespørsel %{mr_number} [%{mr_title}](%{mr_url}) for [%{repository}](%{repository_url}) har blitt gjenåpnet av [%{gitlab_user}](%{gitlab_user_url}). note_commit_referenced_comment: > - **Referenced in Commit:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in a Commit Note [%{commit_id}](%{commit_url}) on [%{repository}](%{repository_url}): %{commit_note} + **Referert i Commit:** [%{gitlab_user}](%{gitlab_user_url}) refererte til denne WP i et besøksnotat [%{commit_id}](%{commit_url}) på [%{repository}](%{repository_url}): %{commit_note} note_mr_referenced_comment: > - **Referenced in MR:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}): %{mr_note} + **Referert i MR:** [%{gitlab_user}](%{gitlab_user_url}) refererte til denne WP i Merge Request %{mr_number} [%{mr_title}]%{mr_url} på [%{repository}](%{repository_url}): %{mr_note} note_mr_commented_comment: > - **Commented in MR:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}): %{mr_note} + **Referert i MR:** [%{gitlab_user}](%{gitlab_user_url}) refererte til denne WP i Merge Request %{mr_number} [%{mr_title}](%{mr_url}) på [%{repository}](%{repository_url}): %{mr_note} note_issue_referenced_comment: > - **Referenced in Issue:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}): %{issue_note} + **Referert i Problem:** [%{gitlab_user}](%{gitlab_user_url}) refererte til denne WP i Problem %{issue_number} [%{issue_title}](%{issue_url}) på [%{repository}](%{repository_url}): %{issue_note} note_issue_commented_comment: > - **Commented in Issue:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}): %{issue_note} + **Referert i Problem:** [%{gitlab_user}](%{gitlab_user_url}) refererte til denne WP i Problem %{issue_number} [%{issue_title}](%{issue_url}) på [%{repository}](%{repository_url}): %{issue_note} note_snippet_referenced_comment: > - **Referenced in Snippet:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Snippet %{snippet_number} [%{snippet_title}](%{snippet_url}) on [%{repository}](%{repository_url}): %{snippet_note} + **Referert i Snippet:** [%{gitlab_user}](%{gitlab_user_url}) refererer til denne WP i Snippet %{snippet_number} [%{snippet_title}](%{snippet_url}) på [%{repository}](%{repository_url}): %{snippet_note} issue_opened_referenced_comment: > - **Issue Opened:** Issue %{issue_number} [%{issue_title}](%{issue_url}) for [%{repository}](%{repository_url}) has been opened by [%{gitlab_user}](%{gitlab_user_url}). + **Problem åpnet:** Problem %{issue_number} [%{issue_title}](%{issue_url}) for [%{repository}](%{repository_url}) har blitt åpnet av [%{gitlab_user}](%{gitlab_user_url}). issue_closed_referenced_comment: > - **Issue Closed:** Issue %{issue_number} [%{issue_title}](%{issue_url}) for [%{repository}](%{repository_url}) has been closed by [%{gitlab_user}](%{gitlab_user_url}). + **Problemet Lukket:** Problem %{issue_number} [%{issue_title}](%{issue_url}) for [%{repository}](%{repository_url}) har blitt lukket av [%{gitlab_user}](%{gitlab_user_url}). issue_reopened_referenced_comment: > - **Issue Reopened:** Issue %{issue_number} [%{issue_title}](%{issue_url}) for [%{repository}](%{repository_url}) has been reopened by [%{gitlab_user}](%{gitlab_user_url}). + **Problem gjenåpnet:** Problem %{issue_number} [%{issue_title}](%{issue_url}) for [%{repository}](%{repository_url}) har blitt gjenåpnet av [%{gitlab_user}](%{gitlab_user_url}). push_single_commit_comment: > **Forespurt i MR:** [%{gitlab_user}](%{gitlab_user_url}) forespurt [%{commit_number}](%{commit_url}) til [%{repository}](%{repository_url}) ved %{commit_timestamp}: %{commit_note} push_multiple_commits_comment: > diff --git a/modules/gitlab_integration/config/locales/crowdin/ru.yml b/modules/gitlab_integration/config/locales/crowdin/ru.yml index 9d6a18b27473..55b141d04af9 100644 --- a/modules/gitlab_integration/config/locales/crowdin/ru.yml +++ b/modules/gitlab_integration/config/locales/crowdin/ru.yml @@ -33,7 +33,7 @@ ru: labels: invalid_schema: "должен быть массив хэшей с помощью ключей: цвет, заголовок" project_module_gitlab: "GitLab" - permission_show_gitlab_content: "Show GitLab content" + permission_show_gitlab_content: "Показать содержимое GitLab" gitlab_integration: merge_request_opened_comment: > **MR Opened:** Merge request %{mr_number} [%{mr_title}](%{mr_url}) for [%{repository}](%{repository_url}) has been opened by [%{gitlab_user}](%{gitlab_user_url}). diff --git a/modules/grids/config/locales/crowdin/js-fr.yml b/modules/grids/config/locales/crowdin/js-fr.yml index a51623f187ab..647c5e91832a 100644 --- a/modules/grids/config/locales/crowdin/js-fr.yml +++ b/modules/grids/config/locales/crowdin/js-fr.yml @@ -43,8 +43,8 @@ fr: title: 'Sous-projets' no_results: 'Aucun sous-projet.' project_favorites: - title: 'Favorite projects' - no_results: 'You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites.' + title: 'Projets favoris' + no_results: 'Vous n''avez actuellement aucun projet favori. Cliquez sur l''icône en forme d''étoile dans le tableau de bord du projet pour en ajouter un à vos favoris.' time_entries_current_user: title: 'Mon temps passé' displayed_days: 'Jours affichés dans le widget :' diff --git a/modules/grids/config/locales/crowdin/js-no.yml b/modules/grids/config/locales/crowdin/js-no.yml index 9ce442998adf..c6584ce4df94 100644 --- a/modules/grids/config/locales/crowdin/js-no.yml +++ b/modules/grids/config/locales/crowdin/js-no.yml @@ -43,8 +43,8 @@ title: 'Underprosjekter' no_results: 'Ingen delprosjekter.' project_favorites: - title: 'Favorite projects' - no_results: 'You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites.' + title: 'Favorittprosjekter' + no_results: 'Du har ingen prosjektfavoritter. Klikk på stjerneikonet i prosjektdashbordet for å legge til en i favorittene dine.' time_entries_current_user: title: 'Min tidsbruk' displayed_days: 'Dager vist i widgetet:' diff --git a/modules/grids/config/locales/crowdin/js-ru.yml b/modules/grids/config/locales/crowdin/js-ru.yml index b5214cfe5423..16d89abd3e48 100644 --- a/modules/grids/config/locales/crowdin/js-ru.yml +++ b/modules/grids/config/locales/crowdin/js-ru.yml @@ -43,7 +43,7 @@ ru: title: 'Подпроекты' no_results: 'Подпроектов нет.' project_favorites: - title: 'Favorite projects' + title: 'Избранные проекты' no_results: 'You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites.' time_entries_current_user: title: 'Затраченное мной время' diff --git a/modules/meeting/config/locales/crowdin/fr.seeders.yml b/modules/meeting/config/locales/crowdin/fr.seeders.yml index fa53d7541911..fe82866481dd 100644 --- a/modules/meeting/config/locales/crowdin/fr.seeders.yml +++ b/modules/meeting/config/locales/crowdin/fr.seeders.yml @@ -20,10 +20,10 @@ fr: item_3: title: Des nouvelles de l'équipe marketing item_5: - title: Updates from sales team + title: Des nouvelles de l'équipe commerciale item_6: - title: Review of quarterly goals + title: Révision des objectifs trimestriels item_7: - title: Core values feedback + title: Feedback sur les valeurs fondamentales item_8: - title: General topics + title: Sujets généraux diff --git a/modules/meeting/config/locales/crowdin/fr.yml b/modules/meeting/config/locales/crowdin/fr.yml index 69c0a446780c..3e6fdc026fed 100644 --- a/modules/meeting/config/locales/crowdin/fr.yml +++ b/modules/meeting/config/locales/crowdin/fr.yml @@ -49,7 +49,7 @@ fr: description: "Notes" presenter: "Responsable" meeting_section: - title: "Title" + title: "Titre" errors: messages: invalid_time_format: "n’est pas une heure valide. Format requis : HH:MM" @@ -101,7 +101,7 @@ fr: attachments: text: "Les fichiers joints sont accessibles à tous les participants à la réunion. Vous pouvez également les glisser-déposer dans les notes relatives aux points de l'ordre du jour." copy: - title: "Copy meeting: %{title}" + title: "Copier la réunion : %{title}" attachments: "Copier les fichiers" attachments_text: "Copiez tous les fichiers joints dans la nouvelle réunion." agenda: "Copier l'ordre du jour" @@ -125,10 +125,10 @@ fr: structured_text_copy: "Actuellement, la copie d'une réunion n'entraîne pas la copie des points de l'ordre du jour de la réunion, mais uniquement des détails." copied: "Copié depuis la réunion #%{id}" meeting_section: - untitled_title: "Untitled section" - delete_confirmation: "Deleting the section will also delete all of its agenda items. Are you sure you want to do this?" - placeholder_title: "New section" - empty_text: "Drag items here or create a new one" + untitled_title: "Section sans titre" + delete_confirmation: "Supprimer la section supprimera également tous les éléments de l'ordre du jour qui s'y rapportent. Voulez-vous vraiment continuer ?" + placeholder_title: "Nouvelle section" + empty_text: "Faites glisser des éléments ici ou créez-en un nouveau" notice_successful_notification: "Notification envoyée avec succès" notice_timezone_missing: Aucun fuseau horaire n'est défini et %{zone} est supposé. Pour choisir votre fuseau horaire, veuillez cliquer ici. permission_create_meetings: "Créer des réunions" diff --git a/modules/meeting/config/locales/crowdin/no.seeders.yml b/modules/meeting/config/locales/crowdin/no.seeders.yml index 5634f75b71ce..94f08bc8f261 100644 --- a/modules/meeting/config/locales/crowdin/no.seeders.yml +++ b/modules/meeting/config/locales/crowdin/no.seeders.yml @@ -20,10 +20,10 @@ item_3: title: Oppdateringer fra markedsføringsteam item_5: - title: Updates from sales team + title: Oppdateringer fra salgsteam item_6: - title: Review of quarterly goals + title: Gjennomgang av kvartalsvise mål item_7: - title: Core values feedback + title: Tilbakemelding på kjerneverdier item_8: - title: General topics + title: Generelle emner diff --git a/modules/meeting/config/locales/crowdin/no.yml b/modules/meeting/config/locales/crowdin/no.yml index cf51f66b0520..4a8439c0b65b 100644 --- a/modules/meeting/config/locales/crowdin/no.yml +++ b/modules/meeting/config/locales/crowdin/no.yml @@ -49,7 +49,7 @@ description: "Notater" presenter: "Foredragsholder" meeting_section: - title: "Title" + title: "Tittel" errors: messages: invalid_time_format: "er ikke et gyldig tidpunkt. Formatet må være HH:MM" @@ -125,10 +125,10 @@ structured_text_copy: "Kopiering av et møte vil for tiden ikke kopiere de tilknyttede elementene på dagsordenen, bare detaljene" copied: "Kopiert fra møte #%{id}" meeting_section: - untitled_title: "Untitled section" - delete_confirmation: "Deleting the section will also delete all of its agenda items. Are you sure you want to do this?" - placeholder_title: "New section" - empty_text: "Drag items here or create a new one" + untitled_title: "Ikke navngitt del" + delete_confirmation: "Hvis du sletter denne delen, slettes også dets verdier i alle prosjekter. Er du sikker på at du vil gjøre dette?" + placeholder_title: "Ny seksjon" + empty_text: "Dra punkter hit eller opprett et nytt" notice_successful_notification: "Påminning sendt" notice_timezone_missing: Ingen tidssone angis og %{zone} antas. Vennligst klikk her for å velge egen tidssone. permission_create_meetings: "Opprett møter" diff --git a/modules/meeting/config/locales/crowdin/ru.seeders.yml b/modules/meeting/config/locales/crowdin/ru.seeders.yml index 2baeaca36a9c..e1d5455f201d 100644 --- a/modules/meeting/config/locales/crowdin/ru.seeders.yml +++ b/modules/meeting/config/locales/crowdin/ru.seeders.yml @@ -20,10 +20,10 @@ ru: item_3: title: Обновления от команды маркетинга item_5: - title: Updates from sales team + title: Обновления от отдела продаж item_6: - title: Review of quarterly goals + title: Обзор квартальных целей item_7: - title: Core values feedback + title: Отзыв о базовых значениях item_8: - title: General topics + title: Основные темы diff --git a/modules/meeting/config/locales/crowdin/ru.yml b/modules/meeting/config/locales/crowdin/ru.yml index 7f177ee15d88..3e2910506893 100644 --- a/modules/meeting/config/locales/crowdin/ru.yml +++ b/modules/meeting/config/locales/crowdin/ru.yml @@ -127,7 +127,7 @@ ru: structured_text_copy: "При копировании совещания в настоящее время не скопируются связанные с ним пункты повестки, будут скопированы только детали" copied: "Скопировано со встречи #%{id}" meeting_section: - untitled_title: "Untitled section" + untitled_title: "Раздел без названия" delete_confirmation: "Удаление раздела также удалит все пункты его повестки дня. Вы уверены, что хотите это сделать?" placeholder_title: "Новый раздел" empty_text: "Перенесите элементы сюда или создайте новый" diff --git a/modules/meeting/config/locales/crowdin/zh-CN.seeders.yml b/modules/meeting/config/locales/crowdin/zh-CN.seeders.yml index 13d67f5aed05..c05b8cebd1ea 100644 --- a/modules/meeting/config/locales/crowdin/zh-CN.seeders.yml +++ b/modules/meeting/config/locales/crowdin/zh-CN.seeders.yml @@ -20,10 +20,10 @@ zh-CN: item_3: title: 市场团队的更新 item_5: - title: Updates from sales team + title: 销售团队的更新 item_6: - title: Review of quarterly goals + title: 季度目标回顾 item_7: - title: Core values feedback + title: 核心价值反馈 item_8: - title: General topics + title: 一般性议题 diff --git a/modules/openid_connect/config/locales/crowdin/fr.yml b/modules/openid_connect/config/locales/crowdin/fr.yml index 7042ee01c3c4..3f5b1a706bc3 100644 --- a/modules/openid_connect/config/locales/crowdin/fr.yml +++ b/modules/openid_connect/config/locales/crowdin/fr.yml @@ -1,7 +1,7 @@ fr: plugin_openproject_openid_connect: name: "OpenProject OpenID Connect" - description: "Adds OmniAuth OpenID Connect strategy providers to OpenProject." + description: "Ajoute des fournisseurs de stratégie OmniAuth OpenID Connect à OpenProject." logout_warning: > Vous avez été déconnecté. Le contenu de tout formulaire que vous soumettez peut être perdu. Veuillez [vous connecter]. activemodel: diff --git a/modules/openid_connect/config/locales/crowdin/no.yml b/modules/openid_connect/config/locales/crowdin/no.yml index 76bba3b28e9a..4d028e4ce367 100644 --- a/modules/openid_connect/config/locales/crowdin/no.yml +++ b/modules/openid_connect/config/locales/crowdin/no.yml @@ -1,7 +1,7 @@ "no": plugin_openproject_openid_connect: name: "OpenProject OpenID tilkobling" - description: "Adds OmniAuth OpenID Connect strategy providers to OpenProject." + description: "Legger til OmniAuth OpenID Connect strategileverandører til Openproject." logout_warning: > Du har blitt logget ut. Innholdet kan gå tapt. Vennligst [logg in]. activemodel: diff --git a/modules/storages/config/locales/crowdin/fr.yml b/modules/storages/config/locales/crowdin/fr.yml index f7af16a74247..94f06a7cd753 100644 --- a/modules/storages/config/locales/crowdin/fr.yml +++ b/modules/storages/config/locales/crowdin/fr.yml @@ -39,20 +39,20 @@ fr: api_v3: errors: too_many_elements_created_at_once: Trop d'éléments créés à la fois. %{max} attendu au maximum, obtenu %{actual}. - external_file_storages: External file storages - permission_create_files: 'Automatically managed project folders: Create files' - permission_create_files_explanation: This permission is only available for Nextcloud storages - permission_delete_files: 'Automatically managed project folders: Delete files' - permission_delete_files_explanation: This permission is only available for Nextcloud storages + external_file_storages: Stockages de fichiers externes + permission_create_files: 'Gestion automatique des dossiers de projet : Créer des fichiers' + permission_create_files_explanation: Cette permission n'est disponible que pour les espaces de stockage Nextcloud + permission_delete_files: 'Gestion automatique des dossiers de projet : Supprimer des fichiers' + permission_delete_files_explanation: Cette permission n'est disponible que pour les espaces de stockage Nextcloud permission_header_for_project_module_storages: Dossiers de projets gérés automatiquement permission_manage_file_links: Gérer les liens de fichiers permission_manage_storages_in_project: Gérer les stockages de fichiers dans le projet - permission_read_files: 'Automatically managed project folders: Read files' - permission_share_files: 'Automatically managed project folders: Share files' - permission_share_files_explanation: This permission is only available for Nextcloud storages + permission_read_files: 'Gestion automatique des dossiers de projet : Lire des fichiers' + permission_share_files: 'Gestion automatique des dossiers de projet : Partager des fichiers' + permission_share_files_explanation: Cette permission n'est disponible que pour les espaces de stockage Nextcloud permission_view_file_links: Voir les liens des fichiers - permission_write_files: 'Automatically managed project folders: Write files' - project_module_storages: Files + permission_write_files: 'Gestion automatique des dossiers de projet : Écrire des fichiers' + project_module_storages: Fichiers storages: buttons: complete_without_setup: Compléter sans @@ -246,8 +246,8 @@ fr: name: OneDrive/SharePoint name_placeholder: par exemple OneDrive show_attachments_toggle: - description: 'Deactivating this option will hide the attachments list on the work packages files tab. The files attached in the description of a work package will still be uploaded in the internal attachments storage. ' - label: Show attachments in the work packages files tab + description: 'Si vous désactivez cette option, la liste des pièces jointes dans l''onglet des fichiers des lots de travaux sera masquée. Les fichiers joints dans la description d''un lot de travaux seront toujours téléchargés dans l''espace de stockage interne des pièces jointes. ' + label: Afficher les pièces jointes dans l'onglet des fichiers des lots de travaux storage_list_blank_slate: description: Ajoutez un stockage pour les voir ici. heading: Vous n'avez pas encore d'espace de stockage. diff --git a/modules/storages/config/locales/crowdin/no.yml b/modules/storages/config/locales/crowdin/no.yml index ea8b45cd91bf..6ea2bbc3e4f1 100644 --- a/modules/storages/config/locales/crowdin/no.yml +++ b/modules/storages/config/locales/crowdin/no.yml @@ -39,20 +39,20 @@ api_v3: errors: too_many_elements_created_at_once: For mange elementer opprettet samtidig. Forventet %{max} som høyeste, fikk %{actual}. - external_file_storages: External file storages - permission_create_files: 'Automatically managed project folders: Create files' - permission_create_files_explanation: This permission is only available for Nextcloud storages - permission_delete_files: 'Automatically managed project folders: Delete files' - permission_delete_files_explanation: This permission is only available for Nextcloud storages + external_file_storages: Eksterne fillagringer + permission_create_files: 'Automatisk administrerte prosjektmapper: Opprett filer' + permission_create_files_explanation: Denne tillatelsen er bare tilgjengelig for Nextcloud lagre + permission_delete_files: 'Automatisk administrerte prosjektmapper: Slett filer' + permission_delete_files_explanation: Denne tillatelsen er bare tilgjengelig for Nextcloud lagre permission_header_for_project_module_storages: Automatisk administrerte prosjektmapper permission_manage_file_links: Administrer fil-linker permission_manage_storages_in_project: Administrer fillagring i prosjektet - permission_read_files: 'Automatically managed project folders: Read files' - permission_share_files: 'Automatically managed project folders: Share files' - permission_share_files_explanation: This permission is only available for Nextcloud storages + permission_read_files: 'Automatisk administrerte prosjektmapper: Les filer' + permission_share_files: 'Automatisk administrerte prosjektmapper: Del filer' + permission_share_files_explanation: Denne tillatelsen er bare tilgjengelig for Nextcloud lagre permission_view_file_links: Vis fil-linker - permission_write_files: 'Automatically managed project folders: Write files' - project_module_storages: Files + permission_write_files: 'Automatisk administrerte prosjektmapper: Skriv filer' + project_module_storages: Filer storages: buttons: complete_without_setup: Fullfør uten @@ -83,14 +83,14 @@ error_invalid_provider_type: Vennligst velg en gyldig lagringsleverandør. file_storage_view: access_management: - automatic_management: Automatically managed access and folders - automatic_management_description: Let OpenProject create folders per project automatically and manage its user access. This is recommended as it ensures that every team member has always the correct access permissions. - description: Select the type of management of user access and folder creation. We recommend to use the Automatically managed access to have a more organised structure and guarantee access to all relevant users. - manual_management: Manually managed access and folders - manual_management_description: Create and manage folders per project manually on your own. You will need to manually ensure relevant users have access. - setup_incomplete: Select the type of management of user access and folder creation. - subtitle: Access management - title: Access and project folders + automatic_management: Administrere automatisk tilgang og mapper + automatic_management_description: La OpenProject lage mapper automatisk og administrere brukertilgang hver av sine mapper. Det anbefales fordi den sikrer at alle gruppemedlemmer alltid har riktig tilgangsrettigheter. + description: Velg type behandling av brukertilgang og opprettelse av mappe. Vi anbefaler å bruke automatisk administrert tilgang for å ha en mer organisert struktur og garantere tilgang til alle relevante brukere. + manual_management: Manuelt administrert tilgang og mapper + manual_management_description: Opprett og behandle mapper manuelt per prosjekt på egenhånd. Du må manuelt sikre at relevante brukere har tilgang. + setup_incomplete: Velg type behandling av brukertilgang og opprettelse av mappe. + subtitle: Tilgangsstyring + title: Tilgang og prosjektmapper automatically_managed_folders: Automatisk administrerte mapper general_information: Generell informasjon nextcloud_oauth: Nextcloud OAuth @@ -109,12 +109,12 @@ subtitle: Automatisk administrerte prosjektmapper title: Helse-status health_email_notifications: - description_subscribed: All administrators receive health status email notifications for this storage. - description_unsubscribed: Health status email notifications for this storage have been turned off for all administrators. - error_could_not_be_saved: Email notification settings could not be saved. Please try again. + description_subscribed: Alle administratorer mottar e-postmeldinger med helsestatus for denne lagringen. + description_unsubscribed: E-postvarsler for helsestatus for denne lagringen er slått av for alle administratorer. + error_could_not_be_saved: Kunne ikke lagre e-postvarslingsinnstillingene. Prøv på nytt. subscribe: Abonner title: E-postvarsler - unsubscribe: Unsubscribe + unsubscribe: Avslutt abonnement help_texts: project_folder: Prosjektmappen er standardmappen for filopplasting for dette prosjektet. Brukere kan likevel laste opp filer til andre steder. instructions: @@ -164,7 +164,7 @@ label_creator: Skaper label_delete_storage: Slett fillagring label_edit_storage: Redigere fillagring - label_edit_storage_access_management: Edit storage access management + label_edit_storage_access_management: Redigere administrasjon for lagringstilgang label_edit_storage_automatically_managed_folders: Rediger automatisk administrerte mapper label_edit_storage_host: Redigere lagringsvert label_existing_manual_folder: Eksisterende mappe med manuelt administrerte tillatelser @@ -234,7 +234,7 @@ project_storage_members: subtitle: Sjekk tilkoblingsstatusen for lagringsstedet %{storage_name_link} for alle prosjektmedlemmer. title: Medlemmers tilkoblingsstatus - permission_header_explanation: 'File permissions on external storages are applied only to folders and files within automatically managed project folders. Note that not all file permissions are supported by all storage providers. Please check the documentation on <a target=''_blank'' href=''https://www.openproject.org/docs/system-admin-guide/users-permissions/roles-permissions/#file-storages-permissions''>file storage permissions</a> for more information.' + permission_header_explanation: 'Filtillatelser til eksterne lagringsplasser brukes bare på mapper og filer innenfor automatisk administrerte prosjektmapper. Merk at ikke alle filtillatelser støttes av alle lagringstilbydere. Kontroller dokumentasjonen for <a target=''_blank'' href=''https://www.openproject.org/docs/system-admin-guide/users-permissions/roles-permissions/#file-storages-permissions''>-filens lagringsrettigheter</a> for mer informasjon.' provider_types: label: Tjenestetype nextcloud: @@ -248,8 +248,8 @@ name: OneDrive/SharePoint name_placeholder: f.eks OneDrive show_attachments_toggle: - description: 'Deactivating this option will hide the attachments list on the work packages files tab. The files attached in the description of a work package will still be uploaded in the internal attachments storage. ' - label: Show attachments in the work packages files tab + description: 'Deaktivering av dette valget vil skjule listen over vedlegg på arbeidspakkefiler for nye prosjekter. Filene som ligger i beskrivelsen av en arbeidspakke vil fortsatt bli lastet opp i den interne lagringen.' + label: Vis vedlegg i fanen for arbeidspakker storage_list_blank_slate: description: Legg til lagringsplass for å se dem her. heading: Du har ingen lagringssted enda. diff --git a/modules/storages/config/locales/crowdin/zh-CN.yml b/modules/storages/config/locales/crowdin/zh-CN.yml index b9209f785e26..1efa252c4c4e 100644 --- a/modules/storages/config/locales/crowdin/zh-CN.yml +++ b/modules/storages/config/locales/crowdin/zh-CN.yml @@ -40,18 +40,18 @@ zh-CN: errors: too_many_elements_created_at_once: 一次创建的元素过多。最多应为 %{max} 个,实际为 %{actual} 个。 external_file_storages: 外部文件存储 - permission_create_files: 'Automatically managed project folders: Create files' - permission_create_files_explanation: This permission is only available for Nextcloud storages - permission_delete_files: 'Automatically managed project folders: Delete files' - permission_delete_files_explanation: This permission is only available for Nextcloud storages + permission_create_files: '自动管理项目文件夹:创建文件' + permission_create_files_explanation: 此权限仅适用于Nextcloud存储器 + permission_delete_files: '自动管理项目文件夹:删除文件' + permission_delete_files_explanation: 此权限仅适用于Nextcloud存储器 permission_header_for_project_module_storages: 自动托管项目文件夹 permission_manage_file_links: 管理文件链接 permission_manage_storages_in_project: 管理项目中的文件存储 - permission_read_files: 'Automatically managed project folders: Read files' - permission_share_files: 'Automatically managed project folders: Share files' - permission_share_files_explanation: This permission is only available for Nextcloud storages + permission_read_files: '自动管理项目文件夹:读取文件' + permission_share_files: '自动管理项目文件夹:共享文件' + permission_share_files_explanation: 此权限仅适用于Nextcloud存储器 permission_view_file_links: 查看文件链接 - permission_write_files: 'Automatically managed project folders: Write files' + permission_write_files: '自动管理项目文件夹:写入文件' project_module_storages: 文件 storages: buttons: From 0ea3e1a7ceb10b9d1dde4b46facb216cb02d57e6 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI <operations+ci@openproject.com> Date: Thu, 23 May 2024 07:06:54 +0000 Subject: [PATCH 09/40] update locales from crowdin [ci skip] --- config/locales/crowdin/fr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index 1558b46cde1a..78b69f37cb84 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -3235,7 +3235,7 @@ fr: sort_by: automatic: heading: "Automatique" - description: "Classez les %{pluriel} selon un ou plusieurs critères de tri. Vous perdrez le tri précédent." + description: "Classez les %{plural} selon un ou plusieurs critères de tri. Vous perdrez le tri précédent." top_menu: additional_resources: "Ressources supplémentaires" getting_started: "Pour commencer" From e70767e042957fc152334e79fbabf8710c3cb569 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI <operations+ci@openproject.com> Date: Thu, 23 May 2024 07:08:57 +0000 Subject: [PATCH 10/40] update locales from crowdin [ci skip] --- config/locales/crowdin/fr.yml | 2 +- modules/meeting/config/locales/crowdin/es.seeders.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index a777f8ac4cfa..c1551bc915ba 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -3235,7 +3235,7 @@ fr: sort_by: automatic: heading: "Automatique" - description: "Classez les %{pluriel} selon un ou plusieurs critères de tri. Vous perdrez le tri précédent." + description: "Classez les %{plural} selon un ou plusieurs critères de tri. Vous perdrez le tri précédent." top_menu: additional_resources: "Ressources supplémentaires" getting_started: "Pour commencer" diff --git a/modules/meeting/config/locales/crowdin/es.seeders.yml b/modules/meeting/config/locales/crowdin/es.seeders.yml index c86c9a9a16a5..bb258712a942 100644 --- a/modules/meeting/config/locales/crowdin/es.seeders.yml +++ b/modules/meeting/config/locales/crowdin/es.seeders.yml @@ -20,9 +20,9 @@ es: item_3: title: Actualizaciones del equipo de marketing item_5: - title: Updates from sales team + title: Actualizaciones del equipo de ventas item_6: - title: Review of quarterly goals + title: Revisión de los objetivos trimestrales item_7: title: Core values feedback item_8: From b229550d4f1fa8156ab53c063f1300791b8da186 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 May 2024 07:26:47 +0000 Subject: [PATCH 11/40] Bump rdoc from 6.6.3.1 to 6.7.0 Bumps [rdoc](https://github.com/ruby/rdoc) from 6.6.3.1 to 6.7.0. - [Release notes](https://github.com/ruby/rdoc/releases) - [Changelog](https://github.com/ruby/rdoc/blob/master/History.rdoc) - [Commits](https://github.com/ruby/rdoc/compare/v6.6.3.1...v6.7.0) --- updated-dependencies: - dependency-name: rdoc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index f097d133b22a..787f6121cec3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -916,7 +916,7 @@ GEM ffi (~> 1.0) rb_sys (0.9.97) rbtree3 (0.7.1) - rdoc (6.6.3.1) + rdoc (6.7.0) psych (>= 4.0.0) recaptcha (5.16.0) redcarpet (3.6.0) From aa137e265b09571212b830a92e0e135f72f02443 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 May 2024 07:28:04 +0000 Subject: [PATCH 12/40] Bump sys-filesystem from 1.4.4 to 1.4.5 Bumps [sys-filesystem](https://github.com/djberg96/sys-filesystem) from 1.4.4 to 1.4.5. - [Changelog](https://github.com/djberg96/sys-filesystem/blob/main/CHANGES.md) - [Commits](https://github.com/djberg96/sys-filesystem/compare/sys-filesystem-1.4.4...sys-filesystem-1.4.5) --- updated-dependencies: - dependency-name: sys-filesystem dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index f097d133b22a..892521a76ebf 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1073,7 +1073,7 @@ GEM attr_required (>= 0.0.5) faraday (~> 2.0) faraday-follow_redirects - sys-filesystem (1.4.4) + sys-filesystem (1.4.5) ffi (~> 1.1) table_print (1.5.7) terminal-table (3.0.2) From f835dc3b163f73a7e1197a5eb63a9dfbfab32c9f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 May 2024 07:28:37 +0000 Subject: [PATCH 13/40] Bump the fullcalendar group in /frontend with 7 updates Bumps the fullcalendar group in /frontend with 7 updates: | Package | From | To | | --- | --- | --- | | [@fullcalendar/core](https://github.com/fullcalendar/fullcalendar/tree/HEAD/packages/core) | `6.1.12` | `6.1.13` | | [@fullcalendar/daygrid](https://github.com/fullcalendar/fullcalendar/tree/HEAD/packages/daygrid) | `6.1.12` | `6.1.13` | | [@fullcalendar/interaction](https://github.com/fullcalendar/fullcalendar/tree/HEAD/packages/interaction) | `6.1.12` | `6.1.13` | | [@fullcalendar/list](https://github.com/fullcalendar/fullcalendar/tree/HEAD/packages/list) | `6.1.12` | `6.1.13` | | [@fullcalendar/resource](https://github.com/fullcalendar/fullcalendar-workspace/tree/HEAD/premium/packages/resource) | `6.1.12` | `6.1.13` | | [@fullcalendar/resource-timeline](https://github.com/fullcalendar/fullcalendar-workspace/tree/HEAD/premium/packages/resource-timeline) | `6.1.12` | `6.1.13` | | [@fullcalendar/timegrid](https://github.com/fullcalendar/fullcalendar/tree/HEAD/packages/timegrid) | `6.1.12` | `6.1.13` | Updates `@fullcalendar/core` from 6.1.12 to 6.1.13 - [Release notes](https://github.com/fullcalendar/fullcalendar/releases) - [Changelog](https://github.com/fullcalendar/fullcalendar/blob/main/CHANGELOG.md) - [Commits](https://github.com/fullcalendar/fullcalendar/commits/v6.1.13/packages/core) Updates `@fullcalendar/daygrid` from 6.1.12 to 6.1.13 - [Release notes](https://github.com/fullcalendar/fullcalendar/releases) - [Changelog](https://github.com/fullcalendar/fullcalendar/blob/main/CHANGELOG.md) - [Commits](https://github.com/fullcalendar/fullcalendar/commits/v6.1.13/packages/daygrid) Updates `@fullcalendar/interaction` from 6.1.12 to 6.1.13 - [Release notes](https://github.com/fullcalendar/fullcalendar/releases) - [Changelog](https://github.com/fullcalendar/fullcalendar/blob/main/CHANGELOG.md) - [Commits](https://github.com/fullcalendar/fullcalendar/commits/v6.1.13/packages/interaction) Updates `@fullcalendar/list` from 6.1.12 to 6.1.13 - [Release notes](https://github.com/fullcalendar/fullcalendar/releases) - [Changelog](https://github.com/fullcalendar/fullcalendar/blob/main/CHANGELOG.md) - [Commits](https://github.com/fullcalendar/fullcalendar/commits/v6.1.13/packages/list) Updates `@fullcalendar/resource` from 6.1.12 to 6.1.13 - [Release notes](https://github.com/fullcalendar/fullcalendar-workspace/releases) - [Commits](https://github.com/fullcalendar/fullcalendar-workspace/commits/v6.1.13/premium/packages/resource) Updates `@fullcalendar/resource-timeline` from 6.1.12 to 6.1.13 - [Release notes](https://github.com/fullcalendar/fullcalendar-workspace/releases) - [Commits](https://github.com/fullcalendar/fullcalendar-workspace/commits/v6.1.13/premium/packages/resource-timeline) Updates `@fullcalendar/timegrid` from 6.1.12 to 6.1.13 - [Release notes](https://github.com/fullcalendar/fullcalendar/releases) - [Changelog](https://github.com/fullcalendar/fullcalendar/blob/main/CHANGELOG.md) - [Commits](https://github.com/fullcalendar/fullcalendar/commits/v6.1.13/packages/timegrid) --- updated-dependencies: - dependency-name: "@fullcalendar/core" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: fullcalendar - dependency-name: "@fullcalendar/daygrid" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: fullcalendar - dependency-name: "@fullcalendar/interaction" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: fullcalendar - dependency-name: "@fullcalendar/list" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: fullcalendar - dependency-name: "@fullcalendar/resource" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: fullcalendar - dependency-name: "@fullcalendar/resource-timeline" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: fullcalendar - dependency-name: "@fullcalendar/timegrid" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: fullcalendar ... Signed-off-by: dependabot[bot] <support@github.com> --- frontend/package-lock.json | 736 +++++++------------------------------ 1 file changed, 135 insertions(+), 601 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 5526ec32cc7f..7a345564da37 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -107,14 +107,14 @@ }, "devDependencies": { "@angular-devkit/build-angular": "^17.3.4", - "@angular-eslint/builder": "^17.3.0", - "@angular-eslint/eslint-plugin": "^17.3.0", - "@angular-eslint/eslint-plugin-template": "^17.3.0", - "@angular-eslint/schematics": "17.3.0", - "@angular-eslint/template-parser": "^17.3.0", + "@angular-eslint/builder": "^17.4.1", + "@angular-eslint/eslint-plugin": "^17.4.1", + "@angular-eslint/eslint-plugin-template": "^17.4.1", + "@angular-eslint/schematics": "17.4.1", + "@angular-eslint/template-parser": "^17.4.1", "@angular/language-service": "17.3.4", - "@html-eslint/eslint-plugin": "^0.15.0", - "@html-eslint/parser": "^0.15.0", + "@html-eslint/eslint-plugin": "^0.24.1", + "@html-eslint/parser": "^0.24.1", "@jsdevtools/coverage-istanbul-loader": "3.0.5", "@types/codemirror": "5.60.5", "@types/dragula": "^3.7.0", @@ -130,18 +130,18 @@ "@types/urijs": "^1.19.6", "@types/uuid": "^8.3.4", "@types/webpack-env": "^1.16.0", - "@typescript-eslint/eslint-plugin": "^7.7.1", - "@typescript-eslint/parser": "^7.7.1", + "@typescript-eslint/eslint-plugin": "^7.10.0", + "@typescript-eslint/parser": "^7.10.0", "browserslist": "^4.23.0", "eslint": "^8.57.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^18.0.0", - "eslint-plugin-change-detection-strategy": "^0.1.1", - "eslint-plugin-import": "^2.26.0", + "eslint-plugin-change-detection-strategy": "^0.1.4", + "eslint-plugin-import": "^2.29.1", "eslint-plugin-jasmine": "^4.1.3", - "eslint-plugin-jsx-a11y": "^6.6.1", - "eslint-plugin-react": "^7.31.11", - "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.2", "esprint": "^3.1.0", "jasmine-core": "~3.6.0", "jasmine-spec-reporter": "~5.0.0", @@ -666,12 +666,6 @@ "typescript": "*" } }, - "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.3.0.tgz", - "integrity": "sha512-ejfNzRuBeHUV8m2fkgs+M809rj5STuCuQo4fdfc6ccQpzXDI6Ha7BKpTznWfg5g529q/wrkoGSGgFxU9Yc2/dQ==", - "dev": true - }, "node_modules/@angular-eslint/eslint-plugin": { "version": "17.4.1", "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.4.1.tgz", @@ -796,16 +790,16 @@ } }, "node_modules/@angular-eslint/schematics": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.3.0.tgz", - "integrity": "sha512-5yssd5EOomxlKt9vN/OXXCTCuI3Pmfj16pkjBDoW0wzC8/M2l5zlXIEfoKumHYv2wtF553LhaMXVYVU35e0lTw==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.4.1.tgz", + "integrity": "sha512-CYpsGc0B/ZGO/RKYlyfeAi1pOvFmVs4pvoHU13uOdhdFJ6nAUTujHiBaULloIrUmuIhGW9S0g6w4ecD6ZP680w==", "dev": true, "dependencies": { - "@angular-eslint/eslint-plugin": "17.3.0", - "@angular-eslint/eslint-plugin-template": "17.3.0", - "@nx/devkit": "^17.2.8 || ^18.0.0", + "@angular-eslint/eslint-plugin": "17.4.1", + "@angular-eslint/eslint-plugin-template": "17.4.1", + "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", "ignore": "5.3.1", - "nx": "^17.2.8 || ^18.0.0", + "nx": "^17.2.8 || ^18.0.0 || ^19.0.0", "strip-json-comments": "3.1.1", "tmp": "0.2.3" }, @@ -813,147 +807,6 @@ "@angular/cli": ">= 17.0.0 < 18.0.0" } }, - "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/eslint-plugin": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.3.0.tgz", - "integrity": "sha512-81cQbOEPoQupFX8WmpqZn+y8VA7JdVRGBtt+uJNKBXcJknTpPWdLBZRFlgVakmC24iEZ0Fint/N3NBBQI3mz2A==", - "dev": true, - "dependencies": { - "@angular-eslint/utils": "17.3.0", - "@typescript-eslint/utils": "7.2.0" - }, - "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/eslint-plugin-template": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.3.0.tgz", - "integrity": "sha512-9l/aRfpE9MCRVDWRb+rSB9Zei0paep1vqV6M/87VUnzBnzqeMRnVuPvQowilh2zweVSGKBF25Vp4HkwOL6ExDQ==", - "dev": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.3.0", - "@angular-eslint/utils": "17.3.0", - "@typescript-eslint/type-utils": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "aria-query": "5.3.0", - "axobject-query": "4.0.0" - }, - "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", - "typescript": "*" - } - }, - "node_modules/@angular-eslint/schematics/node_modules/@typescript-eslint/type-utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", - "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@angular-eslint/schematics/node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular-eslint/schematics/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@angular-eslint/schematics/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular-eslint/schematics/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@angular-eslint/schematics/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@angular-eslint/template-parser": { "version": "17.4.1", "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.4.1.tgz", @@ -974,20 +827,6 @@ "integrity": "sha512-QKQGspxsyMHRwvzqo+Fj42TS/vmnwOHuWC6EN+5KBx3cuImahqFHQW842zVy9f65jfH2xDnNWJ+NW+Tzcgg+pQ==", "dev": true }, - "node_modules/@angular-eslint/utils": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.3.0.tgz", - "integrity": "sha512-PJT9pxWqpvI9OXO+7L5SIVhvMW+RFjeafC7PYjtvSbNFpz+kF644BiAcfMJ0YqBnkrw3JXt+RAX25CT4mXIoXw==", - "dev": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.3.0", - "@typescript-eslint/utils": "7.2.0" - }, - "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", - "typescript": "*" - } - }, "node_modules/@angular/animations": { "version": "17.3.9", "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.9.tgz", @@ -3505,54 +3344,54 @@ } }, "node_modules/@fullcalendar/core": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.12.tgz", - "integrity": "sha512-SgAtMnpYSqypjYJyiSuEk17rrznTHYrBvHiDEPSe5KKMiiLgpzlNKrNCqymHDrazHtihrxmeAjIS7kk5bIx/EQ==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.13.tgz", + "integrity": "sha512-Cps/hMQan4kwnsBhFf2+m2mijbGoWs6r18ZzxBnAAOkkNHtPmHU8EdR6lF+ZLsiVvb7nsC4H/ZKqnxXWwgpoPw==", "dependencies": { "preact": "~10.12.1" } }, "node_modules/@fullcalendar/daygrid": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.12.tgz", - "integrity": "sha512-SB8owl0jMz3NwRydD+Xo6QCmg8F6wRLr1XuGbGNLtlpCE44jbwNNT2ws9IVGbbAB1duLkvE49g/yYs/cpY4HKA==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.13.tgz", + "integrity": "sha512-0I0hL1kgGjkZuc7Qt8mu4jjrqIL5PZzd58bEpTxoXRKI5UBZ9KbshGVMryQSXYANlrRtkPnXVt90VIDrxZbDrA==", "peerDependencies": { - "@fullcalendar/core": "~6.1.12" + "@fullcalendar/core": "~6.1.13" } }, "node_modules/@fullcalendar/interaction": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.1.12.tgz", - "integrity": "sha512-HgNQwTmb6R62wPtrBzOVPo5C8eWHgfSyU+tf6f317jf+x+V0T5mMesNSe42LC7M+8t9ipFHZDyRY+2Da9fu0/Q==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.1.13.tgz", + "integrity": "sha512-r1w+jqCRGZZyxKFquueDSFvbsFhJLhc1BX8Nlyz684lYxS1SiToYJW9Q8X/XkySCzpjO3KOnxEp2jVOn1Usyjg==", "peerDependencies": { - "@fullcalendar/core": "~6.1.12" + "@fullcalendar/core": "~6.1.13" } }, "node_modules/@fullcalendar/list": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/list/-/list-6.1.12.tgz", - "integrity": "sha512-ldS4WyEZMB5QM2sRt9USqdbMMDAXJgaSDBZ5KbFl+AQ03FJMsMh6SqKSXakfPdmmiQKBDNTmp4XigqKWIUMM7A==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/list/-/list-6.1.13.tgz", + "integrity": "sha512-bPW4EsgGNwDZh91NtD+q4hqGfS6jEvCXQo7+MNy4JLMwFtdenEURRrzsb6CW3l97L3Vp0E2mSqiXaNESOmXEcQ==", "peerDependencies": { - "@fullcalendar/core": "~6.1.12" + "@fullcalendar/core": "~6.1.13" } }, "node_modules/@fullcalendar/premium-common": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/premium-common/-/premium-common-6.1.12.tgz", - "integrity": "sha512-Aya7au9sbiGTrukpn2aFaM88T/hkbesUlxYFSKgjH5IPE0Pi+QSTfk2mC+NXyCeHUOhDABtLeDTuAWbMRIyBaA==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/premium-common/-/premium-common-6.1.13.tgz", + "integrity": "sha512-ym68zNPUYGSROsgh/7hcEfIZ56MLCO4ffqF/MABldwKYN0qOIbWfB+EBfr9I6L1nIb5FNKzwhAlTGh9/y/R/BQ==", "peerDependencies": { - "@fullcalendar/core": "~6.1.12" + "@fullcalendar/core": "~6.1.13" } }, "node_modules/@fullcalendar/resource": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/resource/-/resource-6.1.12.tgz", - "integrity": "sha512-ClT4V2KTMO077isiEP/ZMC64tBmvcNwdgLiYOWP39A3cFd95uk7Mi8bR8DVy0jdSLztPasuSf2XtFsayQ+ktMA==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/resource/-/resource-6.1.13.tgz", + "integrity": "sha512-4s34o4qNbPNY1Zo6EyAXylT1D7uAENcmlvSwWADkzH+Rx0aVyY8wdhCXqzqyTcgYz6jRrD32asRjVyWlXJWD8A==", "dependencies": { - "@fullcalendar/premium-common": "~6.1.12" + "@fullcalendar/premium-common": "~6.1.13" }, "peerDependencies": { - "@fullcalendar/core": "~6.1.12" + "@fullcalendar/core": "~6.1.13" } }, "node_modules/@fullcalendar/resource-common": { @@ -3575,51 +3414,51 @@ } }, "node_modules/@fullcalendar/resource-timeline": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/resource-timeline/-/resource-timeline-6.1.12.tgz", - "integrity": "sha512-quU+4EA842UOZ5t8FvjeRHFa75I1y8NDu/P1odoVXmQhXQB5XABfVDG1rs380g1UnwtI0+5NBi+kKFOK2XhS+Q==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/resource-timeline/-/resource-timeline-6.1.13.tgz", + "integrity": "sha512-ASCLiiuJIgViaoUGPxdK1eI2gNo8AwXSnuwZUpGYMPlHPgqYhm5PwGKvZX8pZfhWa9FFIHWr5cDEMyv5UwJxfQ==", "dependencies": { - "@fullcalendar/premium-common": "~6.1.12", - "@fullcalendar/scrollgrid": "~6.1.12", - "@fullcalendar/timeline": "~6.1.12" + "@fullcalendar/premium-common": "~6.1.13", + "@fullcalendar/scrollgrid": "~6.1.13", + "@fullcalendar/timeline": "~6.1.13" }, "peerDependencies": { - "@fullcalendar/core": "~6.1.12", - "@fullcalendar/resource": "~6.1.12" + "@fullcalendar/core": "~6.1.13", + "@fullcalendar/resource": "~6.1.13" } }, "node_modules/@fullcalendar/scrollgrid": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/scrollgrid/-/scrollgrid-6.1.12.tgz", - "integrity": "sha512-HQ5LpRU9fjKZbGEUbHuVdn37R9CCZe2PVJ3RoTvsYaFUC7eeXLAfizvjvuCl6NOUO+nrqRXZC83lFmf7nhNx6g==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/scrollgrid/-/scrollgrid-6.1.13.tgz", + "integrity": "sha512-gIsEGkOfLPMAqclYiZeSyzWxUM+mzlWCFqv1SnJRN6bsO5Lx3hibqWDJDDYgpTFHwjIQKNKGhuxN89lXsi/P9g==", "dependencies": { - "@fullcalendar/premium-common": "~6.1.12" + "@fullcalendar/premium-common": "~6.1.13" }, "peerDependencies": { - "@fullcalendar/core": "~6.1.12" + "@fullcalendar/core": "~6.1.13" } }, "node_modules/@fullcalendar/timegrid": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-6.1.12.tgz", - "integrity": "sha512-A7lvPpYCHFGntV2+ZYgSAaOTJ3VbRzTkoUIS+WBhTQ5asgAjieREGvhvnMet1AMdhBPgM/4g0qXeUlqSglT9Xw==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-6.1.13.tgz", + "integrity": "sha512-8Ub2mSV+6Mh8WWDKuyCYbj5PKYpmyjSctpJ/21fDBJduE9QFS0WfG9CZZxSJT7CT+srnyk4mX2/5gYN9gYZjUg==", "dependencies": { - "@fullcalendar/daygrid": "~6.1.12" + "@fullcalendar/daygrid": "~6.1.13" }, "peerDependencies": { - "@fullcalendar/core": "~6.1.12" + "@fullcalendar/core": "~6.1.13" } }, "node_modules/@fullcalendar/timeline": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/timeline/-/timeline-6.1.12.tgz", - "integrity": "sha512-+9EepXep8VCWNhYobrvE44J/Gj9+vKjfJ7M6miTHAaoouC2od+LihmWxvybk2Gtem84yrasjSq90HHBXHePaSw==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/timeline/-/timeline-6.1.13.tgz", + "integrity": "sha512-5lqjZYE1Mu+2xHb1Y9J/E8BlyHsu0FeGzPQoyL3L6rqTwttxv1Dpxy28teWr8KN9NpCGKYQCMFzbADo6DEgHeA==", "dependencies": { - "@fullcalendar/premium-common": "~6.1.12", - "@fullcalendar/scrollgrid": "~6.1.12" + "@fullcalendar/premium-common": "~6.1.13", + "@fullcalendar/scrollgrid": "~6.1.13" }, "peerDependencies": { - "@fullcalendar/core": "~6.1.12" + "@fullcalendar/core": "~6.1.13" } }, "node_modules/@github/auto-check-element": { @@ -3714,21 +3553,21 @@ } }, "node_modules/@html-eslint/eslint-plugin": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.15.0.tgz", - "integrity": "sha512-6DUb2ZN1PUlzlNzNj4aBhoObBp3Kl/+YbZ6CnkgFAsQSW0tSFAu7p8WwESkz9RZLZZN9gCUlcaYKJnQjTkmnDA==", + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.24.1.tgz", + "integrity": "sha512-JwNDQBrNIWEPcxgSpla/2jaUXyQCqL7Xp8CmON4Bk5qg8MwiDLXOgjylfVC+tN52i8JeHWMca34I9DqBGRj9Qg==", "dev": true, "engines": { - "node": ">=8.10.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@html-eslint/parser": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.15.0.tgz", - "integrity": "sha512-fA+HQtWnODhOIK6j1p4XWqltINx7hM0WNNTM2RvlH/2glzeRDCcYq3vEmeQhnytvGocidu4ofTzNk80cLnnyiw==", + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.24.1.tgz", + "integrity": "sha512-O13xX/+Ldh0P7VZMpDDYc3XtWiE1cYm5QhVJ0VB5i7D8Q69HrrGN+5BjS17vkCoLTz+3zWWIiJv4oFmyS5LReA==", "dev": true, "dependencies": { - "es-html-parser": "^0.0.8" + "es-html-parser": "^0.0.9" }, "engines": { "node": ">=8.10.0" @@ -6292,130 +6131,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", - "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/visitor-keys": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", @@ -10227,9 +9942,9 @@ } }, "node_modules/es-html-parser": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/es-html-parser/-/es-html-parser-0.0.8.tgz", - "integrity": "sha512-kjMH23xhvTBw/7Ve1Dtb/7yZdFajfvwOpdsgRHmnyt8yvTsDJnkFjUgEEaMZFW+e1OhN/eoZrvF9wehq+waTGg==", + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/es-html-parser/-/es-html-parser-0.0.9.tgz", + "integrity": "sha512-oniQMi+466VFsDzcdron9Ry/sqUJpDJg1bbDn0jFJKDdxXhwIOYDr4DgBnO5/yPLGj2xv+n5yy4L1Q0vAC5TYQ==", "dev": true }, "node_modules/es-iterator-helpers": { @@ -23047,12 +22762,6 @@ "nx": "^17.2.8 || ^18.0.0 || ^19.0.0" } }, - "@angular-eslint/bundled-angular-compiler": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.3.0.tgz", - "integrity": "sha512-ejfNzRuBeHUV8m2fkgs+M809rj5STuCuQo4fdfc6ccQpzXDI6Ha7BKpTznWfg5g529q/wrkoGSGgFxU9Yc2/dQ==", - "dev": true - }, "@angular-eslint/eslint-plugin": { "version": "17.4.1", "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.4.1.tgz", @@ -23145,106 +22854,18 @@ } }, "@angular-eslint/schematics": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.3.0.tgz", - "integrity": "sha512-5yssd5EOomxlKt9vN/OXXCTCuI3Pmfj16pkjBDoW0wzC8/M2l5zlXIEfoKumHYv2wtF553LhaMXVYVU35e0lTw==", + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.4.1.tgz", + "integrity": "sha512-CYpsGc0B/ZGO/RKYlyfeAi1pOvFmVs4pvoHU13uOdhdFJ6nAUTujHiBaULloIrUmuIhGW9S0g6w4ecD6ZP680w==", "dev": true, "requires": { - "@angular-eslint/eslint-plugin": "17.3.0", - "@angular-eslint/eslint-plugin-template": "17.3.0", - "@nx/devkit": "^17.2.8 || ^18.0.0", + "@angular-eslint/eslint-plugin": "17.4.1", + "@angular-eslint/eslint-plugin-template": "17.4.1", + "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", "ignore": "5.3.1", - "nx": "^17.2.8 || ^18.0.0", + "nx": "^17.2.8 || ^18.0.0 || ^19.0.0", "strip-json-comments": "3.1.1", "tmp": "0.2.3" - }, - "dependencies": { - "@angular-eslint/eslint-plugin": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.3.0.tgz", - "integrity": "sha512-81cQbOEPoQupFX8WmpqZn+y8VA7JdVRGBtt+uJNKBXcJknTpPWdLBZRFlgVakmC24iEZ0Fint/N3NBBQI3mz2A==", - "dev": true, - "requires": { - "@angular-eslint/utils": "17.3.0", - "@typescript-eslint/utils": "7.2.0" - } - }, - "@angular-eslint/eslint-plugin-template": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.3.0.tgz", - "integrity": "sha512-9l/aRfpE9MCRVDWRb+rSB9Zei0paep1vqV6M/87VUnzBnzqeMRnVuPvQowilh2zweVSGKBF25Vp4HkwOL6ExDQ==", - "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "17.3.0", - "@angular-eslint/utils": "17.3.0", - "@typescript-eslint/type-utils": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "aria-query": "5.3.0", - "axobject-query": "4.0.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", - "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } } }, "@angular-eslint/template-parser": { @@ -23265,16 +22886,6 @@ } } }, - "@angular-eslint/utils": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.3.0.tgz", - "integrity": "sha512-PJT9pxWqpvI9OXO+7L5SIVhvMW+RFjeafC7PYjtvSbNFpz+kF644BiAcfMJ0YqBnkrw3JXt+RAX25CT4mXIoXw==", - "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "17.3.0", - "@typescript-eslint/utils": "7.2.0" - } - }, "@angular/animations": { "version": "17.3.9", "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.9.tgz", @@ -24890,39 +24501,39 @@ } }, "@fullcalendar/core": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.12.tgz", - "integrity": "sha512-SgAtMnpYSqypjYJyiSuEk17rrznTHYrBvHiDEPSe5KKMiiLgpzlNKrNCqymHDrazHtihrxmeAjIS7kk5bIx/EQ==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-6.1.13.tgz", + "integrity": "sha512-Cps/hMQan4kwnsBhFf2+m2mijbGoWs6r18ZzxBnAAOkkNHtPmHU8EdR6lF+ZLsiVvb7nsC4H/ZKqnxXWwgpoPw==", "requires": { "preact": "~10.12.1" } }, "@fullcalendar/daygrid": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.12.tgz", - "integrity": "sha512-SB8owl0jMz3NwRydD+Xo6QCmg8F6wRLr1XuGbGNLtlpCE44jbwNNT2ws9IVGbbAB1duLkvE49g/yYs/cpY4HKA==" + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-6.1.13.tgz", + "integrity": "sha512-0I0hL1kgGjkZuc7Qt8mu4jjrqIL5PZzd58bEpTxoXRKI5UBZ9KbshGVMryQSXYANlrRtkPnXVt90VIDrxZbDrA==" }, "@fullcalendar/interaction": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.1.12.tgz", - "integrity": "sha512-HgNQwTmb6R62wPtrBzOVPo5C8eWHgfSyU+tf6f317jf+x+V0T5mMesNSe42LC7M+8t9ipFHZDyRY+2Da9fu0/Q==" + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-6.1.13.tgz", + "integrity": "sha512-r1w+jqCRGZZyxKFquueDSFvbsFhJLhc1BX8Nlyz684lYxS1SiToYJW9Q8X/XkySCzpjO3KOnxEp2jVOn1Usyjg==" }, "@fullcalendar/list": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/list/-/list-6.1.12.tgz", - "integrity": "sha512-ldS4WyEZMB5QM2sRt9USqdbMMDAXJgaSDBZ5KbFl+AQ03FJMsMh6SqKSXakfPdmmiQKBDNTmp4XigqKWIUMM7A==" + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/list/-/list-6.1.13.tgz", + "integrity": "sha512-bPW4EsgGNwDZh91NtD+q4hqGfS6jEvCXQo7+MNy4JLMwFtdenEURRrzsb6CW3l97L3Vp0E2mSqiXaNESOmXEcQ==" }, "@fullcalendar/premium-common": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/premium-common/-/premium-common-6.1.12.tgz", - "integrity": "sha512-Aya7au9sbiGTrukpn2aFaM88T/hkbesUlxYFSKgjH5IPE0Pi+QSTfk2mC+NXyCeHUOhDABtLeDTuAWbMRIyBaA==" + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/premium-common/-/premium-common-6.1.13.tgz", + "integrity": "sha512-ym68zNPUYGSROsgh/7hcEfIZ56MLCO4ffqF/MABldwKYN0qOIbWfB+EBfr9I6L1nIb5FNKzwhAlTGh9/y/R/BQ==" }, "@fullcalendar/resource": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/resource/-/resource-6.1.12.tgz", - "integrity": "sha512-ClT4V2KTMO077isiEP/ZMC64tBmvcNwdgLiYOWP39A3cFd95uk7Mi8bR8DVy0jdSLztPasuSf2XtFsayQ+ktMA==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/resource/-/resource-6.1.13.tgz", + "integrity": "sha512-4s34o4qNbPNY1Zo6EyAXylT1D7uAENcmlvSwWADkzH+Rx0aVyY8wdhCXqzqyTcgYz6jRrD32asRjVyWlXJWD8A==", "requires": { - "@fullcalendar/premium-common": "~6.1.12" + "@fullcalendar/premium-common": "~6.1.13" } }, "@fullcalendar/resource-common": { @@ -24947,38 +24558,38 @@ } }, "@fullcalendar/resource-timeline": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/resource-timeline/-/resource-timeline-6.1.12.tgz", - "integrity": "sha512-quU+4EA842UOZ5t8FvjeRHFa75I1y8NDu/P1odoVXmQhXQB5XABfVDG1rs380g1UnwtI0+5NBi+kKFOK2XhS+Q==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/resource-timeline/-/resource-timeline-6.1.13.tgz", + "integrity": "sha512-ASCLiiuJIgViaoUGPxdK1eI2gNo8AwXSnuwZUpGYMPlHPgqYhm5PwGKvZX8pZfhWa9FFIHWr5cDEMyv5UwJxfQ==", "requires": { - "@fullcalendar/premium-common": "~6.1.12", - "@fullcalendar/scrollgrid": "~6.1.12", - "@fullcalendar/timeline": "~6.1.12" + "@fullcalendar/premium-common": "~6.1.13", + "@fullcalendar/scrollgrid": "~6.1.13", + "@fullcalendar/timeline": "~6.1.13" } }, "@fullcalendar/scrollgrid": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/scrollgrid/-/scrollgrid-6.1.12.tgz", - "integrity": "sha512-HQ5LpRU9fjKZbGEUbHuVdn37R9CCZe2PVJ3RoTvsYaFUC7eeXLAfizvjvuCl6NOUO+nrqRXZC83lFmf7nhNx6g==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/scrollgrid/-/scrollgrid-6.1.13.tgz", + "integrity": "sha512-gIsEGkOfLPMAqclYiZeSyzWxUM+mzlWCFqv1SnJRN6bsO5Lx3hibqWDJDDYgpTFHwjIQKNKGhuxN89lXsi/P9g==", "requires": { - "@fullcalendar/premium-common": "~6.1.12" + "@fullcalendar/premium-common": "~6.1.13" } }, "@fullcalendar/timegrid": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-6.1.12.tgz", - "integrity": "sha512-A7lvPpYCHFGntV2+ZYgSAaOTJ3VbRzTkoUIS+WBhTQ5asgAjieREGvhvnMet1AMdhBPgM/4g0qXeUlqSglT9Xw==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-6.1.13.tgz", + "integrity": "sha512-8Ub2mSV+6Mh8WWDKuyCYbj5PKYpmyjSctpJ/21fDBJduE9QFS0WfG9CZZxSJT7CT+srnyk4mX2/5gYN9gYZjUg==", "requires": { - "@fullcalendar/daygrid": "~6.1.12" + "@fullcalendar/daygrid": "~6.1.13" } }, "@fullcalendar/timeline": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/@fullcalendar/timeline/-/timeline-6.1.12.tgz", - "integrity": "sha512-+9EepXep8VCWNhYobrvE44J/Gj9+vKjfJ7M6miTHAaoouC2od+LihmWxvybk2Gtem84yrasjSq90HHBXHePaSw==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/@fullcalendar/timeline/-/timeline-6.1.13.tgz", + "integrity": "sha512-5lqjZYE1Mu+2xHb1Y9J/E8BlyHsu0FeGzPQoyL3L6rqTwttxv1Dpxy28teWr8KN9NpCGKYQCMFzbADo6DEgHeA==", "requires": { - "@fullcalendar/premium-common": "~6.1.12", - "@fullcalendar/scrollgrid": "~6.1.12" + "@fullcalendar/premium-common": "~6.1.13", + "@fullcalendar/scrollgrid": "~6.1.13" } }, "@github/auto-check-element": { @@ -25067,18 +24678,18 @@ } }, "@html-eslint/eslint-plugin": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.15.0.tgz", - "integrity": "sha512-6DUb2ZN1PUlzlNzNj4aBhoObBp3Kl/+YbZ6CnkgFAsQSW0tSFAu7p8WwESkz9RZLZZN9gCUlcaYKJnQjTkmnDA==", + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.24.1.tgz", + "integrity": "sha512-JwNDQBrNIWEPcxgSpla/2jaUXyQCqL7Xp8CmON4Bk5qg8MwiDLXOgjylfVC+tN52i8JeHWMca34I9DqBGRj9Qg==", "dev": true }, "@html-eslint/parser": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.15.0.tgz", - "integrity": "sha512-fA+HQtWnODhOIK6j1p4XWqltINx7hM0WNNTM2RvlH/2glzeRDCcYq3vEmeQhnytvGocidu4ofTzNk80cLnnyiw==", + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.24.1.tgz", + "integrity": "sha512-O13xX/+Ldh0P7VZMpDDYc3XtWiE1cYm5QhVJ0VB5i7D8Q69HrrGN+5BjS17vkCoLTz+3zWWIiJv4oFmyS5LReA==", "dev": true, "requires": { - "es-html-parser": "^0.0.8" + "es-html-parser": "^0.0.9" } }, "@humanwhocodes/config-array": { @@ -26932,83 +26543,6 @@ } } }, - "@typescript-eslint/utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", - "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "semver": "^7.5.4" - }, - "dependencies": { - "@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" - } - }, - "@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, "@typescript-eslint/visitor-keys": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", @@ -29870,9 +29404,9 @@ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" }, "es-html-parser": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/es-html-parser/-/es-html-parser-0.0.8.tgz", - "integrity": "sha512-kjMH23xhvTBw/7Ve1Dtb/7yZdFajfvwOpdsgRHmnyt8yvTsDJnkFjUgEEaMZFW+e1OhN/eoZrvF9wehq+waTGg==", + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/es-html-parser/-/es-html-parser-0.0.9.tgz", + "integrity": "sha512-oniQMi+466VFsDzcdron9Ry/sqUJpDJg1bbDn0jFJKDdxXhwIOYDr4DgBnO5/yPLGj2xv+n5yy4L1Q0vAC5TYQ==", "dev": true }, "es-iterator-helpers": { From 5b97575ea13ac5292b7116f268d59f3a1d98d841 Mon Sep 17 00:00:00 2001 From: Klaus Zanders <k.zanders@openproject.com> Date: Thu, 23 May 2024 10:01:25 +0200 Subject: [PATCH 14/40] Add info and link to advisory to CVE-2024-135224 to the release notes --- docs/release-notes/13-4-2/README.md | 9 +++++++++ docs/release-notes/14-0-2/README.md | 9 +++++++++ docs/release-notes/14-1-0/README.md | 11 +++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/13-4-2/README.md b/docs/release-notes/13-4-2/README.md index 76c0abbb5f08..88df45010dea 100644 --- a/docs/release-notes/13-4-2/README.md +++ b/docs/release-notes/13-4-2/README.md @@ -13,6 +13,11 @@ Release date: 2024-05-22 We released [OpenProject 13.4.2](https://community.openproject.org/versions/2058). The release contains several bug fixes and we recommend updating to the newest version. +### Fixes a stored XSS vulnerability in the cost report functionality (CVE-2024-135224) +OpenProject Cost Report functionality uses improper sanitization of user input. This can lead to Stored XSS via the header values of the report table. This attack requires the permissions "Edit work packages" as well as "Add attachments". + +For more information, [please see our security advisory](https://github.com/opf/openproject/security/advisories/GHSA-h26c-j8wg-frjc). + <!--more--> ## Bug fixes and changes @@ -24,3 +29,7 @@ The release contains several bug fixes and we recommend updating to the newest v <!-- END AUTOMATED SECTION --> <!-- Warning: Anything above this line will be automatically removed by the release script --> + +## Credits + +Thanks for finding and disclosing the vulnerability responsibly go to [Sean Marpo](https://github.com/seanmarpo). Thank you for reaching out to us and helping in identifying this issue. diff --git a/docs/release-notes/14-0-2/README.md b/docs/release-notes/14-0-2/README.md index 6af8ec2770f9..b52b3ffaac1b 100644 --- a/docs/release-notes/14-0-2/README.md +++ b/docs/release-notes/14-0-2/README.md @@ -13,6 +13,11 @@ Release date: 2024-05-22 We released [OpenProject 14.0.2](https://community.openproject.org/versions/2057). The release contains several bug fixes and we recommend updating to the newest version. +### Fixes a stored XSS vulnerability in the cost report functionality (CVE-2024-135224) +OpenProject Cost Report functionality uses improper sanitization of user input. This can lead to Stored XSS via the header values of the report table. This attack requires the permissions "Edit work packages" as well as "Add attachments". + +For more information, [please see our security advisory](https://github.com/opf/openproject/security/advisories/GHSA-h26c-j8wg-frjc). + <!--more--> ## Bug fixes and changes @@ -24,3 +29,7 @@ The release contains several bug fixes and we recommend updating to the newest v <!-- END AUTOMATED SECTION --> <!-- Warning: Anything above this line will be automatically removed by the release script --> + +## Credits + +Thanks for finding and disclosing the vulnerability responsibly go to [Sean Marpo](https://github.com/seanmarpo). Thank you for reaching out to us and helping in identifying this issue. diff --git a/docs/release-notes/14-1-0/README.md b/docs/release-notes/14-1-0/README.md index 5ea8225b3112..bdf0efbd9643 100644 --- a/docs/release-notes/14-1-0/README.md +++ b/docs/release-notes/14-1-0/README.md @@ -14,7 +14,12 @@ We released [OpenProject 14.1.0](https://community.openproject.org/versions/2030 ## Important updates and breaking changes -### Deprecation of Univention app center packages +### Fixes a stored XSS vulnerability in the cost report functionality (CVE-2024-135224) +OpenProject Cost Report functionality uses improper sanitization of user input. This can lead to Stored XSS via the header values of the report table. This attack requires the permissions "Edit work packages" as well as "Add attachments". + +For more information, [please see our security advisory](https://github.com/opf/openproject/security/advisories/GHSA-h26c-j8wg-frjc). + +### Deprecation of Univention app center packages We unfortunately can no longer provide the OpenProject app for the Univention app center due to incompatibility of their PostgreSQL version in app center 5.0. They have announced that a newer PostgreSQL version will be available in a newer version of the app center. This means that we are unable to provide new versions of OpenProject in the Univention app center. The last version available in the app center is OpenProject 13.4.1. @@ -72,7 +77,7 @@ Read more about [dynamic meetings in OpenProject](../../user-guide/meetings/dyna ### Possibility to hide attachments in the Files tab -Admins now are able to hide the attachment section in the Files tab. This setting can be changed both at an instance and project levels and is particularly useful for projects where users should only upload files via external storage, e.g. Nextcloud. +Admins now are able to hide the attachment section in the Files tab. This setting can be changed both at an instance and project levels and is particularly useful for projects where users should only upload files via external storage, e.g. Nextcloud. To make this possible Attachment and Files Storages settings were moved together under **Files** section, both in the [instance administration](../../system-admin-guide/files/attachments/) and under [project settings](../../user-guide/projects/project-settings/files/). @@ -180,6 +185,8 @@ A very special thank you goes to our sponsors for features and improvements of t Also a big thanks to our Community members for reporting bugs and helping us identify and provide fixes. Special thanks for reporting and finding bugs go to Marc Burk, Silas Kropf, and Hanley Loller. +Also thanks for finding and responsibly disclosing the CVE-2024-135224 vulnerability go to [Sean Marpo](https://github.com/seanmarpo). Thank you for reaching out to us and helping in identifying this issue. + Last but not least, we are very grateful for our very engaged translation contributors on Crowdin, who translated quite a few OpenProject strings! This release we would like to highlight user [Syvert](https://crowdin.com/profile/syvert) who has done an outstanding number of translations for the Norwegian language in recent weeks. From 1a0ba2506e6f89abe404f90e85b727cf92523292 Mon Sep 17 00:00:00 2001 From: Ivan Kuchin <i.kuchin@openproject.com> Date: Wed, 22 May 2024 18:36:38 +0200 Subject: [PATCH 15/40] don't allow renaming modified project list and modifying the list while renaming --- app/components/filters_component.html.erb | 1 + app/components/filters_component.rb | 1 + .../index_page_header_component.html.erb | 2 +- .../projects/index_page_header_component.rb | 6 ++-- .../projects/queries_controller.rb | 8 +++--- app/views/projects/index.html.erb | 28 +++++++++++-------- config/routes.rb | 6 +++- .../projects/queries_controller_spec.rb | 10 +++---- .../features/projects/persisted_lists_spec.rb | 12 +++++++- spec/support/pages/projects/index.rb | 16 +++++------ 10 files changed, 53 insertions(+), 37 deletions(-) diff --git a/app/components/filters_component.html.erb b/app/components/filters_component.html.erb index 084613d8785d..58b2547b1357 100644 --- a/app/components/filters_component.html.erb +++ b/app/components/filters_component.html.erb @@ -6,6 +6,7 @@ <div class="op-filters-header"> <%= render(Primer::Beta::Button.new( scheme: :secondary, + disabled:, data: { 'filters-target': 'filterFormToggle', 'action': 'filters#toggleDisplayFilters', 'test-selector': 'filter-component-toggle' })) do %> diff --git a/app/components/filters_component.rb b/app/components/filters_component.rb index c35e9a3c5a2f..c4e4404cb8a2 100644 --- a/app/components/filters_component.rb +++ b/app/components/filters_component.rb @@ -30,6 +30,7 @@ class FiltersComponent < ApplicationComponent options :query + options :disabled options output_format: "params" renders_many :buttons, lambda { |**system_arguments| diff --git a/app/components/projects/index_page_header_component.html.erb b/app/components/projects/index_page_header_component.html.erb index b1a4364777aa..88189b02fea8 100644 --- a/app/components/projects/index_page_header_component.html.erb +++ b/app/components/projects/index_page_header_component.html.erb @@ -32,7 +32,7 @@ if can_rename? menu.with_item( label: t('button_rename'), - href: edit_projects_query_path(query), + href: rename_projects_query_path(query), ) do |item| item.with_leading_visual_icon(icon: :pencil) end diff --git a/app/components/projects/index_page_header_component.rb b/app/components/projects/index_page_header_component.rb index 64fbe7a62507..fc7f6939bef6 100644 --- a/app/components/projects/index_page_header_component.rb +++ b/app/components/projects/index_page_header_component.rb @@ -37,9 +37,7 @@ class Projects::IndexPageHeaderComponent < ApplicationComponent :state, :params - STATE_DEFAULT = :show - STATE_EDIT = :edit - STATE_OPTIONS = [STATE_DEFAULT, STATE_EDIT].freeze + STATE_OPTIONS = %i[show edit rename].freeze def initialize(current_user:, query:, params:, state: :show) super @@ -74,7 +72,7 @@ def can_save_as? = may_save_as? && query.changed? def can_save? = can_save_as? && query.persisted? && query.user == current_user - def can_rename? = may_save_as? && query.persisted? && query.user == current_user + def can_rename? = may_save_as? && query.persisted? && query.user == current_user && !query.changed? def show_state? state == :show diff --git a/app/controllers/projects/queries_controller.rb b/app/controllers/projects/queries_controller.rb index dc0597067fd1..273733778fe8 100644 --- a/app/controllers/projects/queries_controller.rb +++ b/app/controllers/projects/queries_controller.rb @@ -31,10 +31,10 @@ class Projects::QueriesController < ApplicationController # No need for a more specific authorization check. That is carried out in the contracts. before_action :require_login - before_action :find_query, only: %i[edit update destroy] + before_action :find_query, only: %i[rename update destroy] before_action :build_query_or_deny_access, only: %i[new create] - current_menu_item [:new, :edit, :create, :update] do + current_menu_item [:new, :rename, :create, :update] do :projects end @@ -44,10 +44,10 @@ def new locals: { query: @query, state: :edit } end - def edit + def rename render template: "/projects/index", layout: "global", - locals: { query: @query, state: :edit } + locals: { query: @query, state: :rename } end def create diff --git a/app/views/projects/index.html.erb b/app/views/projects/index.html.erb index 41fc41610cb3..37faffb8beec 100644 --- a/app/views/projects/index.html.erb +++ b/app/views/projects/index.html.erb @@ -39,20 +39,24 @@ See COPYRIGHT and LICENSE files for more details. ) %> - <%= render(Projects::ProjectsFiltersComponent.new(query:)) do |component| - if current_user.allowed_globally?(:add_project) - component.with_button( - tag: :a, - href: new_project_path, - scheme: :primary, - size: :medium, - aria: { label: I18n.t(:label_project_new) }, - data: { 'test-selector': 'project-new-button' }) do |button| - button.with_leading_visual_icon(icon: :plus) - Project.model_name.human + <%= + disable_extra_controls = state == :rename + + render(Projects::ProjectsFiltersComponent.new(query:, disabled: disable_extra_controls)) do |component| + if current_user.allowed_globally?(:add_project) + component.with_button( + tag: :a, + href: new_project_path, + scheme: :primary, + disabled: disable_extra_controls, + size: :medium, + aria: { label: I18n.t(:label_project_new) }, + data: { 'test-selector': 'project-new-button' }) do |button| + button.with_leading_visual_icon(icon: :plus) + Project.model_name.human + end end end - end %> diff --git a/config/routes.rb b/config/routes.rb index 264b799aa8da..7fda512c194f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -181,7 +181,11 @@ namespace :projects do resource :menu, only: %i[show] - resources :queries, only: %i[new edit create update destroy] + resources :queries, only: %i[new create update destroy] do + member do + get :rename + end + end end resources :projects, except: %i[show edit create update] do diff --git a/spec/controllers/projects/queries_controller_spec.rb b/spec/controllers/projects/queries_controller_spec.rb index c22cd39e6a6d..83f1314bb148 100644 --- a/spec/controllers/projects/queries_controller_spec.rb +++ b/spec/controllers/projects/queries_controller_spec.rb @@ -67,9 +67,9 @@ end end - describe "#edit" do + describe "#rename" do it "requires login" do - get "edit", params: { id: 42 } + get "rename", params: { id: 42 } expect(response).not_to be_successful end @@ -85,7 +85,7 @@ end it "renders projects/index" do - get "edit", params: { id: 42 } + get "rename", params: { id: 42 } expect(response).to render_template("projects/index") end @@ -93,9 +93,9 @@ it "passes variables to template" do allow(controller).to receive(:render).and_call_original - get "edit", params: { id: 42 } + get "rename", params: { id: 42 } - expect(controller).to have_received(:render).with(include(locals: { query:, state: :edit })) + expect(controller).to have_received(:render).with(include(locals: { query:, state: :rename })) end end end diff --git a/spec/features/projects/persisted_lists_spec.rb b/spec/features/projects/persisted_lists_spec.rb index 67e66e4bae66..1c55c07f3e8f 100644 --- a/spec/features/projects/persisted_lists_spec.rb +++ b/spec/features/projects/persisted_lists_spec.rb @@ -333,12 +333,22 @@ it "allows renaming persisted query" do projects_page.set_sidebar_filter("Persisted query") - projects_page.rename_to("My renamed query") + + projects_page.click_more_menu_item("Rename") + projects_page.fill_in_the_name("My renamed query") + # Can't open filter changing interface + expect(projects_page.filters_toggle).to be_disabled + projects_page.click_on "Save" projects_page.expect_no_sidebar_filter("Persisted query") projects_page.expect_sidebar_filter("My renamed query", selected: true) projects_page.expect_columns("Name") projects_page.expect_no_columns("Status", "Public") + + projects_page.open_filters + projects_page.filter_by_membership("yes") + # Rename menu item is now shown after applying filters + projects_page.expect_no_menu_item("Rename", visible: false) end it "allows deleting persisted query" do diff --git a/spec/support/pages/projects/index.rb b/spec/support/pages/projects/index.rb index e25c5dc39f9d..2d5fab6566f4 100644 --- a/spec/support/pages/projects/index.rb +++ b/spec/support/pages/projects/index.rb @@ -262,8 +262,12 @@ def open_filters end end + def filters_toggle + page.find('[data-test-selector="filter-component-toggle"]') + end + def toggle_filters_section - page.find('[data-test-selector="filter-component-toggle"]').click + filters_toggle.click end def set_columns(*columns) @@ -329,21 +333,15 @@ def save_query def save_query_as(name) click_more_menu_item("Save as") - within '[data-test-selector="project-query-name"]' do - fill_in "Name", with: name - end + fill_in_the_name(name) click_on "Save" end - def rename_to(name) - click_more_menu_item("Rename") - + def fill_in_the_name(name) within '[data-test-selector="project-query-name"]' do fill_in "Name", with: name end - - click_on "Save" end def delete_query From 3422e511c51621edc561bb0eba41db48f41e8f53 Mon Sep 17 00:00:00 2001 From: Henriette Darge <h.darge@openproject.com> Date: Thu, 23 May 2024 14:06:44 +0200 Subject: [PATCH 16/40] Bump primer_view_components to 0.31.0 --- Gemfile | 2 +- Gemfile.lock | 4 ++-- frontend/package-lock.json | 28 ++++++++++++++-------------- frontend/package.json | 4 ++-- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Gemfile b/Gemfile index 113870d84a9c..6e9d99dfc517 100644 --- a/Gemfile +++ b/Gemfile @@ -386,4 +386,4 @@ end gem "openproject-octicons", "~>19.12.0" gem "openproject-octicons_helper", "~>19.12.0" -gem "openproject-primer_view_components", "~>0.30.1" +gem "openproject-primer_view_components", "~>0.31.0" diff --git a/Gemfile.lock b/Gemfile.lock index 116e55cb78d8..8cc173a91c41 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -772,7 +772,7 @@ GEM actionview openproject-octicons (= 19.12.0) railties - openproject-primer_view_components (0.30.1) + openproject-primer_view_components (0.31.0) actionview (>= 5.0.0) activesupport (>= 5.0.0) openproject-octicons (>= 19.12.0) @@ -1269,7 +1269,7 @@ DEPENDENCIES openproject-octicons (~> 19.12.0) openproject-octicons_helper (~> 19.12.0) openproject-openid_connect! - openproject-primer_view_components (~> 0.30.1) + openproject-primer_view_components (~> 0.31.0) openproject-recaptcha! openproject-reporting! openproject-storages! diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 7a345564da37..b6b02f735a5a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -47,7 +47,7 @@ "@ngneat/content-loader": "^7.0.0", "@ngx-formly/core": "^6.1.4", "@openproject/octicons-angular": "^19.12.0", - "@openproject/primer-view-components": "^0.30.1", + "@openproject/primer-view-components": "^0.31.0", "@openproject/reactivestates": "^3.0.1", "@primer/css": "^21.2.2", "@types/hotwired__turbo": "^8.0.1", @@ -4787,9 +4787,9 @@ } }, "node_modules/@openproject/primer-view-components": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.30.1.tgz", - "integrity": "sha512-R2uFNo2hiIo6KDPWCHek/o8p8FCbYvneVapkYbQmuZiHqdlvSOu9+LVyBJq09v+5ZgxhwGjtzGFlknWM3XgTvg==", + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.31.0.tgz", + "integrity": "sha512-D7+epCa/gAxQxMqK+Q8JUbArYFhac2Cop5TtyPU9Va5OrXJ2yzWa0PN1gJG1ovpKc8MaHM72E67s8UcxJS0g+w==", "dependencies": { "@github/auto-check-element": "^5.2.0", "@github/auto-complete-element": "^3.6.2", @@ -4854,9 +4854,9 @@ }, "node_modules/@primer/view-components": { "name": "@openproject/primer-view-components", - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.30.1.tgz", - "integrity": "sha512-R2uFNo2hiIo6KDPWCHek/o8p8FCbYvneVapkYbQmuZiHqdlvSOu9+LVyBJq09v+5ZgxhwGjtzGFlknWM3XgTvg==", + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.31.0.tgz", + "integrity": "sha512-D7+epCa/gAxQxMqK+Q8JUbArYFhac2Cop5TtyPU9Va5OrXJ2yzWa0PN1gJG1ovpKc8MaHM72E67s8UcxJS0g+w==", "dependencies": { "@github/auto-check-element": "^5.2.0", "@github/auto-complete-element": "^3.6.2", @@ -25550,9 +25550,9 @@ } }, "@openproject/primer-view-components": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.30.1.tgz", - "integrity": "sha512-R2uFNo2hiIo6KDPWCHek/o8p8FCbYvneVapkYbQmuZiHqdlvSOu9+LVyBJq09v+5ZgxhwGjtzGFlknWM3XgTvg==", + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.31.0.tgz", + "integrity": "sha512-D7+epCa/gAxQxMqK+Q8JUbArYFhac2Cop5TtyPU9Va5OrXJ2yzWa0PN1gJG1ovpKc8MaHM72E67s8UcxJS0g+w==", "requires": { "@github/auto-check-element": "^5.2.0", "@github/auto-complete-element": "^3.6.2", @@ -25598,7 +25598,7 @@ "integrity": "sha512-vQoTeu7yfL/1Njg372lN6xqIsiPl0QgoIrkDjJ+TpDkeIznXFc+jLdu+5VUVi+bzyKHwv/gd42hhlLA2K5oD6w==", "requires": { "@primer/primitives": "^7.15.12", - "@primer/view-components": "npm:@openproject/primer-view-components@^0.30.1" + "@primer/view-components": "npm:@openproject/primer-view-components@^0.31.0" } }, "@primer/primitives": { @@ -25607,9 +25607,9 @@ "integrity": "sha512-ujAsbRB5Xw6rrxizbTgv1bxpraZ091stPMsO6pqGxzc+zIyhrojpGVBuCKJ+RYkpbKK7T4bZzgOT/KyWBAFwwg==" }, "@primer/view-components": { - "version": "npm:@openproject/primer-view-components@0.30.1", - "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.30.1.tgz", - "integrity": "sha512-R2uFNo2hiIo6KDPWCHek/o8p8FCbYvneVapkYbQmuZiHqdlvSOu9+LVyBJq09v+5ZgxhwGjtzGFlknWM3XgTvg==", + "version": "npm:@openproject/primer-view-components@0.31.0", + "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.31.0.tgz", + "integrity": "sha512-D7+epCa/gAxQxMqK+Q8JUbArYFhac2Cop5TtyPU9Va5OrXJ2yzWa0PN1gJG1ovpKc8MaHM72E67s8UcxJS0g+w==", "requires": { "@github/auto-check-element": "^5.2.0", "@github/auto-complete-element": "^3.6.2", diff --git a/frontend/package.json b/frontend/package.json index eeb3090ffaae..d0b6522834aa 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -98,7 +98,7 @@ "@ngneat/content-loader": "^7.0.0", "@ngx-formly/core": "^6.1.4", "@openproject/octicons-angular": "^19.12.0", - "@openproject/primer-view-components": "^0.30.1", + "@openproject/primer-view-components": "^0.31.0", "@openproject/reactivestates": "^3.0.1", "@primer/css": "^21.2.2", "@types/hotwired__turbo": "^8.0.1", @@ -177,6 +177,6 @@ "generate-typings": "tsc -d -p src/tsconfig.app.json" }, "overrides": { - "@primer/view-components": "npm:@openproject/primer-view-components@^0.30.1" + "@primer/view-components": "npm:@openproject/primer-view-components@^0.31.0" } } From 3798b41392f3aaf5b1858f50e2ad2efd9e09395d Mon Sep 17 00:00:00 2001 From: Klaus Zanders <k.zanders@openproject.com> Date: Thu, 23 May 2024 15:20:28 +0200 Subject: [PATCH 17/40] Fix ContentSecurityPolicy for lookbook --- config/initializers/lookbook.rb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/config/initializers/lookbook.rb b/config/initializers/lookbook.rb index bfd03771fe86..4530a141d582 100644 --- a/config/initializers/lookbook.rb +++ b/config/initializers/lookbook.rb @@ -18,14 +18,17 @@ ] # Show pages first, then previews - config.lookbook.preview_inspector.sidebar_panels = [:pages, :previews] + config.lookbook.preview_inspector.sidebar_panels = %i[pages previews] # Show notes first, all other panels next config.lookbook.preview_inspector.drawer_panels = [:notes, "*"] config.lookbook.ui_theme = "blue" SecureHeaders::Configuration.named_append(:lookbook) do { - script_src: %w('unsafe-eval' 'unsafe-inline') # rubocop:disable Lint/PercentStringArray + script_src: %w('unsafe-eval' 'unsafe-inline' 'self'), # rubocop:disable Lint/PercentStringArray + script_src_elem: %w('unsafe-eval' 'unsafe-inline' 'self'), # rubocop:disable Lint/PercentStringArray + style_src: %w('self' 'unsafe-inline'), # rubocop:disable Lint/PercentStringArray + style_src_attr: %w('self' 'unsafe-inline') # rubocop:disable Lint/PercentStringArray } end From 064cfd6ff915b2dc07f8a36999559f54c4a0305c Mon Sep 17 00:00:00 2001 From: Eric Schubert <e.schubert@openproject.com> Date: Thu, 23 May 2024 15:38:06 +0200 Subject: [PATCH 18/40] [#55158] Add complete attribute to storage representer - https://community.openproject.org/work_packages/55158 - fix API to be able to create one drive storages - fix API to show tenant id and drive id --- ...torage-nextcloud-response-for-creation.yml | 55 +++++ .../examples/storage-nextcloud-response.yml | 86 +++++++ ...torage-nextcloud-unauthorized-response.yml | 70 ++++++ .../storage-one-drive-incomplete-response.yml | 28 +++ .../examples/storage-one-drive-response.yml | 50 ++++ .../schemas/oauth_application_read_model.yml | 18 +- .../components/schemas/storage_read_model.yml | 53 ++--- docs/api/apiv3/openapi-spec.yml | 10 + docs/api/apiv3/paths/storage.yml | 11 + .../oauth/oauth_applications_representer.rb | 6 +- .../api/v3/storages/storage_representer.rb | 26 +- .../spec/factories/storage_factory.rb | 1 + .../storages_representer_parsing_spec.rb | 38 ++- .../storages_representer_rendering_spec.rb | 224 ++++++++++-------- 14 files changed, 515 insertions(+), 161 deletions(-) create mode 100644 docs/api/apiv3/components/examples/storage-nextcloud-response-for-creation.yml create mode 100644 docs/api/apiv3/components/examples/storage-nextcloud-response.yml create mode 100644 docs/api/apiv3/components/examples/storage-nextcloud-unauthorized-response.yml create mode 100644 docs/api/apiv3/components/examples/storage-one-drive-incomplete-response.yml create mode 100644 docs/api/apiv3/components/examples/storage-one-drive-response.yml diff --git a/docs/api/apiv3/components/examples/storage-nextcloud-response-for-creation.yml b/docs/api/apiv3/components/examples/storage-nextcloud-response-for-creation.yml new file mode 100644 index 000000000000..929a62a2fb8c --- /dev/null +++ b/docs/api/apiv3/components/examples/storage-nextcloud-response-for-creation.yml @@ -0,0 +1,55 @@ +# Example: Nextcloud storage on creation (includes client secret) +--- +value: + _type: Storage + id: 1337 + name: My New DeathStar + hasApplicationPassword: false + createdAt: '2024-05-21T09:11:53.880Z' + updatedAt: '2024-05-21T09:11:53.880Z' + complete: false + _embedded: + oauthApplication: + id: 42 + _type: OAuthApplication + name: My New DeathStar (Nextcloud) + clientId: gNQ-gi3VX59ruoft5B9aRmukEYbZOhKIsxXE9iT1tcQ + confidential: true + clientSecret: 79hIlb1Ezj5kPx8LgE6LI9L1-mb8g7jX1-u_a08RJlI + createdAt: '2024-05-21T09:11:53.908Z' + updatedAt: '2024-05-21T09:11:53.908Z' + scopes: + - api_v3 + _links: + self: + href: '/api/v3/oauth_applications/42' + owner: + href: '/api/v3/users/13' + title: Darth Vader + integration: + href: '/api/v3/storages/1337' + title: My New DeathStar + redirectUri: + - href: 'https://nextcloud.deathstar.rocks/index.php/apps/integration_openproject/oauth-redirect' + _links: + self: + href: /api/v3/storages/1337 + title: My New DeathStar + type: + href: urn:openproject-org:api:v3:storages:Nextcloud + title: Nextcloud + origin: + href: https://nextcloud.deathstar.rocks/ + open: + href: /api/v3/storages/1337/open + prepareUpload: [] + authorizationState: + href: urn:openproject-org:api:v3:storages:authorization:FailedAuthorization + title: Authorization failed + projectStrages: + href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1337"]}}] + oauthApplication: + href: /api/v3/oauth_application/42 + title: My New DeathStar (Nextcloud) + oauthClientCredentials: + href: null diff --git a/docs/api/apiv3/components/examples/storage-nextcloud-response.yml b/docs/api/apiv3/components/examples/storage-nextcloud-response.yml new file mode 100644 index 000000000000..8cc42f3bfa84 --- /dev/null +++ b/docs/api/apiv3/components/examples/storage-nextcloud-response.yml @@ -0,0 +1,86 @@ +# Example: Nextcloud storage +--- +value: + _type: Storage + id: 1337 + name: It's no moon + hasApplicationPassword: true + createdAt: '2021-12-20T13:37:00.211Z' + updatedAt: '2021-12-20T13:37:00.211Z' + complete: true + _embedded: + oauthApplication: + id: 42 + _type: OAuthApplication + name: It's no moon (Nextcloud) + clientId: O5h6WObhMg1Z8IcLHRE3_LMh4jJYmmca2V6OTFSv8DA + confidential: true + createdAt: '2022-12-07T12:56:42.626Z' + updatedAt: '2022-12-07T12:56:42.626Z' + scopes: + - api_v3 + _links: + self: + href: '/api/v3/oauth_applications/42' + owner: + href: '/api/v3/users/13' + title: Darth Vader + integration: + href: '/api/v3/storages/1337' + title: It's no moon + redirectUri: + - href: 'https://nextcloud.deathstar.rocks/index.php/apps/integration_openproject/oauth-redirect' + oauthClientCredentials: + _type: OAuthClientCredentials + id: 42 + clientId: fGEFWxIpROrpci25TW6qWCZozDFEAKSkonMBkrf3LYvBXRljBbLajBf2vD2fjePm + confidential: true + createdAt: '2023-12-08T09:49:24.397Z' + updatedAt: '2023-12-08T09:49:24.397Z' + _links: + self: + href: /api/v3/oauth_client_credentials/42 + integration: + href: /api/v3/storages/1337 + title: It's no moon + _links: + self: + href: /api/v3/storages/1337 + title: It's no moon + type: + href: urn:openproject-org:api:v3:storages:Nextcloud + title: Nextcloud + origin: + href: https://nextcloud.deathstar.rocks/ + prepareUpload: + - href: /api/v3/storages/1337/files/prepare_upload + method: post + title: Upload file + payload: + projectId: 21 + fileName: '{fileName}' + parent: '{parent}' + templated: true + - href: /api/v3/storages/95/files/prepare_upload + method: post + title: Upload file + payload: + projectId: 11 + fileName: '{fileName}' + parent: '{parent}' + templated: true + open: + href: /api/v3/storages/1337/open + authorizationState: + href: urn:openproject-org:api:v3:storages:authorization:Connected + title: Connected + # authorize: + # href: https://nextcloud.deathstar.rocks/authorize/ + # title: Authorize + projectStrages: + href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1337"]}}] + oauthApplication: + href: /api/v3/oauth_application/42 + title: It's no moon (Nextcloud) + oauthClientCredentials: + href: /api/v3/oauth_client_credentials/42 diff --git a/docs/api/apiv3/components/examples/storage-nextcloud-unauthorized-response.yml b/docs/api/apiv3/components/examples/storage-nextcloud-unauthorized-response.yml new file mode 100644 index 000000000000..6a9ad6b48188 --- /dev/null +++ b/docs/api/apiv3/components/examples/storage-nextcloud-unauthorized-response.yml @@ -0,0 +1,70 @@ +# Example: Nextcloud storage +--- +value: + _type: Storage + id: 1337 + name: It's no moon + hasApplicationPassword: false + createdAt: '2021-12-20T13:37:00.211Z' + updatedAt: '2021-12-20T13:37:00.211Z' + complete: true + _embedded: + oauthApplication: + id: 42 + _type: OAuthApplication + name: It's no moon (Nextcloud) + clientId: O5h6WObhMg1Z8IcLHRE3_LMh4jJYmmca2V6OTFSv8DA + confidential: true + createdAt: '2022-12-07T12:56:42.626Z' + updatedAt: '2022-12-07T12:56:42.626Z' + scopes: + - api_v3 + _links: + self: + href: '/api/v3/oauth_applications/42' + owner: + href: '/api/v3/users/13' + title: Darth Vader + integration: + href: '/api/v3/storages/1337' + title: It's no moon + redirectUri: + - href: 'https://nextcloud.deathstar.rocks/index.php/apps/integration_openproject/oauth-redirect' + oauthClientCredentials: + _type: OAuthClientCredentials + id: 42 + clientId: fGEFWxIpROrpci25TW6qWCZozDFEAKSkonMBkrf3LYvBXRljBbLajBf2vD2fjePm + confidential: true + createdAt: '2023-12-08T09:49:24.397Z' + updatedAt: '2023-12-08T09:49:24.397Z' + _links: + self: + href: /api/v3/oauth_client_credentials/42 + integration: + href: /api/v3/storages/1337 + title: It's no moon + _links: + self: + href: /api/v3/storages/1337 + title: It's no moon + type: + href: urn:openproject-org:api:v3:storages:Nextcloud + title: Nextcloud + origin: + href: https://nextcloud.deathstar.rocks/ + prepareUpload: [] + open: + href: /api/v3/storages/1337/open + authorizationState: + href: urn:openproject-org:api:v3:storages:authorization:FailedAuthorization + title: Authorization failed + authorize: + href: https://nextcloud25.local/index.php/apps/oauth2/authorize?client_id=fnrIeJZqqAKGQlejuDaGhSQfCAVtoayHLACWCYcPJ0w17Pp6daPPUktkM9QaGxca&redirect_uri=https://openproject.local/oauth_clients/fnrIeJZqqAKGQlejuDaGhSQfCAVtoayHLACWCYcPJ0w17Pp6daPPUktkM9QaGxca/callback&response_type=code + title: Authorize + projectStrages: + href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1337"]}}] + oauthApplication: + href: /api/v3/oauth_application/42 + title: It's no moon (Nextcloud) + oauthClientCredentials: + href: /api/v3/oauth_client_credentials/42 diff --git a/docs/api/apiv3/components/examples/storage-one-drive-incomplete-response.yml b/docs/api/apiv3/components/examples/storage-one-drive-incomplete-response.yml new file mode 100644 index 000000000000..e5b638754915 --- /dev/null +++ b/docs/api/apiv3/components/examples/storage-one-drive-incomplete-response.yml @@ -0,0 +1,28 @@ +# Example: OneDrive storage +--- +value: + _type: Storage + id: 1337 + name: It's no moon + tenantId: e36f1dbc-fdae-427e-b61b-0d96ddfb81a4 + driveId: null + createdAt: '2021-12-20T13:37:00.211Z' + updatedAt: '2021-12-20T13:37:00.211Z' + complete: true + _links: + self: + href: /api/v3/storages/1337 + title: It's no moon + type: + href: urn:openproject-org:api:v3:storages:OneDrive + title: OneDrive/SharePoint + prepareUpload: [] + open: + href: /api/v3/storages/1337/open + authorizationState: + href: urn:openproject-org:api:v3:storages:authorization:FailedAuthorization + title: Authorization failed + projectStrages: + href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1337"]}}] + oauthClientCredentials: + href: /api/v3/oauth_client_credentials/42 diff --git a/docs/api/apiv3/components/examples/storage-one-drive-response.yml b/docs/api/apiv3/components/examples/storage-one-drive-response.yml new file mode 100644 index 000000000000..2fa7543ff191 --- /dev/null +++ b/docs/api/apiv3/components/examples/storage-one-drive-response.yml @@ -0,0 +1,50 @@ +# Example: OneDrive storage +--- +value: + _type: Storage + id: 1337 + name: It's no moon + tenantId: e36f1dbc-fdae-427e-b61b-0d96ddfb81a4 + driveId: b!FeOZEMfQx0eGQKqVBLcP__BG8mq-4-9FuRqOyk3MXY8Qconfm2i6SKEoCmuGYqQK + createdAt: '2021-12-20T13:37:00.211Z' + updatedAt: '2021-12-20T13:37:00.211Z' + complete: true + _embedded: + oauthClientCredentials: + _type: OAuthClientCredentials + id: 42 + clientId: b8a5bb54-5fb2-4e0e-9427-9d24dbac32ff + confidential: true + createdAt: '2023-12-08T09:49:24.397Z' + updatedAt: '2023-12-08T09:49:24.397Z' + _links: + self: + href: /api/v3/oauth_client_credentials/42 + integration: + href: /api/v3/storages/1337 + title: It's no moon + _links: + self: + href: /api/v3/storages/1337 + title: It's no moon + type: + href: urn:openproject-org:api:v3:storages:OneDrive + title: OneDrive/SharePoint + prepareUpload: + - href: /api/v3/storages/1337/files/prepare_upload + method: post + title: Upload file + payload: + projectId: 33 + fileName: '{fileName}' + parent: '{parent}' + templated: true + open: + href: /api/v3/storages/1337/open + authorizationState: + href: urn:openproject-org:api:v3:storages:authorization:Connected + title: Connected + projectStrages: + href: /api/v3/project_storages?filters=[{"storageId":{"operator":"=","values":["1337"]}}] + oauthClientCredentials: + href: /api/v3/oauth_client_credentials/42 diff --git a/docs/api/apiv3/components/schemas/oauth_application_read_model.yml b/docs/api/apiv3/components/schemas/oauth_application_read_model.yml index 8a7b98d3f02e..bd63d4698146 100644 --- a/docs/api/apiv3/components/schemas/oauth_application_read_model.yml +++ b/docs/api/apiv3/components/schemas/oauth_application_read_model.yml @@ -71,16 +71,18 @@ properties: **Resource**: Storage redirectUri: - allOf: - - $ref: './link.yml' - - description: |- - The redirect URI of the OAuth application - - **Resource**: N/A + type: array + items: + allOf: + - $ref: './link.yml' + - description: |- + A redirect URI of the OAuth application + + **Resource**: N/A example: id: 1337 - _type: OauthClientCredentials + _type: OAuthApplication name: Vader's secure OAuth app clientId: O5h6WObhMg1Z8IcLHRE3_LMh4jJYmmca2V6OTFSv8DA confidential: true @@ -98,4 +100,4 @@ example: href: '/api/v3/storages/42' title: Death Star Cloud redirectUri: - href: 'https://death-star.cloud.tools/index.php/apps/integration_openproject/oauth-redirect' + - href: 'https://death-star.cloud.tools/index.php/apps/integration_openproject/oauth-redirect' diff --git a/docs/api/apiv3/components/schemas/storage_read_model.yml b/docs/api/apiv3/components/schemas/storage_read_model.yml index 4ebcfaf19a1a..80060d7f737b 100644 --- a/docs/api/apiv3/components/schemas/storage_read_model.yml +++ b/docs/api/apiv3/components/schemas/storage_read_model.yml @@ -17,12 +17,24 @@ properties: name: type: string description: Storage name + tenantId: + type: string + description: |- + The tenant id of a file storage of type OneDrive/SharePoint. + + Ignored if the provider type is not OneDrive/SharePoint. + driveId: + type: string + description: |- + The drive id of a file storage of type OneDrive/SharePoint. + + Ignored if the provider type is not OneDrive/SharePoint. hasApplicationPassword: type: boolean description: |- Whether the storage has the application password to use for the Nextcloud storage. - Ignored if the provider type is not Nextcloud + Ignored if the provider type is not Nextcloud. createdAt: type: string format: date-time @@ -31,11 +43,11 @@ properties: type: string format: date-time description: Time of the most recent change to the storage + complete: + type: boolean + description: Indication, if the storage is fully configured _embedded: type: object - required: - - oauthApplication - - oauthClientCredentials properties: oauthApplication: $ref: './oauth_application_read_model.yml' @@ -46,7 +58,6 @@ properties: required: - self - type - - origin - open - authorizationState properties: @@ -68,7 +79,8 @@ properties: allOf: - $ref: './link.yml' - description: |- - Web URI of the storage instance. + Web URI of the storage instance. This link is ignored, if the storage is hosted in a cloud and has no own + URL, like file storages of type OneDrive/SharePoint. **Resource**: N/A open: @@ -124,32 +136,3 @@ properties: - User has role `admin` **Resource**: OAuthClientCredentials -example: - id: 1337 - _type: Storage - name: It's no moon - hasApplicationPassword: true - createdAt: '2021-12-20T13:37:00.211Z' - updatedAt: '2021-12-20T13:37:00.211Z' - _links: - self: - href: /api/v3/storages/1337 - title: It's no moon - type: - href: urn:openproject-org:api:v3:storages:nextcloud - title: Nextcloud - origin: - href: https://nextcloud.deathstar.rocks/ - open: - href: https://nextcloud.deathstar.rocks/apps/files - authorizationState: - href: urn:openproject-org:api:v3:storages:authorization:FailedAuthorization - title: Failed Authorization - authorize: - href: https://nextcloud.deathstar.rocks/authorize/ - title: Authorize - oauthApplication: - href: /api/v3/oauth_application/42 - title: It's no moon (Nextcloud) - oauthClientCredentials: - href: /api/v3/oauth_client_credentials/42 diff --git a/docs/api/apiv3/openapi-spec.yml b/docs/api/apiv3/openapi-spec.yml index be010effa5c4..38b8112aea88 100644 --- a/docs/api/apiv3/openapi-spec.yml +++ b/docs/api/apiv3/openapi-spec.yml @@ -513,6 +513,16 @@ components: $ref: "./components/examples/project_body.yml" ProjectCollection: $ref: "./components/examples/project_collection.yml" + StorageNextcloudResponse: + $ref: "./components/examples/storage-nextcloud-response.yml" + StorageNextcloudResponseForCreation: + $ref: "./components/examples/storage-nextcloud-response-for-creation.yml" + StorageNextcloudUnauthorizedResponse: + $ref: "./components/examples/storage-nextcloud-unauthorized-response.yml" + StorageOneDriveIncompleteResponse: + $ref: "./components/examples/storage-one-drive-incomplete-response.yml" + StorageOneDriveResponse: + $ref: "./components/examples/storage-one-drive-response.yml" QueriesModel: $ref: "./components/examples/queries.yml" QueryModel: diff --git a/docs/api/apiv3/paths/storage.yml b/docs/api/apiv3/paths/storage.yml index 630565bc9f27..f93ccd7738ef 100644 --- a/docs/api/apiv3/paths/storage.yml +++ b/docs/api/apiv3/paths/storage.yml @@ -23,6 +23,17 @@ get: application/hal+json: schema: $ref: '../components/schemas/storage_read_model.yml' + examples: + 'Nextcloud storage': + $ref: '../components/examples/storage-nextcloud-response.yml' + 'Freshly created Nextcloud storage': + $ref: '../components/examples/storage-nextcloud-response-for-creation.yml' + 'OneDrive storage': + $ref: '../components/examples/storage-one-drive-response.yml' + 'Incomplete OneDrive storage': + $ref: '../components/examples/storage-one-drive-incomplete-response.yml' + 'Unauthorized Nextcloud storage': + $ref: '../components/examples/storage-nextcloud-unauthorized-response.yml' '404': content: application/hal+json: diff --git a/lib/api/v3/oauth/oauth_applications_representer.rb b/lib/api/v3/oauth/oauth_applications_representer.rb index 440984d241ac..6740d5269600 100644 --- a/lib/api/v3/oauth/oauth_applications_representer.rb +++ b/lib/api/v3/oauth/oauth_applications_representer.rb @@ -76,10 +76,8 @@ class OAuthApplicationsRepresenter < ::API::Decorators::Single } end - link :redirectUri do - { - href: represented.redirect_uri - } + links :redirectUri do + represented.redirect_uri.split(/[\r\n]+/).map { |href| { href: } } end def _type diff --git a/modules/storages/lib/api/v3/storages/storage_representer.rb b/modules/storages/lib/api/v3/storages/storage_representer.rb index 4dc51c9f8eba..728eb983d6ed 100644 --- a/modules/storages/lib/api/v3/storages/storage_representer.rb +++ b/modules/storages/lib/api/v3/storages/storage_representer.rb @@ -90,14 +90,28 @@ def link_without_resource(name, getter:, setter:) end } + property :tenant_id, + skip_render: ->(represented:, **) { !represented.provider_type_one_drive? }, + render_nil: true, + getter: ->(represented:, **) { represented.tenant_id if represented.provider_type_one_drive? }, + setter: ->(fragment:, represented:, **) { represented.tenant_id = fragment } + + property :drive_id, + skip_render: ->(represented:, **) { !represented.provider_type_one_drive? }, + render_nil: true, + getter: ->(represented:, **) { represented.drive_id if represented.provider_type_one_drive? }, + setter: ->(fragment:, represented:, **) { represented.drive_id = fragment } + + property :complete, + skip_parse: true, + getter: ->(represented:, **) { represented.configured? } + property :hasApplicationPassword, skip_parse: true, skip_render: ->(represented:, **) { !represented.provider_type_nextcloud? }, - getter: ->(represented:, **) { - break unless represented.provider_type_nextcloud? - - represented.automatic_management_enabled? - }, + getter: ->(represented:, **) do + represented.automatic_management_enabled? if represented.provider_type_nextcloud? + end, setter: ->(*) {} date_time_property :created_at @@ -120,7 +134,7 @@ def link_without_resource(name, getter:, setter:) } link_without_resource :origin, - getter: ->(*) { { href: represented.host } }, + getter: ->(*) { { href: represented.host } if represented.host.present? }, setter: ->(fragment:, **) { break if fragment["href"].blank? diff --git a/modules/storages/spec/factories/storage_factory.rb b/modules/storages/spec/factories/storage_factory.rb index eedac36bc0e0..fa71537c4e89 100644 --- a/modules/storages/spec/factories/storage_factory.rb +++ b/modules/storages/spec/factories/storage_factory.rb @@ -163,6 +163,7 @@ host { nil } tenant_id { SecureRandom.uuid } drive_id { SecureRandom.uuid } + automatically_managed { false } trait :as_automatically_managed do automatically_managed { true } diff --git a/modules/storages/spec/lib/api/v3/storages/storages_representer_parsing_spec.rb b/modules/storages/spec/lib/api/v3/storages/storages_representer_parsing_spec.rb index e4fe4281275b..96f947a634a5 100644 --- a/modules/storages/spec/lib/api/v3/storages/storages_representer_parsing_spec.rb +++ b/modules/storages/spec/lib/api/v3/storages/storages_representer_parsing_spec.rb @@ -32,14 +32,41 @@ require_module_spec_helper RSpec.describe API::V3::Storages::StorageRepresenter, "parsing" do - let(:storage) { build_stubbed(:nextcloud_storage) } let(:current_user) { build_stubbed(:user) } + let(:representer) { described_class.new(storage, current_user:) } - describe "parsing" do - subject(:parsed) { representer.from_hash parsed_hash } + subject(:parsed) { representer.from_hash parsed_hash } - let(:representer) { described_class.new(storage, current_user:) } + describe "OneDrive/SharePoint" do + let(:storage) { build_stubbed(:one_drive_storage) } + let(:parsed_hash) do + { + "name" => "My SharePoint", + "tenantId" => "e36f1dbc-fdae-427e-b61b-0d96ddfb81a4", + "_links" => { + "type" => { + "href" => API::V3::Storages::URN_STORAGE_TYPE_ONE_DRIVE + } + } + } + end + + context "with basic attributes" do + it "is parsed correctly" do + expect(parsed).to have_attributes(name: "My SharePoint", + tenant_id: "e36f1dbc-fdae-427e-b61b-0d96ddfb81a4", + provider_type: "Storages::OneDriveStorage") + + aggregate_failures "honors provider fields defaults" do + expect(parsed).not_to be_automatically_managed + expect(parsed).to be_health_notifications_enabled + end + end + end + end + describe "Nextcloud" do + let(:storage) { build_stubbed(:nextcloud_storage) } let(:parsed_hash) do { "name" => "Nextcloud Local", @@ -56,7 +83,8 @@ context "with basic attributes" do it "is parsed correctly" do - expect(parsed).to have_attributes(name: "Nextcloud Local", host: storage.host, + expect(parsed).to have_attributes(name: "Nextcloud Local", + host: storage.host, provider_type: "Storages::NextcloudStorage") aggregate_failures "honors provider fields defaults" do diff --git a/modules/storages/spec/lib/api/v3/storages/storages_representer_rendering_spec.rb b/modules/storages/spec/lib/api/v3/storages/storages_representer_rendering_spec.rb index 529e52ffc5cc..4f0a733d8b07 100644 --- a/modules/storages/spec/lib/api/v3/storages/storages_representer_rendering_spec.rb +++ b/modules/storages/spec/lib/api/v3/storages/storages_representer_rendering_spec.rb @@ -32,9 +32,7 @@ require_module_spec_helper RSpec.describe API::V3::Storages::StorageRepresenter, "rendering" do - let(:oauth_application) { build_stubbed(:oauth_application) } let(:oauth_client_credentials) { build_stubbed(:oauth_client) } - let(:storage) { build_stubbed(:nextcloud_storage, oauth_application:, oauth_client: oauth_client_credentials) } let(:user) { build_stubbed(:user) } let(:auth_check_result) { ServiceResult.success } let(:representer) { described_class.new(storage, current_user: user, embed_links: true) } @@ -48,7 +46,33 @@ ) end - describe "_links" do + shared_examples_for "common file storage properties" do + it_behaves_like "property", :_type do + let(:value) { "Storage" } + end + + it_behaves_like "property", :id do + let(:value) { storage.id } + end + + it_behaves_like "property", :name do + let(:value) { storage.name } + end + + it_behaves_like "property", :complete do + let(:value) { true } + end + + it_behaves_like "datetime property", :createdAt do + let(:value) { storage.created_at } + end + + it_behaves_like "datetime property", :updatedAt do + let(:value) { storage.updated_at } + end + end + + shared_examples_for "common file storage links" do describe "self" do it_behaves_like "has a titled link" do let(:link) { "self" } @@ -57,19 +81,32 @@ end end - describe "origin" do - it_behaves_like "has an untitled link" do - let(:link) { "origin" } - let(:href) { storage.host } - end - end - - describe "connectionState" do + describe "authorizationState" do it_behaves_like "has a titled link" do let(:link) { "authorizationState" } let(:href) { "urn:openproject-org:api:v3:storages:authorization:Connected" } let(:title) { "Connected" } end + + context "if authentication check returns unauthorized" do + let(:auth_check_result) { ServiceResult.failure(errors: Storages::StorageError.new(code: :unauthorized)) } + + it_behaves_like "has a titled link" do + let(:link) { "authorizationState" } + let(:href) { "urn:openproject-org:api:v3:storages:authorization:FailedAuthorization" } + let(:title) { "Authorization failed" } + end + end + + context "if authentication check returns error" do + let(:auth_check_result) { ServiceResult.failure(errors: Storages::StorageError.new(code: :error)) } + + it_behaves_like "has a titled link" do + let(:link) { "authorizationState" } + let(:href) { "urn:openproject-org:api:v3:storages:authorization:Error" } + let(:title) { "Error" } + end + end end describe "prepareUpload" do @@ -130,31 +167,6 @@ end end - describe "oauthApplication" do - it_behaves_like "has no link" do - let(:link) { "oauthApplication" } - end - - context "as admin" do - let(:user) { build_stubbed(:admin) } - - it_behaves_like "has a titled link" do - let(:link) { "oauthApplication" } - let(:href) { "/api/v3/oauth_applications/#{oauth_application.id}" } - let(:title) { oauth_application.name } - end - - context "with invalid configured storage with missing oauth application" do - let(:oauth_application) { nil } - - it_behaves_like "has an untitled link" do - let(:link) { "oauthApplication" } - let(:href) { nil } - end - end - end - end - describe "oauthClientCredentials" do it_behaves_like "has no link" do let(:link) { "oauthClientCredentials" } @@ -181,17 +193,7 @@ end end - describe "_embedded" do - describe "oauthApplication" do - it { is_expected.not_to have_json_path("_embedded/oauthApplication") } - - context "as admin" do - let(:user) { build_stubbed(:admin) } - - it { is_expected.to be_json_eql(oauth_application.id).at_path("_embedded/oauthApplication/id") } - end - end - + shared_examples_for "common file storage embedded resources" do describe "oauthClientCredentials" do it { is_expected.not_to have_json_path("_embedded/oauthClientCredentials") } @@ -210,86 +212,102 @@ end end - describe "properties" do - it_behaves_like "property", :_type do - let(:value) { "Storage" } - end + context "if file storage has provider type Nextcloud" do + let(:oauth_application) { build_stubbed(:oauth_application) } + let(:storage) { build_stubbed(:nextcloud_storage, oauth_application:, oauth_client: oauth_client_credentials) } - it_behaves_like "property", :id do - let(:value) { storage.id } - end + it_behaves_like "common file storage properties" - it_behaves_like "datetime property", :createdAt do - let(:value) { storage.created_at } - end + describe "properties (Nextcloud only)" do + it_behaves_like "property", :hasApplicationPassword do + let(:value) { false } + end - it_behaves_like "datetime property", :updatedAt do - let(:value) { storage.updated_at } - end + describe "hasApplicationPassword" do + it_behaves_like "property", :hasApplicationPassword do + let(:value) { false } + end - describe "Automatically managed project folders" do - shared_examples "protects applicationPassword" do - it "does not render the applicationPassword" do - expect(generated).not_to have_json_path("applicationPassword") + context "if file storage is configured as 'automatically managed project folders'" do + let(:storage) do + build(:nextcloud_storage, :as_automatically_managed, oauth_application:, oauth_client: oauth_client_credentials) + end + + it_behaves_like "property", :hasApplicationPassword do + let(:value) { true } + end end end + end - context "with automatic project folder management enabled" do - let(:storage) do - build(:nextcloud_storage, :as_automatically_managed, oauth_application:, oauth_client: oauth_client_credentials) - end + it_behaves_like "common file storage links" - it_behaves_like "property", :hasApplicationPassword do - let(:value) { true } + describe "_links (Nextcloud only)" do + describe "origin" do + it_behaves_like "has an untitled link" do + let(:link) { "origin" } + let(:href) { storage.host } end - - it_behaves_like "protects applicationPassword" end - context "with automatic project folder management disabled" do - let(:storage) do - build(:nextcloud_storage, :as_not_automatically_managed, oauth_application:, oauth_client: oauth_client_credentials) + describe "oauthApplication" do + it_behaves_like "has no link" do + let(:link) { "oauthApplication" } end - it_behaves_like "property", :hasApplicationPassword do - let(:value) { false } - end + context "as admin" do + let(:user) { build_stubbed(:admin) } - it_behaves_like "protects applicationPassword" - end + it_behaves_like "has a titled link" do + let(:link) { "oauthApplication" } + let(:href) { "/api/v3/oauth_applications/#{oauth_application.id}" } + let(:title) { oauth_application.name } + end - context "when automatic project folder management is not configured" do - let(:storage) do - build(:nextcloud_storage, - provider_fields: { automatically_managed: false }, - oauth_application:, oauth_client: oauth_client_credentials) - end + context "with invalid configured storage with missing oauth application" do + let(:oauth_application) { nil } - it "hasApplicationPassword is false" do - expect(generated).to be_json_eql(false).at_path("hasApplicationPassword") + it_behaves_like "has an untitled link" do + let(:link) { "oauthApplication" } + let(:href) { nil } + end + end end - - it_behaves_like "protects applicationPassword" end + end - context "with a non-Nextcloud storage" do - let(:storage) do - build(:one_drive_storage, oauth_application:, oauth_client: oauth_client_credentials) - end + it_behaves_like "common file storage embedded resources" - before do - Storages::Peripherals::Registry.stub( - "one_drive.queries.open_storage", - ->(_) { ServiceResult.success(result: "https://my.sharepoint.com/sites/DeathStar/Documents") } - ) - end + describe "_embedded (Nextcloud only)" do + describe "oauthApplication" do + it { is_expected.not_to have_json_path("_embedded/oauthApplication") } + + context "as admin" do + let(:user) { build_stubbed(:admin) } - it "does not include the property hasApplicationPassword" do - expect(generated).not_to have_json_path("hasApplicationPassword") + it { is_expected.to be_json_eql(oauth_application.id).at_path("_embedded/oauthApplication/id") } end + end + end + end - it_behaves_like "protects applicationPassword" + context "if file storage has provider type OneDrive/SharePoint" do + let(:storage) { build_stubbed(:one_drive_storage, oauth_client: oauth_client_credentials) } + + it_behaves_like "common file storage properties" + + describe "properties (OneDrive/SharePoint only)" do + it_behaves_like "property", :tenantId do + let(:value) { storage.tenant_id } + end + + it_behaves_like "property", :driveId do + let(:value) { storage.drive_id } end end + + it_behaves_like "common file storage links" + + it_behaves_like "common file storage embedded resources" end end From 91512a031e5230bd2f4a171ab0a6298b97b06978 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI <operations+ci@openproject.com> Date: Fri, 24 May 2024 03:05:43 +0000 Subject: [PATCH 19/40] update locales from crowdin [ci skip] --- config/locales/crowdin/es.seeders.yml | 22 ++++++++-------- config/locales/crowdin/es.yml | 2 +- config/locales/crowdin/js-es.yml | 2 +- config/locales/crowdin/js-ru.yml | 14 +++++----- config/locales/crowdin/ru.yml | 26 +++++++++---------- .../backlogs/config/locales/crowdin/af.yml | 2 +- .../grids/config/locales/crowdin/js-ru.yml | 2 +- .../config/locales/crowdin/es.seeders.yml | 4 +-- modules/meeting/config/locales/crowdin/es.yml | 10 +++---- modules/meeting/config/locales/crowdin/lt.yml | 4 +-- modules/meeting/config/locales/crowdin/ru.yml | 4 +-- .../storages/config/locales/crowdin/es.yml | 18 ++++++------- .../storages/config/locales/crowdin/ru.yml | 2 +- 13 files changed, 56 insertions(+), 56 deletions(-) diff --git a/config/locales/crowdin/es.seeders.yml b/config/locales/crowdin/es.seeders.yml index 772957209c0a..3f0119230ec3 100644 --- a/config/locales/crowdin/es.seeders.yml +++ b/config/locales/crowdin/es.seeders.yml @@ -252,20 +252,20 @@ es: item_4: subject: Fin del proyecto wiki: | - _In this wiki you can collaboratively create and edit pages and sub-pages to create a project wiki._ + _En esta wiki puede crear y editar en colaboración páginas y subpáginas para crear un wiki de proyecto._ - **You can:** + **Puede:** - * Insert text and images, also with copy and paste from other documents - * Create a page hierarchy with parent pages - * Include wiki pages to the project menu - * Use macros to include, e.g. table of contents, work package lists, or Gantt charts - * Include wiki pages in other text fields, e.g. project overview page - * Include links to other documents - * View the change history - * View as Markdown + * Insertar texto e imágenes, también utilizando copiar y pegar desde otros documentos + * Crear una jerarquía de páginas con páginas padre + * Incluir páginas wiki en el menú del proyecto + * Utilizar macros para incluir, por ejemplo, índices, listas de paquetes de trabajo o diagramas de Gantt + * Incluir páginas wiki en otros campos de texto, por ejemplo, página de resumen del proyecto + * Incluir enlaces a otros documentos + * Ver el historial de cambios + * Ver como Markdown - More information: [https://www.openproject.org/docs/user-guide/wiki/](https://www.openproject.org/docs/user-guide/wiki/) + Más información: [https://www.openproject.org/docs/user-guide/wiki/](https://www.openproject.org/docs/user-guide/wiki/) scrum-project: name: Proyecto Scrum status_explanation: Todas las tareas se ajustan al calendario. Las personas implicadas conocen sus tareas. El sistema está completamente configurado. diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml index d2bbde301dde..7ef30711c522 100644 --- a/config/locales/crowdin/es.yml +++ b/config/locales/crowdin/es.yml @@ -1782,7 +1782,7 @@ es: label_attribute_expand_text: "El texto completo para «%{attribute}»" label_authentication: "Autentificación" label_available_global_roles: "Roles globales disponibles" - label_available_project_attributes: "Available project attributes" + label_available_project_attributes: "Atributos del proyecto disponibles" label_available_project_forums: "Foros disponibles" label_available_project_repositories: "Repositorios disponibles" label_available_project_versions: "Versiones disponibles" diff --git a/config/locales/crowdin/js-es.yml b/config/locales/crowdin/js-es.yml index ba76e68a6259..3bde371a16aa 100644 --- a/config/locales/crowdin/js-es.yml +++ b/config/locales/crowdin/js-es.yml @@ -363,7 +363,7 @@ es: "14_1": standard: new_features_html: > - The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>PDF export of Gantt view, e.g. for printing (Enterprise add-on)</li> <li>Favorite projects</li> <li>Sections in Meetings</li> <li>Showing meetings on the My page and project overview pages</li> <li>Possibility to hide attachments in the Files tab</li> <li>Custom fields of the type Link (URL)</li> </ul> + La versión contiene varias novedades y mejoras: <br> <ul class="%{list_styling_class}"> <li>Exportación a PDF de la vista Gantt, por ejemplo para imprimir (complemento Enterprise)</li> <li>Proyectos favoritos</li> <li>Secciones en reuniones</li> <li>Visualización de reuniones en las páginas Mi página y Resumen del proyecto</li> <li>Posibilidad de ocultar los archivos adjuntos en la pestaña Archivos</li> <li>Campos personalizados del tipo Enlace (URL)</li> </ul> ical_sharing_modal: title: "Suscribirse al calendario" inital_setup_error_message: "Se ha producido un error al obtener los datos." diff --git a/config/locales/crowdin/js-ru.yml b/config/locales/crowdin/js-ru.yml index cbb8c2cf5c49..a5d97066511f 100644 --- a/config/locales/crowdin/js-ru.yml +++ b/config/locales/crowdin/js-ru.yml @@ -31,7 +31,7 @@ ru: Вы уверены, что хотите удалить этот файл? Это действие необратимо. draggable_hint: | Перенесите в поле редактора для вставки изображения или прикрепления ссылки. Закрытые поля будут открыты в процессе переноса. - quarantined_hint: "The file is quarantined, as a virus was found. It is not available for download." + quarantined_hint: "Этот файл помещен в карантин, так как в нем обнаружен вирус. Он недоступен для загрузки." autocomplete_ng_select: add_tag: "Добавить элемент" clear_all: "Очистить все" @@ -338,7 +338,7 @@ ru: wide: "Широкий" very_wide: "Очень широкий" options: - date_zoom: "Date zoom" + date_zoom: "Изменение даты" paper_size: "Размер бумаги" column_widths: "Ширина столбца" general_text_no: "нет" @@ -362,7 +362,7 @@ ru: "14_1": standard: new_features_html: > - The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>PDF export of Gantt view, e.g. for printing (Enterprise add-on)</li> <li>Favorite projects</li> <li>Sections in Meetings</li> <li>Showing meetings on the My page and project overview pages</li> <li>Possibility to hide attachments in the Files tab</li> <li>Custom fields of the type Link (URL)</li> </ul> + Выпуск содержит новые функции и улучшения: <br> <ul class="%{list_styling_class}"> <li>Экспорт диаграммы Ганта в формате PDF, например, для печати</li> <li>Избранные проекты</li> <li>Разделы в Совещаниях</li> <li>Отображение встреч на странице "Мои страницы" и страницах обзора проектов</li> <li>Возможность скрыть вложения на вкладке "Файлы"</li> <li>Пользовательские поля типа Ссылка (URL)</li> </ul> ical_sharing_modal: title: "Подписаться на календарь" inital_setup_error_message: "Произошла ошибка при получении данных." @@ -1057,7 +1057,7 @@ ru: sharing: share: "Поделиться" title: "Поделиться пакетом работ" - show_all_users: "Show all users with whom the work package has been shared with" + show_all_users: "Показать всех пользователей, которым был предоставлен общий доступ к пакету работ" selected_count: "%{count} выбрано" selection: mixed: "Смешанное" @@ -1289,7 +1289,7 @@ ru: next_button: "Продолжить" favorite_projects: no_results: "У вас нет избранных проектов" - no_results_subtext: "Add one or multiple projects as favorite through their overview or in a project list." + no_results_subtext: "Добавьте один или несколько проектов в избранное через их обзор или в списке проектов." include_projects: toggle_title: "Включить проекты" title: "Проекты" @@ -1350,5 +1350,5 @@ ru: Close: "Закрыть" open_project_storage_modal: waiting_subtitle: - network_off: "There is a network problem." - network_on: "Network is back. We are trying." + network_off: "Проблема с сетью." + network_on: "Проблема с сетью решена." diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index bedbea88dcce..b9cd71634803 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -506,9 +506,9 @@ ru: unsupported_for_multiple_projects: "Массовое перемещение/копирование не поддерживается при работе с пакетами из нескольких проектов" sharing: missing_workflow_warning: - title: "Workflow missing for work package sharing" + title: "Отсутствует рабочий процесс для совместного использования пакета работ" message: "No workflow is configured for the 'Work package editor' role. Without a workflow, the shared with user cannot alter the status of the work package. Workflows can be copied. Select a source type (e.g. 'Task') and source role (e.g. 'Member'). Then select the target types. To start with, you could select all the types as targets. Finally, select the 'Work package editor' role as the target and press 'Copy'. After having thus created the defaults, fine tune the workflows as you do for every other role." - link_message: "Configure the workflows in the administration." + link_message: "Настройте рабочие процессы в Администрировании." summary: reports: category: @@ -3002,7 +3002,7 @@ ru: setting_work_package_done_ratio_field: "Рабочий" setting_work_package_done_ratio_status: "Статус" setting_work_package_done_ratio_explanation_html: > - In <b>work-based</b> mode, % Complete is calculated from how much work is done in relation to total work. In <b>status-based</b> mode, each status has a % Complete value associated with it. Changing status will change % Complete. + В режиме <b>На основе работы</b>, % Выполнения рассчитывается на основе того, сколько работы выполнено по отношению к общему объему работы. В режиме <b>На основе статуса</b>, каждый статус имеет связанное с ним значение % Выполнения. Изменение статуса изменит % Выполнения. setting_work_package_properties: "Свойства пакета работ" setting_work_package_startdate_is_adddate: "Использовать текущую дату как дату начала для новых пакетов работ" setting_work_packages_projects_export_limit: "Ограничение экспорта пакетов работ / проектов" @@ -3061,7 +3061,7 @@ ru: whitelist_text_html: > Определите список допустимых расширений файлов и/или mime типов для загруженных файлов. <br/> Введите расширения файлов (например, <code>%{ext_example}</code>) или mime типы (e. ., <code>%{mime_example}</code>). <br/> Оставьте пустым, чтобы разрешить загрузку любого типа файла. Допустимы несколько значений (одна строка для каждого значения). show_work_package_attachments: > - Deactivating this option will hide the attachments list on the work packages files tab for new projects. The files attached in the description of a work package will still be uploaded in the internal attachments storage. + Отключение этой опции скроет список вложений на вкладке "Файлы" пакетов работ для новых проектов. Файлы, прикрепленные в описании пакета работ, по-прежнему будут загружаться во внутреннее хранилище вложений. antivirus: title: "Сканирование вирусов" clamav_ping_failed: "Не удалось подключиться к сервису ClamAV. Проверьте настройки и повторите попытку." @@ -3115,14 +3115,14 @@ ru: label_new_section: "Раздел" label_edit_section: "Переименовать" label_section_actions: "Действия в разделе" - heading_description: "These project attributes appear in the overview page of each project. You can add new attributes, group them into sections and re-order them as you please. These attributes can be enabled or disabled but not re-ordered at a project level." + heading_description: "Эти атрибуты проекта отображаются на странице обзора каждого проекта. Вы можете добавлять новые атрибуты, группировать их в разделы и изменять их порядок по своему усмотрению. Эти атрибуты можно включать или отключать, но не изменять их порядок на уровне проекта." label_project_custom_field_actions: "Действия с атрибутами проекта" - label_no_project_custom_fields: "No project attributes defined in this section" + label_no_project_custom_fields: "В этом разделе атрибуты проекта не определены" edit: - description: "Changes to this project attribute will be reflected in all projects where it is enabled. Required attributes cannot be disabled on a per-project basis." + description: "Изменения этого атрибута проекта будут отражены во всех проектах, где он включен. Обязательные атрибуты не могут быть отключены для каждого проекта." new: heading: "Новый атрибут" - description: "Changes to this project attribute will be reflected in all projects where it is enabled. Required attributes cannot be disabled on a per-project basis." + description: "Изменения этого атрибута проекта будут отражены во всех проектах, где он включен. Обязательные атрибуты не могут быть отключены для каждого проекта." projects: missing_dependencies: "Был проверен модуль проекта %{module}, который зависит от %{dependencies}. Вам также необходимо проверить эти зависимости." section_new_projects: "Настройки для новых проектов" @@ -3155,7 +3155,7 @@ ru: text_are_you_sure: "Вы уверены?" text_are_you_sure_continue: "Вы уверены, что хотите продолжить?" text_are_you_sure_with_children: "Удалить пакет работ и все дочерние пакеты работ?" - text_are_you_sure_with_project_custom_fields: "Deleting this attribute will also delete its values in all projects. Are you sure you want to do this?" + text_are_you_sure_with_project_custom_fields: "Удаление этого атрибута также приведет к удалению его значений во всех проектах. Вы уверены, что хотите это сделать?" text_assign_to_project: "Назначить на проект" text_form_configuration: > Вы можете настроить, какие поля будут показываться в формах пакетов работ. Вы можете свободно сгруппировать поля с учетом потребностей вашего домена. @@ -3301,7 +3301,7 @@ ru: sort_by: automatic: heading: "Автоматически" - description: "Order the %{plural} by one or more sorting criteria. You will lose the previous sorting." + description: "Упорядочьте %{plural} по одному или нескольким критериям сортировки. Вы потеряете предыдущую сортировку." top_menu: additional_resources: "Дополнительные ресурсы" getting_started: "Приступая к работе" @@ -3338,7 +3338,7 @@ ru: status_user_and_brute_force: "%{user} и %{brute_force}" status_change: "Смена статуса" text_change_disabled_for_provider_login: "Это имя задано вашим поставщиком авторизации, поэтому его нельзя изменить." - text_change_disabled_for_ldap_login: "The name and email is set by LDAP and can thus not be changed." + text_change_disabled_for_ldap_login: "Имя и адрес электронной почты заданы LDAP и не могут быть изменены." unlock: "Разблокировать" unlock_and_reset_failed_logins: "Разблокировать и сбросить неудачные попытки входа" version_status_closed: "закрыт" @@ -3386,8 +3386,8 @@ ru: progress: label_note: "Примечание:" modal: - work_based_help_text: "% Complete is automatically derived from Work and Remaining work." - status_based_help_text: "% Complete is set by work package status." + work_based_help_text: "% Выполнения автоматически выводится из Работ и Оставшихся работ." + status_based_help_text: "% Выполнения определяется статусом пакета работ." migration_warning_text: "In work-based progress calculation mode, % Complete cannot be manually set and is tied to Work. The existing value has been kept but cannot be edited. Please input Work first." sharing: count: diff --git a/modules/backlogs/config/locales/crowdin/af.yml b/modules/backlogs/config/locales/crowdin/af.yml index 6b23423d9ece..797266642d45 100644 --- a/modules/backlogs/config/locales/crowdin/af.yml +++ b/modules/backlogs/config/locales/crowdin/af.yml @@ -28,7 +28,7 @@ af: work_package: position: "Posisie" story_points: "Story Points" - backlogs_work_package_type: "Backlog type" + backlogs_work_package_type: "Agterstand tipe" errors: models: work_package: diff --git a/modules/grids/config/locales/crowdin/js-ru.yml b/modules/grids/config/locales/crowdin/js-ru.yml index 16d89abd3e48..ef1bd92a2c8c 100644 --- a/modules/grids/config/locales/crowdin/js-ru.yml +++ b/modules/grids/config/locales/crowdin/js-ru.yml @@ -44,7 +44,7 @@ ru: no_results: 'Подпроектов нет.' project_favorites: title: 'Избранные проекты' - no_results: 'You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites.' + no_results: 'В настоящее время у вас нет избранных проектов. Нажмите на значок звезды в панели управления проекта, чтобы добавить его в избранное.' time_entries_current_user: title: 'Затраченное мной время' displayed_days: 'Дни, отображаемые в виджете:' diff --git a/modules/meeting/config/locales/crowdin/es.seeders.yml b/modules/meeting/config/locales/crowdin/es.seeders.yml index bb258712a942..017b5be41cc2 100644 --- a/modules/meeting/config/locales/crowdin/es.seeders.yml +++ b/modules/meeting/config/locales/crowdin/es.seeders.yml @@ -24,6 +24,6 @@ es: item_6: title: Revisión de los objetivos trimestrales item_7: - title: Core values feedback + title: Comentarios sobre los valores fundamentales item_8: - title: General topics + title: Temas generales diff --git a/modules/meeting/config/locales/crowdin/es.yml b/modules/meeting/config/locales/crowdin/es.yml index db12061a1215..58bc32b3ba2b 100644 --- a/modules/meeting/config/locales/crowdin/es.yml +++ b/modules/meeting/config/locales/crowdin/es.yml @@ -107,8 +107,8 @@ es: agenda: "Copiar agenda" agenda_text: "Copiar la agenda de la reunión anterior" email: - send_emails: "Send emails" - send_invitation_emails: "Send out invitation emails upon creation" + send_emails: "Enviar correos electrónicos" + send_invitation_emails: "Envíe correos electrónicos de invitación en el momento de la creación" open_meeting_link: "Abrir reunión" invited: summary: "%{actor} te ha enviado una invitación para la reunión %{title}" @@ -127,9 +127,9 @@ es: structured_text_copy: "Copiar una reunión no copiará actualmente los elementos asociados de la agenda de la reunión, solo los detalles" copied: "Copiado de la reunión %{id}" meeting_section: - untitled_title: "Untitled section" - delete_confirmation: "Deleting the section will also delete all of its agenda items. Are you sure you want to do this?" - placeholder_title: "New section" + untitled_title: "Sección sin título" + delete_confirmation: "Al eliminar esta sección también se eliminarán todos sus puntos de agenda. ¿Seguro que desea hacerlo?" + placeholder_title: "Nueva sección" empty_text: "Arrastre los elementos aquí o cree uno nuevo" notice_successful_notification: "Notificación enviada correctamente" notice_timezone_missing: No se ha establecido zona horaria y se asume %{zone}. Para elegir su zona horaria, por favor, haga clic aquí. diff --git a/modules/meeting/config/locales/crowdin/lt.yml b/modules/meeting/config/locales/crowdin/lt.yml index cf2882e8bade..4ef402d3d976 100644 --- a/modules/meeting/config/locales/crowdin/lt.yml +++ b/modules/meeting/config/locales/crowdin/lt.yml @@ -109,8 +109,8 @@ lt: agenda: "Kopijuoti dienotvarkę" agenda_text: "Kopijuoti seno susitikimo darbotvarkę" email: - send_emails: "Send emails" - send_invitation_emails: "Send out invitation emails upon creation" + send_emails: "Siųsti laiškus" + send_invitation_emails: "Išsiųsti pakvitimo laiškus baigus kūrimą" open_meeting_link: "Atverti susitikimą" invited: summary: "%{actor} atsiuntė jums pakvietimą į susitikimą %{title}" diff --git a/modules/meeting/config/locales/crowdin/ru.yml b/modules/meeting/config/locales/crowdin/ru.yml index ed84aa3af4ad..25deae587d4f 100644 --- a/modules/meeting/config/locales/crowdin/ru.yml +++ b/modules/meeting/config/locales/crowdin/ru.yml @@ -109,8 +109,8 @@ ru: agenda: "Копировать повестку дня" agenda_text: "Копировать повестку дня старой встречи" email: - send_emails: "Send emails" - send_invitation_emails: "Send out invitation emails upon creation" + send_emails: "Рассылка" + send_invitation_emails: "Отправлять приглашения при создании" open_meeting_link: "Открыть совещание" invited: summary: "%{actor} отправил вам приглашение на совещание %{title}" diff --git a/modules/storages/config/locales/crowdin/es.yml b/modules/storages/config/locales/crowdin/es.yml index ac8e3a887e4a..3e91462d4f1f 100644 --- a/modules/storages/config/locales/crowdin/es.yml +++ b/modules/storages/config/locales/crowdin/es.yml @@ -40,18 +40,18 @@ es: errors: too_many_elements_created_at_once: Se intentaron crear demasiados elementos a la vez. Se esperaban como máximo %{max}, pero se recibieron %{actual}. external_file_storages: Almacenamientos de archivos externos - permission_create_files: 'Automatically managed project folders: Create files' - permission_create_files_explanation: This permission is only available for Nextcloud storages - permission_delete_files: 'Automatically managed project folders: Delete files' - permission_delete_files_explanation: This permission is only available for Nextcloud storages + permission_create_files: 'Carpetas de proyecto gestionadas automáticamente: Crear archivos' + permission_create_files_explanation: Este permiso solo está disponible para los almacenamientos Nextcloud + permission_delete_files: 'Carpetas de proyecto gestionadas automáticamente: Eliminar archivos' + permission_delete_files_explanation: Este permiso solo está disponible para los almacenamientos Nextcloud permission_header_for_project_module_storages: Carpetas de proyecto gestionadas automáticamente permission_manage_file_links: Administrar enlaces de archivos permission_manage_storages_in_project: Administrar almacenes de archivos en el proyecto - permission_read_files: 'Automatically managed project folders: Read files' - permission_share_files: 'Automatically managed project folders: Share files' - permission_share_files_explanation: This permission is only available for Nextcloud storages + permission_read_files: 'Carpetas de proyecto gestionadas automáticamente: Ver archivos' + permission_share_files: 'Carpetas de proyecto gestionadas automáticamente: Compartir archivos' + permission_share_files_explanation: Este permiso solo está disponible para los almacenamientos Nextcloud permission_view_file_links: Ver enlaces de archivos - permission_write_files: 'Automatically managed project folders: Write files' + permission_write_files: 'Carpetas de proyecto gestionadas automáticamente: Escribir archivos' project_module_storages: Archivos storages: buttons: @@ -246,7 +246,7 @@ es: name: OneDrive/Sharepoint name_placeholder: ej. OneDrive show_attachments_toggle: - description: 'Deactivating this option will hide the attachments list on the work packages files tab. The files attached in the description of a work package will still be uploaded in the internal attachments storage. ' + description: 'Al desactivar esta opción se ocultará la lista de archivos adjuntos en la pestaña de archivos de los paquetes de trabajo. Los archivos adjuntos en la descripción de un paquete de trabajo seguirán cargándose en el almacenamiento interno de archivos adjuntos.' label: Mostrar archivos adjuntos en la pestaña de archivos de los paquetes de trabajo storage_list_blank_slate: description: Añade un almacenamiento para verlos aquí. diff --git a/modules/storages/config/locales/crowdin/ru.yml b/modules/storages/config/locales/crowdin/ru.yml index 7b06d896108f..1f13f6749070 100644 --- a/modules/storages/config/locales/crowdin/ru.yml +++ b/modules/storages/config/locales/crowdin/ru.yml @@ -84,7 +84,7 @@ ru: file_storage_view: access_management: automatic_management: Автоматически управляемый доступ и папки - automatic_management_description: Let OpenProject create folders per project automatically and manage its user access. This is recommended as it ensures that every team member has always the correct access permissions. + automatic_management_description: Разрешить OpenProject автоматически создавать папки для каждого проекта и управлять доступом пользователей к ним. Это рекомендуется, так как гарантирует, что каждый член команды всегда будет иметь правильные права на доступ. description: Select the type of management of user access and folder creation. We recommend to use the Automatically managed access to have a more organised structure and guarantee access to all relevant users. manual_management: Вручную управляемый доступ и папки manual_management_description: Create and manage folders per project manually on your own. You will need to manually ensure relevant users have access. From 773293e7c4e24c1710c22c3561466214e8dee34f Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI <operations+ci@openproject.com> Date: Fri, 24 May 2024 03:07:53 +0000 Subject: [PATCH 20/40] update locales from crowdin [ci skip] --- config/locales/crowdin/es.seeders.yml | 22 +++++++-------- config/locales/crowdin/js-es.yml | 2 +- config/locales/crowdin/js-ru.yml | 14 +++++----- config/locales/crowdin/ru.yml | 28 +++++++++---------- .../backlogs/config/locales/crowdin/af.yml | 2 +- .../grids/config/locales/crowdin/js-ru.yml | 2 +- .../config/locales/crowdin/es.seeders.yml | 4 +-- modules/meeting/config/locales/crowdin/es.yml | 6 ++-- .../storages/config/locales/crowdin/es.yml | 18 ++++++------ .../storages/config/locales/crowdin/ru.yml | 2 +- 10 files changed, 50 insertions(+), 50 deletions(-) diff --git a/config/locales/crowdin/es.seeders.yml b/config/locales/crowdin/es.seeders.yml index 772957209c0a..3f0119230ec3 100644 --- a/config/locales/crowdin/es.seeders.yml +++ b/config/locales/crowdin/es.seeders.yml @@ -252,20 +252,20 @@ es: item_4: subject: Fin del proyecto wiki: | - _In this wiki you can collaboratively create and edit pages and sub-pages to create a project wiki._ + _En esta wiki puede crear y editar en colaboración páginas y subpáginas para crear un wiki de proyecto._ - **You can:** + **Puede:** - * Insert text and images, also with copy and paste from other documents - * Create a page hierarchy with parent pages - * Include wiki pages to the project menu - * Use macros to include, e.g. table of contents, work package lists, or Gantt charts - * Include wiki pages in other text fields, e.g. project overview page - * Include links to other documents - * View the change history - * View as Markdown + * Insertar texto e imágenes, también utilizando copiar y pegar desde otros documentos + * Crear una jerarquía de páginas con páginas padre + * Incluir páginas wiki en el menú del proyecto + * Utilizar macros para incluir, por ejemplo, índices, listas de paquetes de trabajo o diagramas de Gantt + * Incluir páginas wiki en otros campos de texto, por ejemplo, página de resumen del proyecto + * Incluir enlaces a otros documentos + * Ver el historial de cambios + * Ver como Markdown - More information: [https://www.openproject.org/docs/user-guide/wiki/](https://www.openproject.org/docs/user-guide/wiki/) + Más información: [https://www.openproject.org/docs/user-guide/wiki/](https://www.openproject.org/docs/user-guide/wiki/) scrum-project: name: Proyecto Scrum status_explanation: Todas las tareas se ajustan al calendario. Las personas implicadas conocen sus tareas. El sistema está completamente configurado. diff --git a/config/locales/crowdin/js-es.yml b/config/locales/crowdin/js-es.yml index ba76e68a6259..3bde371a16aa 100644 --- a/config/locales/crowdin/js-es.yml +++ b/config/locales/crowdin/js-es.yml @@ -363,7 +363,7 @@ es: "14_1": standard: new_features_html: > - The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>PDF export of Gantt view, e.g. for printing (Enterprise add-on)</li> <li>Favorite projects</li> <li>Sections in Meetings</li> <li>Showing meetings on the My page and project overview pages</li> <li>Possibility to hide attachments in the Files tab</li> <li>Custom fields of the type Link (URL)</li> </ul> + La versión contiene varias novedades y mejoras: <br> <ul class="%{list_styling_class}"> <li>Exportación a PDF de la vista Gantt, por ejemplo para imprimir (complemento Enterprise)</li> <li>Proyectos favoritos</li> <li>Secciones en reuniones</li> <li>Visualización de reuniones en las páginas Mi página y Resumen del proyecto</li> <li>Posibilidad de ocultar los archivos adjuntos en la pestaña Archivos</li> <li>Campos personalizados del tipo Enlace (URL)</li> </ul> ical_sharing_modal: title: "Suscribirse al calendario" inital_setup_error_message: "Se ha producido un error al obtener los datos." diff --git a/config/locales/crowdin/js-ru.yml b/config/locales/crowdin/js-ru.yml index 923e4b91f478..bbc3f13cfbcd 100644 --- a/config/locales/crowdin/js-ru.yml +++ b/config/locales/crowdin/js-ru.yml @@ -31,7 +31,7 @@ ru: Вы уверены, что хотите удалить этот файл? Это действие необратимо. draggable_hint: | Перенесите в поле редактора для вставки изображения или прикрепления ссылки. Закрытые поля будут открыты в процессе переноса. - quarantined_hint: "The file is quarantined, as a virus was found. It is not available for download." + quarantined_hint: "Этот файл помещен в карантин, так как в нем обнаружен вирус. Он недоступен для загрузки." autocomplete_ng_select: add_tag: "Добавить элемент" clear_all: "Очистить все" @@ -338,7 +338,7 @@ ru: wide: "Широкий" very_wide: "Очень широкий" options: - date_zoom: "Date zoom" + date_zoom: "Изменение даты" paper_size: "Размер бумаги" column_widths: "Ширина столбца" general_text_no: "нет" @@ -362,7 +362,7 @@ ru: "14_1": standard: new_features_html: > - The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>PDF export of Gantt view, e.g. for printing (Enterprise add-on)</li> <li>Favorite projects</li> <li>Sections in Meetings</li> <li>Showing meetings on the My page and project overview pages</li> <li>Possibility to hide attachments in the Files tab</li> <li>Custom fields of the type Link (URL)</li> </ul> + Выпуск содержит новые функции и улучшения: <br> <ul class="%{list_styling_class}"> <li>Экспорт диаграммы Ганта в формате PDF, например, для печати</li> <li>Избранные проекты</li> <li>Разделы в Совещаниях</li> <li>Отображение встреч на странице "Мои страницы" и страницах обзора проектов</li> <li>Возможность скрыть вложения на вкладке "Файлы"</li> <li>Пользовательские поля типа Ссылка (URL)</li> </ul> ical_sharing_modal: title: "Подписаться на календарь" inital_setup_error_message: "Произошла ошибка при получении данных." @@ -1057,7 +1057,7 @@ ru: sharing: share: "Поделиться" title: "Поделиться пакетом работ" - show_all_users: "Show all users with whom the work package has been shared with" + show_all_users: "Показать всех пользователей, которым был предоставлен общий доступ к пакету работ" selected_count: "%{count} выбрано" selection: mixed: "Смешанное" @@ -1289,7 +1289,7 @@ ru: next_button: "Продолжить" favorite_projects: no_results: "У вас нет избранных проектов" - no_results_subtext: "Add one or multiple projects as favorite through their overview or in a project list." + no_results_subtext: "Добавьте один или несколько проектов в избранное через их обзор или в списке проектов." include_projects: toggle_title: "Включить проекты" title: "Проекты" @@ -1350,5 +1350,5 @@ ru: Close: "Закрыть" open_project_storage_modal: waiting_subtitle: - network_off: "There is a network problem." - network_on: "Network is back. We are trying." + network_off: "Проблема с сетью." + network_on: "Проблема с сетью решена." diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index 4afcc61a4ab2..c71b212a50ce 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -329,7 +329,7 @@ ru: project_roles: "Роли проекта" wp_shares: "Пакеты работ используемые совместно" groups: "Группы" - no_modify_on_shared: "You currently cannot modify or remove shared memberships through the member page. Use the sharing modal instead." + no_modify_on_shared: "В настоящее время вы не можете изменять или удалять общие членства через страницу участников. Используйте вместо этого режим общего доступа." delete_member_dialog: title: "Удалить участника" will_remove_the_users_role: "Это удалит роль пользователя из этого проекта." @@ -507,9 +507,9 @@ ru: unsupported_for_multiple_projects: "Массовое перемещение/копирование не поддерживается при работе с пакетами из нескольких проектов" sharing: missing_workflow_warning: - title: "Workflow missing for work package sharing" + title: "Отсутствует рабочий процесс для совместного использования пакета работ" message: "No workflow is configured for the 'Work package editor' role. Without a workflow, the shared with user cannot alter the status of the work package. Workflows can be copied. Select a source type (e.g. 'Task') and source role (e.g. 'Member'). Then select the target types. To start with, you could select all the types as targets. Finally, select the 'Work package editor' role as the target and press 'Copy'. After having thus created the defaults, fine tune the workflows as you do for every other role." - link_message: "Configure the workflows in the administration." + link_message: "Настройте рабочие процессы в Администрировании." summary: reports: category: @@ -3002,7 +3002,7 @@ ru: setting_work_package_done_ratio_field: "Рабочий" setting_work_package_done_ratio_status: "Статус" setting_work_package_done_ratio_explanation_html: > - In <b>work-based</b> mode, % Complete is calculated from how much work is done in relation to total work. In <b>status-based</b> mode, each status has a % Complete value associated with it. Changing status will change % Complete. + В режиме <b>На основе работы</b>, % Выполнения рассчитывается на основе того, сколько работы выполнено по отношению к общему объему работы. В режиме <b>На основе статуса</b>, каждый статус имеет связанное с ним значение % Выполнения. Изменение статуса изменит % Выполнения. setting_work_package_properties: "Свойства пакета работ" setting_work_package_startdate_is_adddate: "Использовать текущую дату как дату начала для новых пакетов работ" setting_work_packages_projects_export_limit: "Ограничение экспорта пакетов работ / проектов" @@ -3061,7 +3061,7 @@ ru: whitelist_text_html: > Определите список допустимых расширений файлов и/или mime типов для загруженных файлов. <br/> Введите расширения файлов (например, <code>%{ext_example}</code>) или mime типы (e. ., <code>%{mime_example}</code>). <br/> Оставьте пустым, чтобы разрешить загрузку любого типа файла. Допустимы несколько значений (одна строка для каждого значения). show_work_package_attachments: > - Deactivating this option will hide the attachments list on the work packages files tab for new projects. The files attached in the description of a work package will still be uploaded in the internal attachments storage. + Отключение этой опции скроет список вложений на вкладке "Файлы" пакетов работ для новых проектов. Файлы, прикрепленные в описании пакета работ, по-прежнему будут загружаться во внутреннее хранилище вложений. antivirus: title: "Сканирование вирусов" clamav_ping_failed: "Не удалось подключиться к сервису ClamAV. Проверьте настройки и повторите попытку." @@ -3115,14 +3115,14 @@ ru: label_new_section: "Раздел" label_edit_section: "Переименовать" label_section_actions: "Действия в разделе" - heading_description: "These project attributes appear in the overview page of each project. You can add new attributes, group them into sections and re-order them as you please. These attributes can be enabled or disabled but not re-ordered at a project level." + heading_description: "Эти атрибуты проекта отображаются на странице обзора каждого проекта. Вы можете добавлять новые атрибуты, группировать их в разделы и изменять их порядок по своему усмотрению. Эти атрибуты можно включать или отключать, но не изменять их порядок на уровне проекта." label_project_custom_field_actions: "Действия с атрибутами проекта" - label_no_project_custom_fields: "No project attributes defined in this section" + label_no_project_custom_fields: "В этом разделе атрибуты проекта не определены" edit: - description: "Changes to this project attribute will be reflected in all projects where it is enabled. Required attributes cannot be disabled on a per-project basis." + description: "Изменения этого атрибута проекта будут отражены во всех проектах, где он включен. Обязательные атрибуты не могут быть отключены для каждого проекта." new: heading: "Новый атрибут" - description: "Changes to this project attribute will be reflected in all projects where it is enabled. Required attributes cannot be disabled on a per-project basis." + description: "Изменения этого атрибута проекта будут отражены во всех проектах, где он включен. Обязательные атрибуты не могут быть отключены для каждого проекта." projects: missing_dependencies: "Был проверен модуль проекта %{module}, который зависит от %{dependencies}. Вам также необходимо проверить эти зависимости." section_new_projects: "Настройки для новых проектов" @@ -3155,7 +3155,7 @@ ru: text_are_you_sure: "Вы уверены?" text_are_you_sure_continue: "Вы уверены, что хотите продолжить?" text_are_you_sure_with_children: "Удалить пакет работ и все дочерние пакеты работ?" - text_are_you_sure_with_project_custom_fields: "Deleting this attribute will also delete its values in all projects. Are you sure you want to do this?" + text_are_you_sure_with_project_custom_fields: "Удаление этого атрибута также приведет к удалению его значений во всех проектах. Вы уверены, что хотите это сделать?" text_assign_to_project: "Назначить на проект" text_form_configuration: > Вы можете настроить, какие поля будут показываться в формах пакетов работ. Вы можете свободно сгруппировать поля с учетом потребностей вашего домена. @@ -3301,7 +3301,7 @@ ru: sort_by: automatic: heading: "Автоматически" - description: "Order the %{plural} by one or more sorting criteria. You will lose the previous sorting." + description: "Упорядочьте %{plural} по одному или нескольким критериям сортировки. Вы потеряете предыдущую сортировку." top_menu: additional_resources: "Дополнительные ресурсы" getting_started: "Приступая к работе" @@ -3338,7 +3338,7 @@ ru: status_user_and_brute_force: "%{user} и %{brute_force}" status_change: "Смена статуса" text_change_disabled_for_provider_login: "Это имя задано вашим поставщиком авторизации, поэтому его нельзя изменить." - text_change_disabled_for_ldap_login: "The name and email is set by LDAP and can thus not be changed." + text_change_disabled_for_ldap_login: "Имя и адрес электронной почты заданы LDAP и не могут быть изменены." unlock: "Разблокировать" unlock_and_reset_failed_logins: "Разблокировать и сбросить неудачные попытки входа" version_status_closed: "закрыт" @@ -3386,8 +3386,8 @@ ru: progress: label_note: "Примечание:" modal: - work_based_help_text: "% Complete is automatically derived from Work and Remaining work." - status_based_help_text: "% Complete is set by work package status." + work_based_help_text: "% Выполнения автоматически выводится из Работ и Оставшихся работ." + status_based_help_text: "% Выполнения определяется статусом пакета работ." migration_warning_text: "In work-based progress calculation mode, % Complete cannot be manually set and is tied to Work. The existing value has been kept but cannot be edited. Please input Work first." sharing: count: diff --git a/modules/backlogs/config/locales/crowdin/af.yml b/modules/backlogs/config/locales/crowdin/af.yml index 6b23423d9ece..797266642d45 100644 --- a/modules/backlogs/config/locales/crowdin/af.yml +++ b/modules/backlogs/config/locales/crowdin/af.yml @@ -28,7 +28,7 @@ af: work_package: position: "Posisie" story_points: "Story Points" - backlogs_work_package_type: "Backlog type" + backlogs_work_package_type: "Agterstand tipe" errors: models: work_package: diff --git a/modules/grids/config/locales/crowdin/js-ru.yml b/modules/grids/config/locales/crowdin/js-ru.yml index 16d89abd3e48..ef1bd92a2c8c 100644 --- a/modules/grids/config/locales/crowdin/js-ru.yml +++ b/modules/grids/config/locales/crowdin/js-ru.yml @@ -44,7 +44,7 @@ ru: no_results: 'Подпроектов нет.' project_favorites: title: 'Избранные проекты' - no_results: 'You currently have no favorite projects. Click on the star icon in the project dashboard to add one to your favorites.' + no_results: 'В настоящее время у вас нет избранных проектов. Нажмите на значок звезды в панели управления проекта, чтобы добавить его в избранное.' time_entries_current_user: title: 'Затраченное мной время' displayed_days: 'Дни, отображаемые в виджете:' diff --git a/modules/meeting/config/locales/crowdin/es.seeders.yml b/modules/meeting/config/locales/crowdin/es.seeders.yml index bb258712a942..017b5be41cc2 100644 --- a/modules/meeting/config/locales/crowdin/es.seeders.yml +++ b/modules/meeting/config/locales/crowdin/es.seeders.yml @@ -24,6 +24,6 @@ es: item_6: title: Revisión de los objetivos trimestrales item_7: - title: Core values feedback + title: Comentarios sobre los valores fundamentales item_8: - title: General topics + title: Temas generales diff --git a/modules/meeting/config/locales/crowdin/es.yml b/modules/meeting/config/locales/crowdin/es.yml index b0adb4032944..3a1783e5b8fd 100644 --- a/modules/meeting/config/locales/crowdin/es.yml +++ b/modules/meeting/config/locales/crowdin/es.yml @@ -125,9 +125,9 @@ es: structured_text_copy: "Copiar una reunión no copiará actualmente los elementos asociados de la agenda de la reunión, solo los detalles" copied: "Copiado de la reunión %{id}" meeting_section: - untitled_title: "Untitled section" - delete_confirmation: "Deleting the section will also delete all of its agenda items. Are you sure you want to do this?" - placeholder_title: "New section" + untitled_title: "Sección sin título" + delete_confirmation: "Al eliminar esta sección también se eliminarán todos sus puntos de agenda. ¿Seguro que desea hacerlo?" + placeholder_title: "Nueva sección" empty_text: "Arrastre los elementos aquí o cree uno nuevo" notice_successful_notification: "Notificación enviada correctamente" notice_timezone_missing: No se ha establecido zona horaria y se asume %{zone}. Para elegir su zona horaria, por favor, haga clic aquí. diff --git a/modules/storages/config/locales/crowdin/es.yml b/modules/storages/config/locales/crowdin/es.yml index ac8e3a887e4a..3e91462d4f1f 100644 --- a/modules/storages/config/locales/crowdin/es.yml +++ b/modules/storages/config/locales/crowdin/es.yml @@ -40,18 +40,18 @@ es: errors: too_many_elements_created_at_once: Se intentaron crear demasiados elementos a la vez. Se esperaban como máximo %{max}, pero se recibieron %{actual}. external_file_storages: Almacenamientos de archivos externos - permission_create_files: 'Automatically managed project folders: Create files' - permission_create_files_explanation: This permission is only available for Nextcloud storages - permission_delete_files: 'Automatically managed project folders: Delete files' - permission_delete_files_explanation: This permission is only available for Nextcloud storages + permission_create_files: 'Carpetas de proyecto gestionadas automáticamente: Crear archivos' + permission_create_files_explanation: Este permiso solo está disponible para los almacenamientos Nextcloud + permission_delete_files: 'Carpetas de proyecto gestionadas automáticamente: Eliminar archivos' + permission_delete_files_explanation: Este permiso solo está disponible para los almacenamientos Nextcloud permission_header_for_project_module_storages: Carpetas de proyecto gestionadas automáticamente permission_manage_file_links: Administrar enlaces de archivos permission_manage_storages_in_project: Administrar almacenes de archivos en el proyecto - permission_read_files: 'Automatically managed project folders: Read files' - permission_share_files: 'Automatically managed project folders: Share files' - permission_share_files_explanation: This permission is only available for Nextcloud storages + permission_read_files: 'Carpetas de proyecto gestionadas automáticamente: Ver archivos' + permission_share_files: 'Carpetas de proyecto gestionadas automáticamente: Compartir archivos' + permission_share_files_explanation: Este permiso solo está disponible para los almacenamientos Nextcloud permission_view_file_links: Ver enlaces de archivos - permission_write_files: 'Automatically managed project folders: Write files' + permission_write_files: 'Carpetas de proyecto gestionadas automáticamente: Escribir archivos' project_module_storages: Archivos storages: buttons: @@ -246,7 +246,7 @@ es: name: OneDrive/Sharepoint name_placeholder: ej. OneDrive show_attachments_toggle: - description: 'Deactivating this option will hide the attachments list on the work packages files tab. The files attached in the description of a work package will still be uploaded in the internal attachments storage. ' + description: 'Al desactivar esta opción se ocultará la lista de archivos adjuntos en la pestaña de archivos de los paquetes de trabajo. Los archivos adjuntos en la descripción de un paquete de trabajo seguirán cargándose en el almacenamiento interno de archivos adjuntos.' label: Mostrar archivos adjuntos en la pestaña de archivos de los paquetes de trabajo storage_list_blank_slate: description: Añade un almacenamiento para verlos aquí. diff --git a/modules/storages/config/locales/crowdin/ru.yml b/modules/storages/config/locales/crowdin/ru.yml index 7b06d896108f..1f13f6749070 100644 --- a/modules/storages/config/locales/crowdin/ru.yml +++ b/modules/storages/config/locales/crowdin/ru.yml @@ -84,7 +84,7 @@ ru: file_storage_view: access_management: automatic_management: Автоматически управляемый доступ и папки - automatic_management_description: Let OpenProject create folders per project automatically and manage its user access. This is recommended as it ensures that every team member has always the correct access permissions. + automatic_management_description: Разрешить OpenProject автоматически создавать папки для каждого проекта и управлять доступом пользователей к ним. Это рекомендуется, так как гарантирует, что каждый член команды всегда будет иметь правильные права на доступ. description: Select the type of management of user access and folder creation. We recommend to use the Automatically managed access to have a more organised structure and guarantee access to all relevant users. manual_management: Вручную управляемый доступ и папки manual_management_description: Create and manage folders per project manually on your own. You will need to manually ensure relevant users have access. From 5f4fd2885c8f4d638a87201254bcd02f74acc681 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 May 2024 05:14:38 +0000 Subject: [PATCH 21/40] Bump rubocop from 1.63.5 to 1.64.0 Bumps [rubocop](https://github.com/rubocop/rubocop) from 1.63.5 to 1.64.0. - [Release notes](https://github.com/rubocop/rubocop/releases) - [Changelog](https://github.com/rubocop/rubocop/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop/rubocop/compare/v1.63.5...v1.64.0) --- updated-dependencies: - dependency-name: rubocop dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8cc173a91c41..eae6365fa4b7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -967,7 +967,7 @@ GEM rspec-retry (0.6.2) rspec-core (> 3.3) rspec-support (3.13.1) - rubocop (1.63.5) + rubocop (1.64.0) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) From 4adca2bf9dea27bef6a7efa7f18d17467d15ccd2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 May 2024 05:56:39 +0000 Subject: [PATCH 22/40] Bump the angular group in /frontend with 17 updates Bumps the angular group in /frontend with 17 updates: | Package | From | To | | --- | --- | --- | | [@angular/animations](https://github.com/angular/angular/tree/HEAD/packages/animations) | `17.3.9` | `17.3.10` | | [@angular/cdk](https://github.com/angular/components) | `17.3.9` | `17.3.10` | | [@angular/cli](https://github.com/angular/angular-cli) | `17.3.7` | `17.3.8` | | [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) | `17.3.9` | `17.3.10` | | [@angular/compiler](https://github.com/angular/angular/tree/HEAD/packages/compiler) | `17.3.9` | `17.3.10` | | [@angular/compiler-cli](https://github.com/angular/angular/tree/HEAD/packages/compiler-cli) | `17.3.9` | `17.3.10` | | [@angular/core](https://github.com/angular/angular/tree/HEAD/packages/core) | `17.3.9` | `17.3.10` | | [@angular/elements](https://github.com/angular/angular/tree/HEAD/packages/elements) | `17.3.9` | `17.3.10` | | [@angular/forms](https://github.com/angular/angular/tree/HEAD/packages/forms) | `17.3.9` | `17.3.10` | | [@angular/platform-browser](https://github.com/angular/angular/tree/HEAD/packages/platform-browser) | `17.3.9` | `17.3.10` | | [@angular/platform-browser-dynamic](https://github.com/angular/angular/tree/HEAD/packages/platform-browser-dynamic) | `17.3.9` | `17.3.10` | | [@angular/router](https://github.com/angular/angular/tree/HEAD/packages/router) | `17.3.9` | `17.3.10` | | [@angular-devkit/build-angular](https://github.com/angular/angular-cli) | `17.3.7` | `17.3.8` | | [@angular-eslint/builder](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/builder) | `17.4.1` | `17.5.1` | | [@angular-eslint/eslint-plugin](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/eslint-plugin) | `17.4.1` | `17.5.1` | | [@angular-eslint/eslint-plugin-template](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/eslint-plugin-template) | `17.4.1` | `17.5.1` | | [@angular-eslint/template-parser](https://github.com/angular-eslint/angular-eslint/tree/HEAD/packages/template-parser) | `17.4.1` | `17.5.1` | Updates `@angular/animations` from 17.3.9 to 17.3.10 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.10/packages/animations) Updates `@angular/cdk` from 17.3.9 to 17.3.10 - [Release notes](https://github.com/angular/components/releases) - [Changelog](https://github.com/angular/components/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/components/compare/17.3.9...17.3.10) Updates `@angular/cli` from 17.3.7 to 17.3.8 - [Release notes](https://github.com/angular/angular-cli/releases) - [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular-cli/compare/17.3.7...17.3.8) Updates `@angular/common` from 17.3.9 to 17.3.10 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.10/packages/common) Updates `@angular/compiler` from 17.3.9 to 17.3.10 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.10/packages/compiler) Updates `@angular/compiler-cli` from 17.3.9 to 17.3.10 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.10/packages/compiler-cli) Updates `@angular/core` from 17.3.9 to 17.3.10 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.10/packages/core) Updates `@angular/elements` from 17.3.9 to 17.3.10 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.10/packages/elements) Updates `@angular/forms` from 17.3.9 to 17.3.10 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.10/packages/forms) Updates `@angular/platform-browser` from 17.3.9 to 17.3.10 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.10/packages/platform-browser) Updates `@angular/platform-browser-dynamic` from 17.3.9 to 17.3.10 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.10/packages/platform-browser-dynamic) Updates `@angular/router` from 17.3.9 to 17.3.10 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.10/packages/router) Updates `@angular-devkit/build-angular` from 17.3.7 to 17.3.8 - [Release notes](https://github.com/angular/angular-cli/releases) - [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular-cli/compare/17.3.7...17.3.8) Updates `@angular-eslint/builder` from 17.4.1 to 17.5.1 - [Release notes](https://github.com/angular-eslint/angular-eslint/releases) - [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/builder/CHANGELOG.md) - [Commits](https://github.com/angular-eslint/angular-eslint/commits/v17.5.1/packages/builder) Updates `@angular-eslint/eslint-plugin` from 17.4.1 to 17.5.1 - [Release notes](https://github.com/angular-eslint/angular-eslint/releases) - [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/angular-eslint/angular-eslint/commits/v17.5.1/packages/eslint-plugin) Updates `@angular-eslint/eslint-plugin-template` from 17.4.1 to 17.5.1 - [Release notes](https://github.com/angular-eslint/angular-eslint/releases) - [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/CHANGELOG.md) - [Commits](https://github.com/angular-eslint/angular-eslint/commits/v17.5.1/packages/eslint-plugin-template) Updates `@angular-eslint/template-parser` from 17.4.1 to 17.5.1 - [Release notes](https://github.com/angular-eslint/angular-eslint/releases) - [Changelog](https://github.com/angular-eslint/angular-eslint/blob/main/packages/template-parser/CHANGELOG.md) - [Commits](https://github.com/angular-eslint/angular-eslint/commits/v17.5.1/packages/template-parser) --- updated-dependencies: - dependency-name: "@angular/animations" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/cdk" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/cli" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/common" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/compiler" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/compiler-cli" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/core" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/elements" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/forms" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/platform-browser" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/platform-browser-dynamic" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular/router" dependency-type: direct:production update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular-devkit/build-angular" dependency-type: direct:development update-type: version-update:semver-patch dependency-group: angular - dependency-name: "@angular-eslint/builder" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: angular - dependency-name: "@angular-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: angular - dependency-name: "@angular-eslint/eslint-plugin-template" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: angular - dependency-name: "@angular-eslint/template-parser" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: angular ... Signed-off-by: dependabot[bot] <support@github.com> --- frontend/package-lock.json | 1161 +++++++++++++++++++++--------------- 1 file changed, 665 insertions(+), 496 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index b6b02f735a5a..d7fb10c6a8e3 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -260,11 +260,11 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1703.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.7.tgz", - "integrity": "sha512-SwXbdsZqEE3JtvujCLChAii+FA20d1931VDjDYffrGWdQEViTBAr4NKtDr/kOv8KkgiL3fhGibPnRNUHTeAMtg==", + "version": "0.1703.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.8.tgz", + "integrity": "sha512-lKxwG4/QABXZvJpqeSIn/kAwnY6MM9HdHZUV+o5o3UiTi+vO8rZApG4CCaITH3Bxebm7Nam7Xbk8RuukC5rq6g==", "dependencies": { - "@angular-devkit/core": "17.3.7", + "@angular-devkit/core": "17.3.8", "rxjs": "7.8.1" }, "engines": { @@ -274,14 +274,14 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.3.7.tgz", - "integrity": "sha512-AsV80kiFMIPIhm3uzJgOHDj4u6JteUkZedPTKAFFFJC7CTat1luW5qx306vfF7wj62aMvUl5g9HFWaeLghTQGA==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.3.8.tgz", + "integrity": "sha512-ixsdXggWaFRP7Jvxd0AMukImnePuGflT9Yy7NJ9/y0cL/k//S/3RnkQv5i411KzN+7D4RIbNkRGGTYeqH24zlg==", "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1703.7", - "@angular-devkit/build-webpack": "0.1703.7", - "@angular-devkit/core": "17.3.7", + "@angular-devkit/architect": "0.1703.8", + "@angular-devkit/build-webpack": "0.1703.8", + "@angular-devkit/core": "17.3.8", "@babel/core": "7.24.0", "@babel/generator": "7.23.6", "@babel/helper-annotate-as-pure": "7.22.5", @@ -292,7 +292,7 @@ "@babel/preset-env": "7.24.0", "@babel/runtime": "7.24.0", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "17.3.7", + "@ngtools/webpack": "17.3.8", "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.18", @@ -581,11 +581,11 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1703.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1703.7.tgz", - "integrity": "sha512-gpt2Ia5I1gmdp3hdbtB7tkZTba5qWmKeVhlCYswa/LvbceKmkjedoeNRAoyr1UKM9GeGqt6Xl1B2eHzCH+ykrg==", + "version": "0.1703.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1703.8.tgz", + "integrity": "sha512-9u6fl8VVOxcLOEMzrUeaybSvi9hSLSRucHnybneYrabsgreDo32tuy/4G8p6YAHQjpWEj9jvF9Um13ertdni5Q==", "dependencies": { - "@angular-devkit/architect": "0.1703.7", + "@angular-devkit/architect": "0.1703.8", "rxjs": "7.8.1" }, "engines": { @@ -599,9 +599,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.7.tgz", - "integrity": "sha512-qpZ7BShyqS/Jqld36E7kL02cyb2pjn1Az1p9439SbP8nsvJgYlsyjwYK2Kmcn/Wi+TZGIKxkqxgBBw9vqGgeJw==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.8.tgz", + "integrity": "sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==", "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", @@ -636,11 +636,11 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.7.tgz", - "integrity": "sha512-d7NKSwstdxYLYmPsbcYO3GOFNfXxXwOyHxSqDa1JNKoSzMdbLj4tvlCpfXw0ThNM7gioMx8aLBaaH1ac+yk06Q==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.8.tgz", + "integrity": "sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg==", "dependencies": { - "@angular-devkit/core": "17.3.7", + "@angular-devkit/core": "17.3.8", "jsonc-parser": "3.2.1", "magic-string": "0.30.8", "ora": "5.4.1", @@ -653,9 +653,9 @@ } }, "node_modules/@angular-eslint/builder": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.4.1.tgz", - "integrity": "sha512-UVnErsAGXTi8OChkoSxDVVGV2jkFpTaXQT+0fgapSwaOt3Ki7BVwJJoNaX0Zs01c64bjNPZ5ONb/i6nC8QiP9Q==", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.5.1.tgz", + "integrity": "sha512-PWnH1t/Tdrdh+JwTJ87iXW//n1DPf3zF2MeKKfw8tiNOKjmCReL09KTabv+1Tbnm5B0ih6eOWCUG1N9VmcCubg==", "dev": true, "dependencies": { "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", @@ -666,7 +666,70 @@ "typescript": "*" } }, + "node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.5.1.tgz", + "integrity": "sha512-2gYFcWsGcw3BytCzt6DzKNayOHhW1dhMAgttor94lXLYOYN82eLGomC+aZF/U6fqVGBjm5JIEJpWbNF+NawZ7w==", + "dev": true + }, "node_modules/@angular-eslint/eslint-plugin": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.5.1.tgz", + "integrity": "sha512-6/BLBJatp4DK9XtiVIh3UGIkZkikmtnV3tSvxtxG0LR1/zY+iWZIyQlmoJ42jRh3F0L46lmb14Z0iaIsPXuRGQ==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "17.5.1", + "@angular-eslint/utils": "17.5.1", + "@typescript-eslint/utils": "7.10.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.5.1.tgz", + "integrity": "sha512-OgTN6ogZSA7Fi/9Zfk3EZumr06MZPXyI7Y9A09WzkjgUikCXDNoYwvkT4Bh0jOtwDDhtAAFC9/TehJQj7f4o5A==", + "dev": true, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "17.5.1", + "@angular-eslint/utils": "17.5.1", + "@typescript-eslint/type-utils": "7.10.0", + "@typescript-eslint/utils": "7.10.0", + "aria-query": "5.3.0", + "axobject-query": "4.0.0" + }, + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/schematics": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.4.1.tgz", + "integrity": "sha512-CYpsGc0B/ZGO/RKYlyfeAi1pOvFmVs4pvoHU13uOdhdFJ6nAUTujHiBaULloIrUmuIhGW9S0g6w4ecD6ZP680w==", + "dev": true, + "dependencies": { + "@angular-eslint/eslint-plugin": "17.4.1", + "@angular-eslint/eslint-plugin-template": "17.4.1", + "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", + "ignore": "5.3.1", + "nx": "^17.2.8 || ^18.0.0 || ^19.0.0", + "strip-json-comments": "3.1.1", + "tmp": "0.2.3" + }, + "peerDependencies": { + "@angular/cli": ">= 17.0.0 < 18.0.0" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.4.1.tgz", + "integrity": "sha512-QKQGspxsyMHRwvzqo+Fj42TS/vmnwOHuWC6EN+5KBx3cuImahqFHQW842zVy9f65jfH2xDnNWJ+NW+Tzcgg+pQ==", + "dev": true + }, + "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/eslint-plugin": { "version": "17.4.1", "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.4.1.tgz", "integrity": "sha512-05bN1UB4H2CuX7Sw6fz+rMobsa+Bl3g15IYldH08hbJSnVemO8mf86bIjRN2Th79sO9WOiXXimnfIt7KRf8l0Q==", @@ -681,7 +744,7 @@ "typescript": "*" } }, - "node_modules/@angular-eslint/eslint-plugin-template": { + "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/eslint-plugin-template": { "version": "17.4.1", "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.4.1.tgz", "integrity": "sha512-oYP7yzOpn63g1Mpwc8F8ERiywaGRhAs27ttI9t+5NXaLrwHSfc/AJleC7jjkB5xu1p88JY1mb4oIYOjeZAhHIg==", @@ -699,13 +762,7 @@ "typescript": "*" } }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.4.1.tgz", - "integrity": "sha512-QKQGspxsyMHRwvzqo+Fj42TS/vmnwOHuWC6EN+5KBx3cuImahqFHQW842zVy9f65jfH2xDnNWJ+NW+Tzcgg+pQ==", - "dev": true - }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@angular-eslint/utils": { + "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/utils": { "version": "17.4.1", "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.4.1.tgz", "integrity": "sha512-ptpWSrN7hfLtbStOB5vlwjh088WRu+sT1XIXCROrX5uXR5sQMu5ZitnoObSe+Of+1lugguPvMvFm/pzTMp3LIg==", @@ -719,19 +776,16 @@ "typescript": "*" } }, - "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@typescript-eslint/utils": { + "node_modules/@angular-eslint/schematics/node_modules/@typescript-eslint/type-utils": { "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", - "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", + "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", "@typescript-eslint/typescript-estree": "7.8.0", - "semver": "^7.6.0" + "@typescript-eslint/utils": "7.8.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -742,29 +796,14 @@ }, "peerDependencies": { "eslint": "^8.56.0" - } - }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.4.1.tgz", - "integrity": "sha512-QKQGspxsyMHRwvzqo+Fj42TS/vmnwOHuWC6EN+5KBx3cuImahqFHQW842zVy9f65jfH2xDnNWJ+NW+Tzcgg+pQ==", - "dev": true - }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/@angular-eslint/utils": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.4.1.tgz", - "integrity": "sha512-ptpWSrN7hfLtbStOB5vlwjh088WRu+sT1XIXCROrX5uXR5sQMu5ZitnoObSe+Of+1lugguPvMvFm/pzTMp3LIg==", - "dev": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.4.1", - "@typescript-eslint/utils": "7.8.0" }, - "peerDependencies": { - "eslint": "^7.20.0 || ^8.0.0", - "typescript": "*" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@angular-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "node_modules/@angular-eslint/schematics/node_modules/@typescript-eslint/utils": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", @@ -789,48 +828,38 @@ "eslint": "^8.56.0" } }, - "node_modules/@angular-eslint/schematics": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.4.1.tgz", - "integrity": "sha512-CYpsGc0B/ZGO/RKYlyfeAi1pOvFmVs4pvoHU13uOdhdFJ6nAUTujHiBaULloIrUmuIhGW9S0g6w4ecD6ZP680w==", + "node_modules/@angular-eslint/template-parser": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.5.1.tgz", + "integrity": "sha512-DJcYacYEb17uUlQFYIKSjmlzWJEfev5pOMddDewV3h6oVm4T77X1SH/u8n5Oz1Zy13TrLWponwFORCKhg7nOfg==", "dev": true, "dependencies": { - "@angular-eslint/eslint-plugin": "17.4.1", - "@angular-eslint/eslint-plugin-template": "17.4.1", - "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", - "ignore": "5.3.1", - "nx": "^17.2.8 || ^18.0.0 || ^19.0.0", - "strip-json-comments": "3.1.1", - "tmp": "0.2.3" + "@angular-eslint/bundled-angular-compiler": "17.5.1", + "eslint-scope": "^8.0.0" }, "peerDependencies": { - "@angular/cli": ">= 17.0.0 < 18.0.0" + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" } }, - "node_modules/@angular-eslint/template-parser": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.4.1.tgz", - "integrity": "sha512-fJQpwQXexgs7Z3yYpQAfuAkFB2Y5H8SSlo+eAPPafOOPpPSIm/yP4dQ2e06tE8zWB5yjYnVBMJnUKSmG5GJSDw==", + "node_modules/@angular-eslint/utils": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.5.1.tgz", + "integrity": "sha512-Rji1fC9OLDzRaeM2Aven0HdEnqaIgLn5cD6JQphTi1o4TzIXAcSrB9g52dVkH3RnqtOGYSIfFpA6+lQfn7wLOA==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "17.4.1", - "eslint-scope": "^8.0.0" + "@angular-eslint/bundled-angular-compiler": "17.5.1", + "@typescript-eslint/utils": "7.10.0" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", "typescript": "*" } }, - "node_modules/@angular-eslint/template-parser/node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.4.1.tgz", - "integrity": "sha512-QKQGspxsyMHRwvzqo+Fj42TS/vmnwOHuWC6EN+5KBx3cuImahqFHQW842zVy9f65jfH2xDnNWJ+NW+Tzcgg+pQ==", - "dev": true - }, "node_modules/@angular/animations": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.9.tgz", - "integrity": "sha512-9fSFF9Y+pKZGgGEK3IlVy9msS7LRFpD1h2rJ80N6n1k51jiKcTgOcFPPYwLNJZ2fkp+qrOAMo3ez4WYQgVPoow==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.10.tgz", + "integrity": "sha512-9fR5snTuG4aM2K54TG/6DXcKXMDKZMovZhjQOxO8l68/oqn6fKrHs8DLzckFs0XGRZ+2OyURH8WggFm1Z828rA==", "dependencies": { "tslib": "^2.3.0" }, @@ -838,13 +867,13 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.3.9" + "@angular/core": "17.3.10" } }, "node_modules/@angular/cdk": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.3.9.tgz", - "integrity": "sha512-N/7Is+FkIIql5UEL/I+PV6THw+yXNCCGGpwimf/yaNgT9y1fHAmBWhDY0oQqFjCuD+kXl9gQL0ONfsl5Nlnk+w==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.3.10.tgz", + "integrity": "sha512-b1qktT2c1TTTe5nTji/kFAVW92fULK0YhYAvJ+BjZTPKu2FniZNe8o4qqQ0pUuvtMu+ZQxp/QqFYoidIVCjScg==", "dependencies": { "tslib": "^2.3.0" }, @@ -858,14 +887,14 @@ } }, "node_modules/@angular/cli": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.3.7.tgz", - "integrity": "sha512-JgCav3sdRCoJHwLXxmF/EMzArYjwbqB+AGUW/xIR98oZET8QxCB985bOFUAm02SkAEUVcMJvjxec+WCaa60m/A==", - "dependencies": { - "@angular-devkit/architect": "0.1703.7", - "@angular-devkit/core": "17.3.7", - "@angular-devkit/schematics": "17.3.7", - "@schematics/angular": "17.3.7", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.3.8.tgz", + "integrity": "sha512-X5ZOQ6ZTKVHjhIsfl32ZRqbs+FUoeHLbT7x4fh2Os/8ObDDwrUcCJPqxe2b2RB5E2d0vepYigknHeLE7gwzlNQ==", + "dependencies": { + "@angular-devkit/architect": "0.1703.8", + "@angular-devkit/core": "17.3.8", + "@angular-devkit/schematics": "17.3.8", + "@schematics/angular": "17.3.8", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.2", @@ -891,9 +920,9 @@ } }, "node_modules/@angular/common": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.9.tgz", - "integrity": "sha512-tH1VfbAvNVaz6ZYa+q0DiKtbmUql1jK/3q/af74B8nVjKLHcXVWwxvBayqvrmlUt7FGANGkETIcCWrB44k47Ug==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.10.tgz", + "integrity": "sha512-6SfD21M3LujymmZsZQIxAsV8Bj5u6He6ImZ+p2rr7FAhFxpVJyKldK8LCmJcFsBD4srpQcxEZ0iDxXvg+0ihAw==", "dependencies": { "tslib": "^2.3.0" }, @@ -901,14 +930,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.3.9", + "@angular/core": "17.3.10", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.9.tgz", - "integrity": "sha512-2d4bPbNm7O2GanqCj5GFgPDnmjbAcsQM502Jnvcv7Aje82yecT69JoqAVRqGOfbbxwlJiPhi31D8DPdLaOz47Q==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.10.tgz", + "integrity": "sha512-6Ce4siHyF0fCZBDm/cz+blJByGDu1/hbPkQVGmk5HGZTmCUeKkgyjoM6bZr7ssAsyGDRwxBh2SGHO4Ce31vuPA==", "dependencies": { "tslib": "^2.3.0" }, @@ -916,7 +945,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.3.9" + "@angular/core": "17.3.10" }, "peerDependenciesMeta": { "@angular/core": { @@ -925,9 +954,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.9.tgz", - "integrity": "sha512-J6aqoz5wqPWaurbZFUZ7iMUlzAJYXzntziJJbalm6ceXfUWEe2Vm67nGUROWCIFvO3kWXvkgYX4ubnqtod2AxA==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.10.tgz", + "integrity": "sha512-85SBphqRj3szac3FbeYgEZ+I6WaAlo5h7JX06BdjOLLiaoIwlFhLeAuG+jVekseV+95grFUxIsCMphWHi2e6hQ==", "dependencies": { "@babel/core": "7.23.9", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -947,7 +976,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.3.9", + "@angular/compiler": "17.3.10", "typescript": ">=5.2 <5.5" } }, @@ -999,9 +1028,9 @@ "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" }, "node_modules/@angular/core": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.9.tgz", - "integrity": "sha512-x+h5BQ6islvYWGVLTz1CEgNq1/5IYngQ+Inq/tWayM6jN7RPOCydCCbCw+uOZS7MgFebkP0gYTVm14y1MRFKSQ==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.10.tgz", + "integrity": "sha512-ocEKu7X0yFCOvgJn1uZy76qjhsjKvULrO1k/BuIX0nwhp61DTGYTvCqKmwCBLM8/gvcKYH5vMKMHoQKtiSGE0A==", "dependencies": { "tslib": "^2.3.0" }, @@ -1014,9 +1043,9 @@ } }, "node_modules/@angular/elements": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-17.3.9.tgz", - "integrity": "sha512-DGGy6WD9Jhb+ppK1jgGshcz6CgEFzexvtpyuCYk2c3gNGKCnEFv6n13wB1S8dHt3ID9QdGcM3LIvdynmcSudzg==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-17.3.10.tgz", + "integrity": "sha512-rARoZx0wBlouAQot2ItD0h0gCKbKfa43S2545wiqcIVxrkxYMhyX54GDbUv8zQzd7YBUguITeGjaIC9hKFLeqQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -1024,14 +1053,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.3.9", + "@angular/core": "17.3.10", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/forms": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.9.tgz", - "integrity": "sha512-5b8OjK0kLghrdxkVWglgerHVp9D5WvXInXwo1KIyc2v/fGdTlyu/RFi0GLGvzq2y+7Z8TvtXWC82SB47vfx3TQ==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.10.tgz", + "integrity": "sha512-0VZWSXDi2M3DAGJlpdV3lo73Yo/73GPRqmfTOrvIoUIenFg5Dz6oNGzvt/1aRkRn6HKccjix6iMpH91EN65pWA==", "dependencies": { "tslib": "^2.3.0" }, @@ -1039,9 +1068,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.3.9", - "@angular/core": "17.3.9", - "@angular/platform-browser": "17.3.9", + "@angular/common": "17.3.10", + "@angular/core": "17.3.10", + "@angular/platform-browser": "17.3.10", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1055,9 +1084,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.9.tgz", - "integrity": "sha512-vMwHO76rnkz7aV3KHKy23KUFAo/+b0+yHPa6AND5Lee8z5C1J/tA2PdetFAsghlQQsX61JeK4MFJV/f3dFm2dw==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.10.tgz", + "integrity": "sha512-LEhBDOKm2A7nRmZqsafVp6OinRDG1OYZBSqjnT1jZ+f0CRRFIXz6aJ0TMPoU6vq9SLRJ7vrGD9P/eBf2hW00NQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -1065,9 +1094,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/animations": "17.3.9", - "@angular/common": "17.3.9", - "@angular/core": "17.3.9" + "@angular/animations": "17.3.10", + "@angular/common": "17.3.10", + "@angular/core": "17.3.10" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1076,9 +1105,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.9.tgz", - "integrity": "sha512-Jmth4hFC4dZsWQRkxB++42sR1pfJUoQbErANrKQMgEPb8H4cLRdB1mAQ6f+OASPBM+FsxDxjXq2kepyLGtF2Vg==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.10.tgz", + "integrity": "sha512-TW6G4+isdHM2ssQTRTobeAKtR2516pJ25BSwRb+9+Jw/ZAEYOOi+KQyofIFYQccaUjb3+LpjRcaZbtZ9m/Ispg==", "dependencies": { "tslib": "^2.3.0" }, @@ -1086,16 +1115,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.3.9", - "@angular/compiler": "17.3.9", - "@angular/core": "17.3.9", - "@angular/platform-browser": "17.3.9" + "@angular/common": "17.3.10", + "@angular/compiler": "17.3.10", + "@angular/core": "17.3.10", + "@angular/platform-browser": "17.3.10" } }, "node_modules/@angular/router": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.9.tgz", - "integrity": "sha512-0cRF5YBJoDbXGQsRs3wEG+DPvN4PlhEqTa0DkTr9QIDJRg5P1uiDlOclV+w3OxEMsLrmXGmhjauHaWQk07M4LA==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.10.tgz", + "integrity": "sha512-HlZlR9BOLoEKGOSMjmL5EfYL7F7PeDifbFi0dYWNcrG8zFrVKFklB1cuBdJhfPZgYhDEoGms/EToD71tg5wliA==", "dependencies": { "tslib": "^2.3.0" }, @@ -1103,9 +1132,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.3.9", - "@angular/core": "17.3.9", - "@angular/platform-browser": "17.3.9", + "@angular/common": "17.3.10", + "@angular/core": "17.3.10", + "@angular/platform-browser": "17.3.10", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -4035,9 +4064,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.3.7.tgz", - "integrity": "sha512-kQNS68jsPQlaWAnKcVeFKNHp6K90uQANvq+9oXb/i+JnYWzuBsHzn2r8bVdMmvjd1HdBRiGtg767XRk3u+jgRw==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.3.8.tgz", + "integrity": "sha512-CjSVVa/9fzMpEDQP01SC4colKCbZwj7vUq0H2bivp8jVsmd21x9Fu0gDBH0Y9NdfAIm4eGZvmiZKMII3vIOaYQ==", "engines": { "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", @@ -5094,12 +5123,12 @@ ] }, "node_modules/@schematics/angular": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.7.tgz", - "integrity": "sha512-HaJroKaberriP4wFefTTSVFrtU9GMvnG3I6ELbOteOyKMH7o2V91FXGJDJ5KnIiLRlBmC30G3r+9Ybc/rtAYkw==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.8.tgz", + "integrity": "sha512-2g4OmSyE9YGq50Uj7fNI26P/TSAFJ7ZuirwTF2O7Xc4XRQ29/tYIIqhezpNlTb6rlYblcQuMcUZBrMfWJHcqJw==", "dependencies": { - "@angular-devkit/core": "17.3.7", - "@angular-devkit/schematics": "17.3.7", + "@angular-devkit/core": "17.3.8", + "@angular-devkit/schematics": "17.3.8", "jsonc-parser": "3.2.1" }, "engines": { @@ -5739,33 +5768,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.10.0.tgz", - "integrity": "sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "7.10.0", - "@typescript-eslint/utils": "7.10.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", @@ -5779,56 +5781,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", - "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.10.0.tgz", - "integrity": "sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.10.0", - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/typescript-estree": "7.10.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", @@ -5846,30 +5798,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/parser": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.10.0.tgz", @@ -6015,13 +5943,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", - "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.10.0.tgz", + "integrity": "sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.8.0", - "@typescript-eslint/utils": "7.8.0", + "@typescript-eslint/typescript-estree": "7.10.0", + "@typescript-eslint/utils": "7.10.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -6041,45 +5969,102 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", - "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", + "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "semver": "^7.6.0" - }, "engines": { "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" } }, - "node_modules/@typescript-eslint/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", - "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", + "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, "engines": { "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", + "integrity": "sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.10.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", + "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", @@ -6131,6 +6116,127 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@typescript-eslint/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.10.0", + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/typescript-estree": "7.10.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz", + "integrity": "sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", + "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", + "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", + "integrity": "sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.10.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", @@ -22520,23 +22626,23 @@ } }, "@angular-devkit/architect": { - "version": "0.1703.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.7.tgz", - "integrity": "sha512-SwXbdsZqEE3JtvujCLChAii+FA20d1931VDjDYffrGWdQEViTBAr4NKtDr/kOv8KkgiL3fhGibPnRNUHTeAMtg==", + "version": "0.1703.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1703.8.tgz", + "integrity": "sha512-lKxwG4/QABXZvJpqeSIn/kAwnY6MM9HdHZUV+o5o3UiTi+vO8rZApG4CCaITH3Bxebm7Nam7Xbk8RuukC5rq6g==", "requires": { - "@angular-devkit/core": "17.3.7", + "@angular-devkit/core": "17.3.8", "rxjs": "7.8.1" } }, "@angular-devkit/build-angular": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.3.7.tgz", - "integrity": "sha512-AsV80kiFMIPIhm3uzJgOHDj4u6JteUkZedPTKAFFFJC7CTat1luW5qx306vfF7wj62aMvUl5g9HFWaeLghTQGA==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-17.3.8.tgz", + "integrity": "sha512-ixsdXggWaFRP7Jvxd0AMukImnePuGflT9Yy7NJ9/y0cL/k//S/3RnkQv5i411KzN+7D4RIbNkRGGTYeqH24zlg==", "requires": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1703.7", - "@angular-devkit/build-webpack": "0.1703.7", - "@angular-devkit/core": "17.3.7", + "@angular-devkit/architect": "0.1703.8", + "@angular-devkit/build-webpack": "0.1703.8", + "@angular-devkit/core": "17.3.8", "@babel/core": "7.24.0", "@babel/generator": "7.23.6", "@babel/helper-annotate-as-pure": "7.22.5", @@ -22547,7 +22653,7 @@ "@babel/preset-env": "7.24.0", "@babel/runtime": "7.24.0", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "17.3.7", + "@ngtools/webpack": "17.3.8", "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.18", @@ -22712,18 +22818,18 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.1703.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1703.7.tgz", - "integrity": "sha512-gpt2Ia5I1gmdp3hdbtB7tkZTba5qWmKeVhlCYswa/LvbceKmkjedoeNRAoyr1UKM9GeGqt6Xl1B2eHzCH+ykrg==", + "version": "0.1703.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1703.8.tgz", + "integrity": "sha512-9u6fl8VVOxcLOEMzrUeaybSvi9hSLSRucHnybneYrabsgreDo32tuy/4G8p6YAHQjpWEj9jvF9Um13ertdni5Q==", "requires": { - "@angular-devkit/architect": "0.1703.7", + "@angular-devkit/architect": "0.1703.8", "rxjs": "7.8.1" } }, "@angular-devkit/core": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.7.tgz", - "integrity": "sha512-qpZ7BShyqS/Jqld36E7kL02cyb2pjn1Az1p9439SbP8nsvJgYlsyjwYK2Kmcn/Wi+TZGIKxkqxgBBw9vqGgeJw==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.8.tgz", + "integrity": "sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==", "requires": { "ajv": "8.12.0", "ajv-formats": "2.1.1", @@ -22741,11 +22847,11 @@ } }, "@angular-devkit/schematics": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.7.tgz", - "integrity": "sha512-d7NKSwstdxYLYmPsbcYO3GOFNfXxXwOyHxSqDa1JNKoSzMdbLj4tvlCpfXw0ThNM7gioMx8aLBaaH1ac+yk06Q==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.8.tgz", + "integrity": "sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg==", "requires": { - "@angular-devkit/core": "17.3.7", + "@angular-devkit/core": "17.3.8", "jsonc-parser": "3.2.1", "magic-string": "0.30.8", "ora": "5.4.1", @@ -22753,24 +22859,59 @@ } }, "@angular-eslint/builder": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.4.1.tgz", - "integrity": "sha512-UVnErsAGXTi8OChkoSxDVVGV2jkFpTaXQT+0fgapSwaOt3Ki7BVwJJoNaX0Zs01c64bjNPZ5ONb/i6nC8QiP9Q==", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-17.5.1.tgz", + "integrity": "sha512-PWnH1t/Tdrdh+JwTJ87iXW//n1DPf3zF2MeKKfw8tiNOKjmCReL09KTabv+1Tbnm5B0ih6eOWCUG1N9VmcCubg==", "dev": true, "requires": { "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", "nx": "^17.2.8 || ^18.0.0 || ^19.0.0" } }, + "@angular-eslint/bundled-angular-compiler": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.5.1.tgz", + "integrity": "sha512-2gYFcWsGcw3BytCzt6DzKNayOHhW1dhMAgttor94lXLYOYN82eLGomC+aZF/U6fqVGBjm5JIEJpWbNF+NawZ7w==", + "dev": true + }, "@angular-eslint/eslint-plugin": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.5.1.tgz", + "integrity": "sha512-6/BLBJatp4DK9XtiVIh3UGIkZkikmtnV3tSvxtxG0LR1/zY+iWZIyQlmoJ42jRh3F0L46lmb14Z0iaIsPXuRGQ==", + "dev": true, + "requires": { + "@angular-eslint/bundled-angular-compiler": "17.5.1", + "@angular-eslint/utils": "17.5.1", + "@typescript-eslint/utils": "7.10.0" + } + }, + "@angular-eslint/eslint-plugin-template": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.5.1.tgz", + "integrity": "sha512-OgTN6ogZSA7Fi/9Zfk3EZumr06MZPXyI7Y9A09WzkjgUikCXDNoYwvkT4Bh0jOtwDDhtAAFC9/TehJQj7f4o5A==", + "dev": true, + "requires": { + "@angular-eslint/bundled-angular-compiler": "17.5.1", + "@angular-eslint/utils": "17.5.1", + "@typescript-eslint/type-utils": "7.10.0", + "@typescript-eslint/utils": "7.10.0", + "aria-query": "5.3.0", + "axobject-query": "4.0.0" + } + }, + "@angular-eslint/schematics": { "version": "17.4.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.4.1.tgz", - "integrity": "sha512-05bN1UB4H2CuX7Sw6fz+rMobsa+Bl3g15IYldH08hbJSnVemO8mf86bIjRN2Th79sO9WOiXXimnfIt7KRf8l0Q==", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.4.1.tgz", + "integrity": "sha512-CYpsGc0B/ZGO/RKYlyfeAi1pOvFmVs4pvoHU13uOdhdFJ6nAUTujHiBaULloIrUmuIhGW9S0g6w4ecD6ZP680w==", "dev": true, "requires": { - "@angular-eslint/bundled-angular-compiler": "17.4.1", - "@angular-eslint/utils": "17.4.1", - "@typescript-eslint/utils": "7.8.0" + "@angular-eslint/eslint-plugin": "17.4.1", + "@angular-eslint/eslint-plugin-template": "17.4.1", + "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", + "ignore": "5.3.1", + "nx": "^17.2.8 || ^18.0.0 || ^19.0.0", + "strip-json-comments": "3.1.1", + "tmp": "0.2.3" }, "dependencies": { "@angular-eslint/bundled-angular-compiler": { @@ -22779,52 +22920,30 @@ "integrity": "sha512-QKQGspxsyMHRwvzqo+Fj42TS/vmnwOHuWC6EN+5KBx3cuImahqFHQW842zVy9f65jfH2xDnNWJ+NW+Tzcgg+pQ==", "dev": true }, - "@angular-eslint/utils": { + "@angular-eslint/eslint-plugin": { "version": "17.4.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.4.1.tgz", - "integrity": "sha512-ptpWSrN7hfLtbStOB5vlwjh088WRu+sT1XIXCROrX5uXR5sQMu5ZitnoObSe+Of+1lugguPvMvFm/pzTMp3LIg==", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-17.4.1.tgz", + "integrity": "sha512-05bN1UB4H2CuX7Sw6fz+rMobsa+Bl3g15IYldH08hbJSnVemO8mf86bIjRN2Th79sO9WOiXXimnfIt7KRf8l0Q==", "dev": true, "requires": { "@angular-eslint/bundled-angular-compiler": "17.4.1", + "@angular-eslint/utils": "17.4.1", "@typescript-eslint/utils": "7.8.0" } }, - "@typescript-eslint/utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", - "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", + "@angular-eslint/eslint-plugin-template": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.4.1.tgz", + "integrity": "sha512-oYP7yzOpn63g1Mpwc8F8ERiywaGRhAs27ttI9t+5NXaLrwHSfc/AJleC7jjkB5xu1p88JY1mb4oIYOjeZAhHIg==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "semver": "^7.6.0" + "@angular-eslint/bundled-angular-compiler": "17.4.1", + "@angular-eslint/utils": "17.4.1", + "@typescript-eslint/type-utils": "7.8.0", + "@typescript-eslint/utils": "7.8.0", + "aria-query": "5.3.0", + "axobject-query": "4.0.0" } - } - } - }, - "@angular-eslint/eslint-plugin-template": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-17.4.1.tgz", - "integrity": "sha512-oYP7yzOpn63g1Mpwc8F8ERiywaGRhAs27ttI9t+5NXaLrwHSfc/AJleC7jjkB5xu1p88JY1mb4oIYOjeZAhHIg==", - "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "17.4.1", - "@angular-eslint/utils": "17.4.1", - "@typescript-eslint/type-utils": "7.8.0", - "@typescript-eslint/utils": "7.8.0", - "aria-query": "5.3.0", - "axobject-query": "4.0.0" - }, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.4.1.tgz", - "integrity": "sha512-QKQGspxsyMHRwvzqo+Fj42TS/vmnwOHuWC6EN+5KBx3cuImahqFHQW842zVy9f65jfH2xDnNWJ+NW+Tzcgg+pQ==", - "dev": true }, "@angular-eslint/utils": { "version": "17.4.1", @@ -22836,6 +22955,18 @@ "@typescript-eslint/utils": "7.8.0" } }, + "@typescript-eslint/type-utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", + "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/utils": "7.8.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + } + }, "@typescript-eslint/utils": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", @@ -22853,65 +22984,52 @@ } } }, - "@angular-eslint/schematics": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-17.4.1.tgz", - "integrity": "sha512-CYpsGc0B/ZGO/RKYlyfeAi1pOvFmVs4pvoHU13uOdhdFJ6nAUTujHiBaULloIrUmuIhGW9S0g6w4ecD6ZP680w==", + "@angular-eslint/template-parser": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.5.1.tgz", + "integrity": "sha512-DJcYacYEb17uUlQFYIKSjmlzWJEfev5pOMddDewV3h6oVm4T77X1SH/u8n5Oz1Zy13TrLWponwFORCKhg7nOfg==", "dev": true, "requires": { - "@angular-eslint/eslint-plugin": "17.4.1", - "@angular-eslint/eslint-plugin-template": "17.4.1", - "@nx/devkit": "^17.2.8 || ^18.0.0 || ^19.0.0", - "ignore": "5.3.1", - "nx": "^17.2.8 || ^18.0.0 || ^19.0.0", - "strip-json-comments": "3.1.1", - "tmp": "0.2.3" + "@angular-eslint/bundled-angular-compiler": "17.5.1", + "eslint-scope": "^8.0.0" } }, - "@angular-eslint/template-parser": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-17.4.1.tgz", - "integrity": "sha512-fJQpwQXexgs7Z3yYpQAfuAkFB2Y5H8SSlo+eAPPafOOPpPSIm/yP4dQ2e06tE8zWB5yjYnVBMJnUKSmG5GJSDw==", + "@angular-eslint/utils": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-17.5.1.tgz", + "integrity": "sha512-Rji1fC9OLDzRaeM2Aven0HdEnqaIgLn5cD6JQphTi1o4TzIXAcSrB9g52dVkH3RnqtOGYSIfFpA6+lQfn7wLOA==", "dev": true, "requires": { - "@angular-eslint/bundled-angular-compiler": "17.4.1", - "eslint-scope": "^8.0.0" - }, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": { - "version": "17.4.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-17.4.1.tgz", - "integrity": "sha512-QKQGspxsyMHRwvzqo+Fj42TS/vmnwOHuWC6EN+5KBx3cuImahqFHQW842zVy9f65jfH2xDnNWJ+NW+Tzcgg+pQ==", - "dev": true - } + "@angular-eslint/bundled-angular-compiler": "17.5.1", + "@typescript-eslint/utils": "7.10.0" } }, "@angular/animations": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.9.tgz", - "integrity": "sha512-9fSFF9Y+pKZGgGEK3IlVy9msS7LRFpD1h2rJ80N6n1k51jiKcTgOcFPPYwLNJZ2fkp+qrOAMo3ez4WYQgVPoow==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.10.tgz", + "integrity": "sha512-9fR5snTuG4aM2K54TG/6DXcKXMDKZMovZhjQOxO8l68/oqn6fKrHs8DLzckFs0XGRZ+2OyURH8WggFm1Z828rA==", "requires": { "tslib": "^2.3.0" } }, "@angular/cdk": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.3.9.tgz", - "integrity": "sha512-N/7Is+FkIIql5UEL/I+PV6THw+yXNCCGGpwimf/yaNgT9y1fHAmBWhDY0oQqFjCuD+kXl9gQL0ONfsl5Nlnk+w==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-17.3.10.tgz", + "integrity": "sha512-b1qktT2c1TTTe5nTji/kFAVW92fULK0YhYAvJ+BjZTPKu2FniZNe8o4qqQ0pUuvtMu+ZQxp/QqFYoidIVCjScg==", "requires": { "parse5": "^7.1.2", "tslib": "^2.3.0" } }, "@angular/cli": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.3.7.tgz", - "integrity": "sha512-JgCav3sdRCoJHwLXxmF/EMzArYjwbqB+AGUW/xIR98oZET8QxCB985bOFUAm02SkAEUVcMJvjxec+WCaa60m/A==", - "requires": { - "@angular-devkit/architect": "0.1703.7", - "@angular-devkit/core": "17.3.7", - "@angular-devkit/schematics": "17.3.7", - "@schematics/angular": "17.3.7", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-17.3.8.tgz", + "integrity": "sha512-X5ZOQ6ZTKVHjhIsfl32ZRqbs+FUoeHLbT7x4fh2Os/8ObDDwrUcCJPqxe2b2RB5E2d0vepYigknHeLE7gwzlNQ==", + "requires": { + "@angular-devkit/architect": "0.1703.8", + "@angular-devkit/core": "17.3.8", + "@angular-devkit/schematics": "17.3.8", + "@schematics/angular": "17.3.8", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.2", @@ -22929,25 +23047,25 @@ } }, "@angular/common": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.9.tgz", - "integrity": "sha512-tH1VfbAvNVaz6ZYa+q0DiKtbmUql1jK/3q/af74B8nVjKLHcXVWwxvBayqvrmlUt7FGANGkETIcCWrB44k47Ug==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.10.tgz", + "integrity": "sha512-6SfD21M3LujymmZsZQIxAsV8Bj5u6He6ImZ+p2rr7FAhFxpVJyKldK8LCmJcFsBD4srpQcxEZ0iDxXvg+0ihAw==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.9.tgz", - "integrity": "sha512-2d4bPbNm7O2GanqCj5GFgPDnmjbAcsQM502Jnvcv7Aje82yecT69JoqAVRqGOfbbxwlJiPhi31D8DPdLaOz47Q==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.10.tgz", + "integrity": "sha512-6Ce4siHyF0fCZBDm/cz+blJByGDu1/hbPkQVGmk5HGZTmCUeKkgyjoM6bZr7ssAsyGDRwxBh2SGHO4Ce31vuPA==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler-cli": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.9.tgz", - "integrity": "sha512-J6aqoz5wqPWaurbZFUZ7iMUlzAJYXzntziJJbalm6ceXfUWEe2Vm67nGUROWCIFvO3kWXvkgYX4ubnqtod2AxA==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.10.tgz", + "integrity": "sha512-85SBphqRj3szac3FbeYgEZ+I6WaAlo5h7JX06BdjOLLiaoIwlFhLeAuG+jVekseV+95grFUxIsCMphWHi2e6hQ==", "requires": { "@babel/core": "7.23.9", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -23001,25 +23119,25 @@ } }, "@angular/core": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.9.tgz", - "integrity": "sha512-x+h5BQ6islvYWGVLTz1CEgNq1/5IYngQ+Inq/tWayM6jN7RPOCydCCbCw+uOZS7MgFebkP0gYTVm14y1MRFKSQ==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.10.tgz", + "integrity": "sha512-ocEKu7X0yFCOvgJn1uZy76qjhsjKvULrO1k/BuIX0nwhp61DTGYTvCqKmwCBLM8/gvcKYH5vMKMHoQKtiSGE0A==", "requires": { "tslib": "^2.3.0" } }, "@angular/elements": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-17.3.9.tgz", - "integrity": "sha512-DGGy6WD9Jhb+ppK1jgGshcz6CgEFzexvtpyuCYk2c3gNGKCnEFv6n13wB1S8dHt3ID9QdGcM3LIvdynmcSudzg==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-17.3.10.tgz", + "integrity": "sha512-rARoZx0wBlouAQot2ItD0h0gCKbKfa43S2545wiqcIVxrkxYMhyX54GDbUv8zQzd7YBUguITeGjaIC9hKFLeqQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/forms": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.9.tgz", - "integrity": "sha512-5b8OjK0kLghrdxkVWglgerHVp9D5WvXInXwo1KIyc2v/fGdTlyu/RFi0GLGvzq2y+7Z8TvtXWC82SB47vfx3TQ==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.10.tgz", + "integrity": "sha512-0VZWSXDi2M3DAGJlpdV3lo73Yo/73GPRqmfTOrvIoUIenFg5Dz6oNGzvt/1aRkRn6HKccjix6iMpH91EN65pWA==", "requires": { "tslib": "^2.3.0" } @@ -23031,25 +23149,25 @@ "dev": true }, "@angular/platform-browser": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.9.tgz", - "integrity": "sha512-vMwHO76rnkz7aV3KHKy23KUFAo/+b0+yHPa6AND5Lee8z5C1J/tA2PdetFAsghlQQsX61JeK4MFJV/f3dFm2dw==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.10.tgz", + "integrity": "sha512-LEhBDOKm2A7nRmZqsafVp6OinRDG1OYZBSqjnT1jZ+f0CRRFIXz6aJ0TMPoU6vq9SLRJ7vrGD9P/eBf2hW00NQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser-dynamic": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.9.tgz", - "integrity": "sha512-Jmth4hFC4dZsWQRkxB++42sR1pfJUoQbErANrKQMgEPb8H4cLRdB1mAQ6f+OASPBM+FsxDxjXq2kepyLGtF2Vg==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.10.tgz", + "integrity": "sha512-TW6G4+isdHM2ssQTRTobeAKtR2516pJ25BSwRb+9+Jw/ZAEYOOi+KQyofIFYQccaUjb3+LpjRcaZbtZ9m/Ispg==", "requires": { "tslib": "^2.3.0" } }, "@angular/router": { - "version": "17.3.9", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.9.tgz", - "integrity": "sha512-0cRF5YBJoDbXGQsRs3wEG+DPvN4PlhEqTa0DkTr9QIDJRg5P1uiDlOclV+w3OxEMsLrmXGmhjauHaWQk07M4LA==", + "version": "17.3.10", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.10.tgz", + "integrity": "sha512-HlZlR9BOLoEKGOSMjmL5EfYL7F7PeDifbFi0dYWNcrG8zFrVKFklB1cuBdJhfPZgYhDEoGms/EToD71tg5wliA==", "requires": { "tslib": "^2.3.0" } @@ -25057,9 +25175,9 @@ } }, "@ngtools/webpack": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.3.7.tgz", - "integrity": "sha512-kQNS68jsPQlaWAnKcVeFKNHp6K90uQANvq+9oXb/i+JnYWzuBsHzn2r8bVdMmvjd1HdBRiGtg767XRk3u+jgRw==" + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-17.3.8.tgz", + "integrity": "sha512-CjSVVa/9fzMpEDQP01SC4colKCbZwj7vUq0H2bivp8jVsmd21x9Fu0gDBH0Y9NdfAIm4eGZvmiZKMII3vIOaYQ==" }, "@ngx-formly/core": { "version": "6.3.0", @@ -25751,12 +25869,12 @@ "optional": true }, "@schematics/angular": { - "version": "17.3.7", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.7.tgz", - "integrity": "sha512-HaJroKaberriP4wFefTTSVFrtU9GMvnG3I6ELbOteOyKMH7o2V91FXGJDJ5KnIiLRlBmC30G3r+9Ybc/rtAYkw==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-17.3.8.tgz", + "integrity": "sha512-2g4OmSyE9YGq50Uj7fNI26P/TSAFJ7ZuirwTF2O7Xc4XRQ29/tYIIqhezpNlTb6rlYblcQuMcUZBrMfWJHcqJw==", "requires": { - "@angular-devkit/core": "17.3.7", - "@angular-devkit/schematics": "17.3.7", + "@angular-devkit/core": "17.3.8", + "@angular-devkit/schematics": "17.3.8", "jsonc-parser": "3.2.1" } }, @@ -26311,52 +26429,12 @@ "@typescript-eslint/visitor-keys": "7.10.0" } }, - "@typescript-eslint/type-utils": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.10.0.tgz", - "integrity": "sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "7.10.0", - "@typescript-eslint/utils": "7.10.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - } - }, "@typescript-eslint/types": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", "dev": true }, - "@typescript-eslint/typescript-estree": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", - "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", - "dev": true, - "requires": { - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/utils": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.10.0.tgz", - "integrity": "sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.10.0", - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/typescript-estree": "7.10.0" - } - }, "@typescript-eslint/visitor-keys": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", @@ -26366,24 +26444,6 @@ "@typescript-eslint/types": "7.10.0", "eslint-visitor-keys": "^3.4.3" } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } } } }, @@ -26473,30 +26533,65 @@ } }, "@typescript-eslint/type-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", - "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.10.0.tgz", + "integrity": "sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "7.8.0", - "@typescript-eslint/utils": "7.8.0", + "@typescript-eslint/typescript-estree": "7.10.0", + "@typescript-eslint/utils": "7.10.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, "dependencies": { - "@typescript-eslint/utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", - "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", + "@typescript-eslint/types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", + "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", + "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", "dev": true, "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "semver": "^7.6.0" + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", + "integrity": "sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.10.0", + "eslint-visitor-keys": "^3.4.3" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" } } } @@ -26543,6 +26638,80 @@ } } }, + "@typescript-eslint/utils": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.10.0", + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/typescript-estree": "7.10.0" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz", + "integrity": "sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0" + } + }, + "@typescript-eslint/types": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", + "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", + "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", + "integrity": "sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.10.0", + "eslint-visitor-keys": "^3.4.3" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "@typescript-eslint/visitor-keys": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", From 971b9446fc47baf7b6843a0463b0987a802b9ddb Mon Sep 17 00:00:00 2001 From: ulferts <jens.ulferts@googlemail.com> Date: Fri, 24 May 2024 09:22:38 +0200 Subject: [PATCH 23/40] bump Ascii85 --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index eae6365fa4b7..446e08473237 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -225,7 +225,7 @@ PATH GEM remote: https://rubygems.org/ specs: - Ascii85 (1.1.0) + Ascii85 (1.1.1) actioncable (7.1.3.3) actionpack (= 7.1.3.3) activesupport (= 7.1.3.3) From 811ed73e2af96b2f24a37c7504e7603ff746d1ae Mon Sep 17 00:00:00 2001 From: ulferts <jens.ulferts@googlemail.com> Date: Fri, 24 May 2024 09:23:05 +0200 Subject: [PATCH 24/40] bump aws-partitions & minitest --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 446e08473237..715b4b5b2607 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -341,7 +341,7 @@ GEM activerecord (>= 4.0.0, < 7.2) awrence (1.2.1) aws-eventstream (1.3.0) - aws-partitions (1.929.0) + aws-partitions (1.934.0) aws-sdk-core (3.196.1) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) @@ -723,7 +723,7 @@ GEM mini_magick (4.12.0) mini_mime (1.1.5) mini_portile2 (2.8.6) - minitest (5.23.0) + minitest (5.23.1) msgpack (1.7.2) multi_json (1.15.0) mustermann (3.0.0) From 33d48d1878218dc85a6304a092437a62dc642de0 Mon Sep 17 00:00:00 2001 From: ulferts <jens.ulferts@googlemail.com> Date: Fri, 24 May 2024 09:23:18 +0200 Subject: [PATCH 25/40] bump aws-sdk-kms --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 715b4b5b2607..aff3ad384049 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -347,7 +347,7 @@ GEM aws-partitions (~> 1, >= 1.651.0) aws-sigv4 (~> 1.8) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.81.0) + aws-sdk-kms (1.82.0) aws-sdk-core (~> 3, >= 3.193.0) aws-sigv4 (~> 1.1) aws-sdk-s3 (1.151.0) From 1fad834dd1c26d9144d75474ed8c6344f325ad7c Mon Sep 17 00:00:00 2001 From: ulferts <jens.ulferts@googlemail.com> Date: Fri, 24 May 2024 09:24:22 +0200 Subject: [PATCH 26/40] bump google-apis-core --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index aff3ad384049..f30bee29d73c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -571,7 +571,7 @@ GEM fugit (>= 1.1) railties (>= 6.0.0) thor (>= 0.14.1) - google-apis-core (0.14.1) + google-apis-core (0.15.0) addressable (~> 2.5, >= 2.5.1) googleauth (~> 1.9) httpclient (>= 2.8.1, < 3.a) From 0d6a8570f98fe328d0286bd5b08b7c7d3d805c50 Mon Sep 17 00:00:00 2001 From: ulferts <jens.ulferts@googlemail.com> Date: Fri, 24 May 2024 09:24:52 +0200 Subject: [PATCH 27/40] bump lookbook --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index f30bee29d73c..ddd9988555c9 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -693,7 +693,7 @@ GEM loofah (2.22.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) - lookbook (2.3.0) + lookbook (2.3.1) activemodel css_parser htmlbeautifier (~> 1.3) From 2de35e18a00a05e5f05c7e5355de124d58fa8ef3 Mon Sep 17 00:00:00 2001 From: ulferts <jens.ulferts@googlemail.com> Date: Fri, 24 May 2024 09:26:22 +0200 Subject: [PATCH 28/40] bump rb-inotify --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index ddd9988555c9..50cf035aabcf 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -912,7 +912,7 @@ GEM rainbow (3.1.1) rake (13.2.1) rb-fsevent (0.11.2) - rb-inotify (0.10.1) + rb-inotify (0.11.1) ffi (~> 1.0) rb_sys (0.9.97) rbtree3 (0.7.1) From d50b29b720b81eeab65eba5e4d13094d05e4dd4c Mon Sep 17 00:00:00 2001 From: ulferts <jens.ulferts@googlemail.com> Date: Fri, 24 May 2024 09:26:31 +0200 Subject: [PATCH 29/40] bump redis-client --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 50cf035aabcf..838008eee241 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -922,7 +922,7 @@ GEM redcarpet (3.6.0) redis (5.2.0) redis-client (>= 0.22.0) - redis-client (0.22.1) + redis-client (0.22.2) connection_pool regexp_parser (2.9.2) reline (0.5.7) From 6bdc2d5a48e1e68fe855c7249e2756d3b2003f5c Mon Sep 17 00:00:00 2001 From: ulferts <jens.ulferts@googlemail.com> Date: Fri, 24 May 2024 09:26:39 +0200 Subject: [PATCH 30/40] bump rspec-mocks --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 838008eee241..21b62c449fb3 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -953,7 +953,7 @@ GEM rspec-expectations (3.13.0) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) - rspec-mocks (3.13.0) + rspec-mocks (3.13.1) diff-lcs (>= 1.2.0, < 2.0) rspec-support (~> 3.13.0) rspec-rails (6.1.2) From b80d85b0db27e9dd62be4fa7338467c58f42f7b6 Mon Sep 17 00:00:00 2001 From: ulferts <jens.ulferts@googlemail.com> Date: Fri, 24 May 2024 09:26:49 +0200 Subject: [PATCH 31/40] bump simpleidn --- Gemfile.lock | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 21b62c449fb3..c17dd2cd5854 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1040,8 +1040,7 @@ GEM faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) - simpleidn (0.2.2) - unf (~> 0.1.4) + simpleidn (0.2.3) smart_properties (1.17.0) spreadsheet (1.3.1) bigdecimal @@ -1101,9 +1100,6 @@ GEM tzinfo-data (1.2024.1) tzinfo (>= 1.0.0) uber (0.1.0) - unf (0.1.4) - unf_ext - unf_ext (0.0.9.1) unicode-display_width (2.5.0) uri (0.13.0) validate_email (0.1.6) From 17138886a1b23b8fad623a688fc58a3941b5b174 Mon Sep 17 00:00:00 2001 From: ulferts <jens.ulferts@googlemail.com> Date: Fri, 24 May 2024 09:29:28 +0200 Subject: [PATCH 32/40] bump activerecord-import --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index 6e9d99dfc517..cc9f9bf51d41 100644 --- a/Gemfile +++ b/Gemfile @@ -36,7 +36,7 @@ ruby File.read(".ruby-version").strip gem "actionpack-xml_parser", "~> 2.0.0" gem "activemodel-serializers-xml", "~> 1.0.1" -gem "activerecord-import", "~> 1.6.0" +gem "activerecord-import", "~> 1.7.0" gem "activerecord-session_store", "~> 2.1.0" gem "ox" gem "rails", "~> 7.1.3" diff --git a/Gemfile.lock b/Gemfile.lock index c17dd2cd5854..0900f522a8b8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -291,7 +291,7 @@ GEM activemodel (= 7.1.3.3) activesupport (= 7.1.3.3) timeout (>= 0.4.0) - activerecord-import (1.6.0) + activerecord-import (1.7.0) activerecord (>= 4.2) activerecord-nulldb-adapter (1.0.1) activerecord (>= 5.2.0, < 7.2) @@ -1158,7 +1158,7 @@ PLATFORMS DEPENDENCIES actionpack-xml_parser (~> 2.0.0) activemodel-serializers-xml (~> 1.0.1) - activerecord-import (~> 1.6.0) + activerecord-import (~> 1.7.0) activerecord-nulldb-adapter (~> 1.0.0) activerecord-session_store (~> 2.1.0) acts_as_list (~> 1.1.0) From c5d0f3d8e6f67165b015984eed28601087feab8a Mon Sep 17 00:00:00 2001 From: ulferts <jens.ulferts@googlemail.com> Date: Fri, 24 May 2024 09:30:56 +0200 Subject: [PATCH 33/40] bump commonmarker --- Gemfile | 2 +- Gemfile.lock | 4 ++-- lib/open_project/patches/lookbook_tree_node_inflector.rb | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index cc9f9bf51d41..f57949a0e381 100644 --- a/Gemfile +++ b/Gemfile @@ -83,7 +83,7 @@ gem "htmldiff" gem "stringex", "~> 2.8.5" # CommonMark markdown parser with GFM extension -gem "commonmarker", "~> 1.0.3" +gem "commonmarker", "~> 1.1.3" # HTML pipeline for transformations on text formatter output # such as sanitization or additional features diff --git a/Gemfile.lock b/Gemfile.lock index 0900f522a8b8..d89b272e2716 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -420,7 +420,7 @@ GEM descendants_tracker (~> 0.0.1) color_conversion (0.1.1) colored2 (4.0.0) - commonmarker (1.0.4) + commonmarker (1.1.3) rb_sys (~> 0.9) compare-xml (0.66) nokogiri (~> 1.8) @@ -1184,7 +1184,7 @@ DEPENDENCIES climate_control closure_tree (~> 7.4.0) colored2 - commonmarker (~> 1.0.3) + commonmarker (~> 1.1.3) compare-xml (~> 0.66) costs! csv (~> 3.3) diff --git a/lib/open_project/patches/lookbook_tree_node_inflector.rb b/lib/open_project/patches/lookbook_tree_node_inflector.rb index fdabef5a1bb3..2c62463e921d 100644 --- a/lib/open_project/patches/lookbook_tree_node_inflector.rb +++ b/lib/open_project/patches/lookbook_tree_node_inflector.rb @@ -41,7 +41,7 @@ def label end if Rails.env.development? - OpenProject::Patches.patch_gem_version "lookbook", "2.3.0" do + OpenProject::Patches.patch_gem_version "lookbook", "2.3.1" do Lookbook::TreeNode.prepend OpenProject::Patches::LookbookTreeNodeInflector end end From 496583b38711fa8128cba26cad80fabd8580534b Mon Sep 17 00:00:00 2001 From: ulferts <jens.ulferts@googlemail.com> Date: Fri, 24 May 2024 09:32:26 +0200 Subject: [PATCH 34/40] bump doorkeeper --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index f57949a0e381..a2d814f92a2f 100644 --- a/Gemfile +++ b/Gemfile @@ -46,7 +46,7 @@ gem "ffi", "~> 1.15" gem "rdoc", ">= 2.4.2" -gem "doorkeeper", "~> 5.6.6" +gem "doorkeeper", "~> 5.7.0" # Maintain our own omniauth due to relative URL root issues # see upstream PR: https://github.com/omniauth/omniauth/pull/903 gem "omniauth", git: "https://github.com/opf/omniauth", ref: "fe862f986b2e846e291784d2caa3d90a658c67f0" diff --git a/Gemfile.lock b/Gemfile.lock index d89b272e2716..7b6856c2baaf 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -458,7 +458,7 @@ GEM disposable (0.6.3) declarative (>= 0.0.9, < 1.0.0) representable (>= 3.1.1, < 4) - doorkeeper (5.6.9) + doorkeeper (5.7.0) railties (>= 5) dotenv (3.1.2) dotenv-rails (3.1.2) @@ -1196,7 +1196,7 @@ DEPENDENCIES debug deckar01-task_list (~> 2.3.1) disposable (~> 0.6.2) - doorkeeper (~> 5.6.6) + doorkeeper (~> 5.7.0) dotenv-rails dry-container email_validator (~> 2.2.3) From 239ef8d53367ea2e681523ae65cf9326193bf0e8 Mon Sep 17 00:00:00 2001 From: ulferts <jens.ulferts@googlemail.com> Date: Fri, 24 May 2024 09:34:50 +0200 Subject: [PATCH 35/40] bump rack-timeout --- Gemfile | 2 +- Gemfile.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index a2d814f92a2f..2823d94a99db 100644 --- a/Gemfile +++ b/Gemfile @@ -184,7 +184,7 @@ gem "sprockets-rails", "~> 3.4.2" gem "puma", "~> 6.4" gem "puma-plugin-statsd", "~> 2.0" -gem "rack-timeout", "~> 0.6.3", require: "rack/timeout/base" +gem "rack-timeout", "~> 0.7.0", require: "rack/timeout/base" gem "nokogiri", "~> 1.16.0" diff --git a/Gemfile.lock b/Gemfile.lock index 7b6856c2baaf..255d926c1626 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -866,7 +866,7 @@ GEM rack (< 3) rack-test (2.1.0) rack (>= 1.3) - rack-timeout (0.6.3) + rack-timeout (0.7.0) rack_session_access (0.2.0) builder (>= 2.0.0) rack (>= 1.0.0) @@ -1294,7 +1294,7 @@ DEPENDENCIES rack-mini-profiler rack-protection (~> 3.2.0) rack-test (~> 2.1.0) - rack-timeout (~> 0.6.3) + rack-timeout (~> 0.7.0) rack_session_access rails (~> 7.1.3) rails-controller-testing (~> 1.0.2) From 62ac650d0cff59eedadd29300ffe2b9fada69376 Mon Sep 17 00:00:00 2001 From: ulferts <jens.ulferts@googlemail.com> Date: Fri, 24 May 2024 09:36:11 +0200 Subject: [PATCH 36/40] bump aws-sdk-sns --- Gemfile.lock | 4 ++-- .../openproject-two_factor_authentication.gemspec | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 255d926c1626..4906e78a7066 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -206,7 +206,7 @@ PATH remote: modules/two_factor_authentication specs: openproject-two_factor_authentication (1.0.0) - aws-sdk-sns (~> 1.74.0) + aws-sdk-sns (~> 1.75.0) messagebird-rest (~> 1.4.2) rotp (~> 6.1) webauthn (~> 3.0) @@ -354,7 +354,7 @@ GEM aws-sdk-core (~> 3, >= 3.194.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.8) - aws-sdk-sns (1.74.0) + aws-sdk-sns (1.75.0) aws-sdk-core (~> 3, >= 3.193.0) aws-sigv4 (~> 1.1) aws-sigv4 (1.8.0) diff --git a/modules/two_factor_authentication/openproject-two_factor_authentication.gemspec b/modules/two_factor_authentication/openproject-two_factor_authentication.gemspec index 79fdb2d64bde..06f3e668997f 100644 --- a/modules/two_factor_authentication/openproject-two_factor_authentication.gemspec +++ b/modules/two_factor_authentication/openproject-two_factor_authentication.gemspec @@ -14,6 +14,6 @@ Gem::Specification.new do |s| s.add_dependency "rotp", "~> 6.1" s.add_dependency "webauthn", "~> 3.0" - s.add_dependency "aws-sdk-sns", "~> 1.74.0" + s.add_dependency "aws-sdk-sns", "~> 1.75.0" s.metadata["rubygems_mfa_required"] = "true" end From 7307e0945878332416bd72752cff1b13d5ab57f7 Mon Sep 17 00:00:00 2001 From: ulferts <jens.ulferts@googlemail.com> Date: Fri, 24 May 2024 10:11:29 +0200 Subject: [PATCH 37/40] bump mime-types-data --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 4906e78a7066..1c9ae13e8dbc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -719,7 +719,7 @@ GEM method_source (1.1.0) mime-types (3.5.2) mime-types-data (~> 3.2015) - mime-types-data (3.2024.0305) + mime-types-data (3.2024.0507) mini_magick (4.12.0) mini_mime (1.1.5) mini_portile2 (2.8.6) From 50cb24c0234f5c6d02558c1d57fc4593e0fce129 Mon Sep 17 00:00:00 2001 From: ulferts <jens.ulferts@googlemail.com> Date: Fri, 24 May 2024 10:21:30 +0200 Subject: [PATCH 38/40] attempt to fix flickering spec --- modules/budgets/spec/features/budgets/add_budget_spec.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/budgets/spec/features/budgets/add_budget_spec.rb b/modules/budgets/spec/features/budgets/add_budget_spec.rb index abca50e11ecc..08f1e4e41407 100644 --- a/modules/budgets/spec/features/budgets/add_budget_spec.rb +++ b/modules/budgets/spec/features/budgets/add_budget_spec.rb @@ -68,6 +68,8 @@ # change cost type select "Foobar", from: "budget_new_material_budget_item_attributes_0_cost_type_id" + expect(page).to have_content "bars" + click_on "Create" expect(page).to have_content "Successful creation" From f01cf4647be385fd89d660e6fe3c8cfbbc462ae7 Mon Sep 17 00:00:00 2001 From: Eric Schubert <e.schubert@openproject.com> Date: Fri, 24 May 2024 16:22:55 +0200 Subject: [PATCH 39/40] [#55158] added PR comments - renamed complete to configured - added oauth application rendering representer spec --- .../storage-one-drive-incomplete-response.yml | 2 +- .../api/v3/storages/storage_representer.rb | 2 +- .../storages_representer_rendering_spec.rb | 18 ++- ...applications_representer_rendering_spec.rb | 133 ++++++++++++++++++ 4 files changed, 150 insertions(+), 5 deletions(-) create mode 100644 spec/lib/api/v3/oauth/oauth_applications_representer_rendering_spec.rb diff --git a/docs/api/apiv3/components/examples/storage-one-drive-incomplete-response.yml b/docs/api/apiv3/components/examples/storage-one-drive-incomplete-response.yml index e5b638754915..22ef0500b13d 100644 --- a/docs/api/apiv3/components/examples/storage-one-drive-incomplete-response.yml +++ b/docs/api/apiv3/components/examples/storage-one-drive-incomplete-response.yml @@ -8,7 +8,7 @@ value: driveId: null createdAt: '2021-12-20T13:37:00.211Z' updatedAt: '2021-12-20T13:37:00.211Z' - complete: true + complete: false _links: self: href: /api/v3/storages/1337 diff --git a/modules/storages/lib/api/v3/storages/storage_representer.rb b/modules/storages/lib/api/v3/storages/storage_representer.rb index 728eb983d6ed..a95db7e820c4 100644 --- a/modules/storages/lib/api/v3/storages/storage_representer.rb +++ b/modules/storages/lib/api/v3/storages/storage_representer.rb @@ -102,7 +102,7 @@ def link_without_resource(name, getter:, setter:) getter: ->(represented:, **) { represented.drive_id if represented.provider_type_one_drive? }, setter: ->(fragment:, represented:, **) { represented.drive_id = fragment } - property :complete, + property :configured, skip_parse: true, getter: ->(represented:, **) { represented.configured? } diff --git a/modules/storages/spec/lib/api/v3/storages/storages_representer_rendering_spec.rb b/modules/storages/spec/lib/api/v3/storages/storages_representer_rendering_spec.rb index 4f0a733d8b07..0a897983be72 100644 --- a/modules/storages/spec/lib/api/v3/storages/storages_representer_rendering_spec.rb +++ b/modules/storages/spec/lib/api/v3/storages/storages_representer_rendering_spec.rb @@ -59,7 +59,7 @@ let(:value) { storage.name } end - it_behaves_like "property", :complete do + it_behaves_like "property", :configured do let(:value) { true } end @@ -218,11 +218,15 @@ it_behaves_like "common file storage properties" - describe "properties (Nextcloud only)" do - it_behaves_like "property", :hasApplicationPassword do + context "if file storage is not completely configured" do + let(:storage) { build_stubbed(:nextcloud_storage, oauth_client: nil) } + + it_behaves_like "property", :configured do let(:value) { false } end + end + describe "properties (Nextcloud only)" do describe "hasApplicationPassword" do it_behaves_like "property", :hasApplicationPassword do let(:value) { false } @@ -296,6 +300,14 @@ it_behaves_like "common file storage properties" + context "if file storage is not completely configured" do + let(:storage) { build_stubbed(:one_drive_storage, drive_id: nil, oauth_client: oauth_client_credentials) } + + it_behaves_like "property", :configured do + let(:value) { false } + end + end + describe "properties (OneDrive/SharePoint only)" do it_behaves_like "property", :tenantId do let(:value) { storage.tenant_id } diff --git a/spec/lib/api/v3/oauth/oauth_applications_representer_rendering_spec.rb b/spec/lib/api/v3/oauth/oauth_applications_representer_rendering_spec.rb new file mode 100644 index 000000000000..5fbf82cf79be --- /dev/null +++ b/spec/lib/api/v3/oauth/oauth_applications_representer_rendering_spec.rb @@ -0,0 +1,133 @@ +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) 2012-2024 the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "spec_helper" + +RSpec.describe API::V3::OAuth::OAuthApplicationsRepresenter, "rendering" do + let(:user) { build_stubbed(:user) } + let(:oauth_application) { build_stubbed(:oauth_application) } + let(:representer) { described_class.new(oauth_application, current_user: user, embed_links: true) } + + subject(:generated) { representer.to_json } + + describe "properties" do + it_behaves_like "property", :_type do + let(:value) { "OAuthApplication" } + end + + it_behaves_like "property", :id do + let(:value) { oauth_application.id } + end + + it_behaves_like "property", :name do + let(:value) { oauth_application.name } + end + + it_behaves_like "property", :clientId do + let(:value) { oauth_application.uid } + end + + it_behaves_like "datetime property", :createdAt do + let(:value) { oauth_application.created_at } + end + + it_behaves_like "datetime property", :updatedAt do + let(:value) { oauth_application.updated_at } + end + + it_behaves_like "property", :scopes do + let(:value) { ["api_v3"] } + end + + describe "confidential" do + context "if the oauth application is confidential" do + it_behaves_like "property", :confidential do + let(:value) { true } + end + end + + context "if the oauth application is not confidential" do + let(:oauth_application) { build_stubbed(:oauth_application, confidential: false) } + + it_behaves_like "property", :confidential do + let(:value) { false } + end + end + end + + describe "clientSecret" do + context "if the oauth application is not confidential" do + let(:oauth_application) { build_stubbed(:oauth_application, confidential: false) } + + it_behaves_like "no property", :clientSecret + end + + context "if the oauth application is confidential, but not just created" do + it_behaves_like "no property", :clientSecret + end + + context "if the oauth application is confidential and just created" do + before do + allow(oauth_application).to receive_messages(plaintext_secret: "my-secret") + end + + it_behaves_like "property", :clientSecret do + let(:value) { "my-secret" } + end + end + end + end + + describe "_links" do + describe "self" do + it_behaves_like "has a titled link" do + let(:link) { "self" } + let(:href) { "/api/v3/oauth_applications/#{oauth_application.id}" } + let(:title) { oauth_application.name } + end + end + + describe "redirectUri" do + it_behaves_like "has a link collection" do + let(:link) { "redirectUri" } + let(:hrefs) { [{ href: oauth_application.redirect_uri }] } + end + + context "if multiple redirect uris are defined" do + let(:oauth_application) do + build_stubbed(:oauth_application, redirect_uri: "https://my.deathstar.com\nhttps://starkiller.base.fo") + end + + it_behaves_like "has a link collection" do + let(:link) { "redirectUri" } + let(:hrefs) { [{ href: "https://my.deathstar.com" }, { href: "https://starkiller.base.fo" }] } + end + end + end + end +end From 1536de633e2e4d8aa279b578489916b5ce2f482c Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI <operations+ci@openproject.com> Date: Sat, 25 May 2024 03:06:11 +0000 Subject: [PATCH 40/40] update locales from crowdin [ci skip] --- config/locales/crowdin/ru.seeders.yml | 22 ++++---- config/locales/crowdin/ru.yml | 50 +++++++++---------- .../backlogs/config/locales/crowdin/no.yml | 4 +- .../bim/config/locales/crowdin/ru.seeders.yml | 20 +------- modules/budgets/config/locales/crowdin/no.yml | 10 ++-- modules/costs/config/locales/crowdin/no.yml | 4 +- .../ldap_groups/config/locales/crowdin/no.yml | 2 +- modules/meeting/config/locales/crowdin/lt.yml | 2 +- modules/meeting/config/locales/crowdin/no.yml | 14 +++--- .../reporting/config/locales/crowdin/no.yml | 4 +- .../storages/config/locales/crowdin/ru.yml | 28 +++++------ .../config/locales/crowdin/no.yml | 4 +- 12 files changed, 73 insertions(+), 91 deletions(-) diff --git a/config/locales/crowdin/ru.seeders.yml b/config/locales/crowdin/ru.seeders.yml index 697dc4b5d52a..c24362bc7b32 100644 --- a/config/locales/crowdin/ru.seeders.yml +++ b/config/locales/crowdin/ru.seeders.yml @@ -252,20 +252,20 @@ ru: item_4: subject: Окончание проекта wiki: | - _In this wiki you can collaboratively create and edit pages and sub-pages to create a project wiki._ + _В этой вики Вы можете совместно создавать и редактировать страницы и подстраницы для создания вики-проекта._ - **You can:** + **Вы можете:** - * Insert text and images, also with copy and paste from other documents - * Create a page hierarchy with parent pages - * Include wiki pages to the project menu - * Use macros to include, e.g. table of contents, work package lists, or Gantt charts - * Include wiki pages in other text fields, e.g. project overview page - * Include links to other documents - * View the change history - * View as Markdown + * Вставлять текст и изображения, в том числе с помощью копирования и вставки из других документов + * Создавать иерархию страниц с родительскими страницами + * Включать вики-страницы в меню проекта + * Использовать макросы для включения, например, оглавление, списки рабочих пакетов или диаграммы Ганта + * Включать вики-страницы в другие текстовые поля, например, на страницу обзора проекта + * Включать ссылки на другие документы + * Просмотр истории изменений + * Просмотр в формате Markdown - More information: [https://www.openproject.org/docs/user-guide/wiki/](https://www.openproject.org/docs/user-guide/wiki/) + Дополнительная информация: [https://www.openproject.org/docs/user-guide/wiki/](https://www.openproject.org/docs/user-guide/wiki/) scrum-project: name: Scrum-проект status_explanation: Все задачи выполнены по расписанию. Участвующие в них люди знают свои задачи. Система полностью настроена. diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index b9cd71634803..6d24ee701250 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -337,12 +337,12 @@ ru: one: "Однако, %{shared_work_packages_link} также был предоставлен этому пользователю.\n" few: "Однако, %{shared_work_packages_link} также был предоставлен этому пользователю." many: "However, %{shared_work_packages_link} have also been shared with this user." - other: "However, %{shared_work_packages_link} have also been shared with this user." + other: "Однако, %{shared_work_packages_link} также был предоставлен этому пользователю." however_work_packages_shared_with_group_html: one: "Однако, %{shared_work_packages_link} также был предоставлен этой группе." few: "However, %{shared_work_packages_link} have also been shared with this group." many: "However, %{shared_work_packages_link} have also been shared with this group." - other: "However, %{shared_work_packages_link} have also been shared with this group." + other: "Однако, %{shared_work_packages_link} также был предоставлен этой группе." remove_work_packages_shared_with_user_too: "Пользователь, который был удален как участник по-прежнему может получить доступ к общим пакетам работ. Вы хотели бы также удалить эти ресурсы?" remove_work_packages_shared_with_group_too: "Группа, которая была удалена как участник, все еще может получить доступ к общим пакетам работ. Вы хотели бы также удалить эти ресурсы?" will_not_affect_inherited_shares: "(Это не повлияет на пакеты работ, разделенные с их группой)." @@ -351,7 +351,7 @@ ru: one: "Также, %{shared_work_packages_link} был предоставлен этому пользователю." few: "Also, %{shared_work_packages_link} have been shared with this user." many: "Also, %{shared_work_packages_link} have been shared with this user." - other: "Also, %{shared_work_packages_link} have been shared with this user." + other: "Также, %{shared_work_packages_link} был предоставлен этому пользователю." remove_project_membership_or_work_package_shares_too: "Вы хотите удалить только пользователя как непосредственного члена (и сохранить ресурсы) или также удалить пакет работ?" will_remove_all_user_access_priveleges: "Удаление этого участника удалит все права доступа пользователя к проекту. Пользователь по-прежнему будет существовать как часть экземпляра." will_remove_all_group_access_priveleges: "Удаление этого участника удалит все права доступа группы к проекту. Группа по-прежнему будет существовать как часть экземпляра." @@ -364,25 +364,25 @@ ru: one: "%{all_shared_work_packages_link} был предоставлен этому пользователю." few: "%{all_shared_work_packages_link} have been shared with this user." many: "%{all_shared_work_packages_link} have been shared with this user." - other: "%{all_shared_work_packages_link} have been shared with this user." + other: "%{all_shared_work_packages_link} был предоставлен этому пользователю." shared_with_this_group_html: one: "%{all_shared_work_packages_link} был предоставлен этой группе." few: "%{all_shared_work_packages_link} have been shared with this group." many: "%{all_shared_work_packages_link} have been shared with this group." - other: "%{all_shared_work_packages_link} have been shared with this group." + other: "%{all_shared_work_packages_link} был предоставлен этой группе." shared_with_permission_html: one: "Только %{shared_work_packages_link} был предоставлен общий доступ с правами %{shared_role_name}." few: "Only %{shared_work_packages_link} have been shared with %{shared_role_name} permissions." many: "Only %{shared_work_packages_link} have been shared with %{shared_role_name} permissions." - other: "Only %{shared_work_packages_link} have been shared with %{shared_role_name} permissions." + other: "Только %{shared_work_packages_link} был предоставлен общий доступ с правами %{shared_role_name}." revoke_all_or_with_role: "Хотите ли Вы отменить доступ ко всем общим пакетам работ или только к тем, которые имеют разрешения %{shared_role_name}?" will_not_affect_inherited_shares: "(Это не повлияет на пакеты работ, разделенные с их группой)." cannot_remove_inherited: "Общие пакеты работ, к которым предоставлен общий доступ через группы, не могут быть удалены." cannot_remove_inherited_with_role: "Общие пакеты работ с ролью %{shared_role_name} доступны через группы и не могут быть удалены.\n\n\n\n" cannot_remove_inherited_note_admin_html: "Вы можете либо отозвать общий доступ к группе, либо удалить этого конкретного участника из группы в %{administration_settings_link}." cannot_remove_inherited_note_non_admin: "Вы можете либо отозвать общий доступ к группе, либо обратиться к администратору, чтобы удалить этого конкретного участника из группы." - will_revoke_directly_granted_access: "This action will revoke their access to all of them, but the work packages shared with a group." - will_revoke_access_to_all: "This action will revoke their access to all of them." + will_revoke_directly_granted_access: "Это действие лишит их доступа ко всем пакетам работ, кроме тех, которыми поделились с группой." + will_revoke_access_to_all: "Это действие лишит их доступа ко всем пакетам работ." my: access_token: failed_to_reset_token: "Не удалось сбросить маркер доступа: %{error}" @@ -507,7 +507,7 @@ ru: sharing: missing_workflow_warning: title: "Отсутствует рабочий процесс для совместного использования пакета работ" - message: "No workflow is configured for the 'Work package editor' role. Without a workflow, the shared with user cannot alter the status of the work package. Workflows can be copied. Select a source type (e.g. 'Task') and source role (e.g. 'Member'). Then select the target types. To start with, you could select all the types as targets. Finally, select the 'Work package editor' role as the target and press 'Copy'. After having thus created the defaults, fine tune the workflows as you do for every other role." + message: "Для роли «Редактор рабочего пакета» не настроен рабочий процесс. Без рабочего процесса пользователь, к которому предоставлен общий доступ, не может изменить состояние рабочего пакета. Рабочие процессы можно копировать. Выберите тип источника (например, «Задача») и роль источника (например, «Участник»). Затем выберите целевые типы. Для начала вы можете выбрать все типы в качестве целей. Наконец, выберите роль «Редактор рабочего пакета» в качестве цели и нажмите «Копировать». После создания настроек по умолчанию настройте рабочие процессы так же, как и для любой другой роли." link_message: "Настройте рабочие процессы в Администрировании." summary: reports: @@ -1493,10 +1493,10 @@ ru: many: "%{count} часов" other: "%{count} часов" x_hours_abbreviated: - one: "1 ч" + one: "1 час" few: "%{count} hrs" many: "%{count} hrs" - other: "%{count} ч" + other: "%{count} часов" x_weeks: one: "1 неделя" few: "%{count} weeks" @@ -1518,10 +1518,10 @@ ru: many: "%{count} секунд" other: "%{count} секунды" x_seconds_abbreviated: - one: "1 с" + one: "1 секунда" few: "%{count} s" many: "%{count} s" - other: "%{count} с" + other: "%{count} секунд" units: hour: one: "час" @@ -1723,18 +1723,18 @@ ru: dates: working: "%{date} сейчас рабочий" non_working: "%{date} теперь нерабочий" - progress_mode_changed_to_status_based: Режим расчета прогресса установлен на основе статуса + progress_mode_changed_to_status_based: Расчет прогресса установлен в режим "На основе статуса" status_p_complete_changed: >- "% завершения" для статуса '%{status_name}' изменено с %{old_value}% на %{new_value}% system_update: file_links_journal: > Теперь на вкладке Активность появится активность, связанная со ссылками файлов (файлы, хранящиеся во внешних хранилищах). Ниже описывается деятельность по уже существующим ссылкам: progress_calculation_adjusted_from_disabled_mode: >- - Расчет прогресса автоматически <a href="%{href}" target="_blank">переводится в рабочий режим и корректируется при обновлении версии</a>. + Расчет прогресса автоматически <a href="%{href}" target="_blank">устанавливается в режим "На основе трудозатрат" и корректируется при обновлении версии</a>. progress_calculation_adjusted: >- Расчет прогресса автоматически <a href="%{href}" target="_blank">корректируется при обновлении версии</a>. totals_removed_from_childless_work_packages: >- - Work and progress totals automatically removed for non-parent work packages with <a href="%{href}" target="_blank">version update</a>. This is a maintenance task and can be safely ignored. + При <a href="%{href}" target="_blank">обновлении версии</a> автоматически удаляются итоги работы и прогресса для неродительских пакетов работ. Это задача по обслуживанию, и её можно смело игнорировать. links: configuration_guide: "Руководство по конфигурации" get_in_touch: "У вас есть вопросы? Свяжитесь с нами." @@ -2934,7 +2934,7 @@ ru: Если CORS включен, то это источники, которым разрешен доступ к OpenProject API. <br/> Пожалуйста, проверьте <a href="%{origin_link}" target="_blank">документацию по происхождению</a> о том, как указывать ожидаемые значения. setting_apiv3_write_readonly_attributes: "Доступ на запись к атрибутам, доступным только для чтения" setting_apiv3_write_readonly_attributes_instructions_html: > - If enabled, the API will allow administrators to write static read-only attributes during creation, such as createdAt and author. <br/> <strong>Warning:</strong> This setting has a use-case for e.g., importing data, but allows administrators to impersonate the creation of items as other users. All creation requests are being logged however with the true author. </br> For more information on attributes and supported resources, please see the %{api_documentation_link}. + Если этот параметр включен, API позволит администраторам записывать во время создания статические атрибуты, доступные только для чтения, такие как «Создано в» и «Автор». <br/> <strong>Внимание!</strong> Этот параметр можно использовать, например, для импорта данных, но он позволяет администраторам выдавать себя при создании элементов за других пользователей. Однако все запросы на создание регистрируются с указанием истинного автора. </br> Для получения дополнительной информации об атрибутах и поддерживаемых ресурсах см. %{api_documentation_link}. setting_apiv3_max_page_size: "Максимальный размер страницы API" setting_apiv3_max_page_instructions_html: > Установите максимальный размер страницы, который будет отвечать API. Невозможно выполнить API-запросы, возвращающие много значений на одной странице. <br/> <strong>Предупреждение:</strong> Пожалуйста, измените это значение, только если вы уверены, зачем вам это нужно. Установка большого значения приведет к значительному снижению производительности, в то время как значение ниже, чем для параметров страницы, вызовет ошибки в представлениях с разбивкой на страницы. @@ -2998,11 +2998,11 @@ ru: setting_file_max_size_displayed: "Максимальная длина строки текстовых файлов" setting_host_name: "Имя компьютера в сети" setting_invitation_expiration_days: "Действие письма активации истекает после" - setting_work_package_done_ratio: "Расчет прогресса" - setting_work_package_done_ratio_field: "Рабочий" - setting_work_package_done_ratio_status: "Статус" + setting_work_package_done_ratio: "Режим расчета прогресса" + setting_work_package_done_ratio_field: "На основе трудозатрат" + setting_work_package_done_ratio_status: "На основе статуса" setting_work_package_done_ratio_explanation_html: > - В режиме <b>На основе работы</b>, % Выполнения рассчитывается на основе того, сколько работы выполнено по отношению к общему объему работы. В режиме <b>На основе статуса</b>, каждый статус имеет связанное с ним значение % Выполнения. Изменение статуса изменит % Выполнения. + В режиме <b>На основе трудозатрат</b>, процент завершения рассчитывается на основе того, сколько работы выполнено по отношению к общему объему работ. В режиме <b>На основе статуса</b>, каждый статус имеет связанное с ним значение процента завершения. Изменение статуса изменит процент завершения. setting_work_package_properties: "Свойства пакета работ" setting_work_package_startdate_is_adddate: "Использовать текущую дату как дату начала для новых пакетов работ" setting_work_packages_projects_export_limit: "Ограничение экспорта пакетов работ / проектов" @@ -3070,7 +3070,7 @@ ru: remaining_scan_complete_html: > Оставшиеся файлы были просканированы. В карантине находится %{file_count} . Вы перенаправляетесь на страницу карантина. Используйте эту страницу, чтобы удалить или отменить файлы, помещенные в карантин. remaining_rescanned_files: > - Virus scanning has been enabled successfully. There are %{file_count} that were uploaded previously and still need to be scanned. This process has been scheduled in the background. The files will remain accessible during the scan. + Проверка на вирусы успешно включена. Есть %{file_count}, которые были загружены ранее и все еще нуждаются в сканировании. Этот процесс был запланирован в фоновом режиме. Файлы останутся доступными во время сканирования. upsale: description: "Убедитесь, что загруженные файлы в OpenProject проверяются на наличие вирусов, прежде чем они станут доступны другим пользователям." actions: @@ -3388,7 +3388,7 @@ ru: modal: work_based_help_text: "% Выполнения автоматически выводится из Работ и Оставшихся работ." status_based_help_text: "% Выполнения определяется статусом пакета работ." - migration_warning_text: "In work-based progress calculation mode, % Complete cannot be manually set and is tied to Work. The existing value has been kept but cannot be edited. Please input Work first." + migration_warning_text: "В режиме расчета прогресса \"На основе трудозатрат\" процент завершения невозможно установить вручную, он привязан к трудозатратам. Существующее значение сохранено, но его нельзя изменить. Пожалуйста, сначала введите трудозатраты." sharing: count: zero: "0 пользователей" @@ -3612,7 +3612,7 @@ ru: label_request_token: "Токен запроса" label_refresh_token: "Токен обновления" errors: - oauth_authorization_code_grant_had_errors: "OAuth2 Authorization grant unsuccessful" + oauth_authorization_code_grant_had_errors: "Ошибка авторизации OAuth2" oauth_reported: "Источник OAuth2 сообщил" oauth_returned_error: "OAuth2 вернул ошибку" oauth_returned_json_error: "OAuth2 вернул ошибку JSON" @@ -3652,7 +3652,7 @@ ru: link: ссылка plugin_openproject_auth_plugins: name: "Плагины аутентификации OpenProject" - description: "Integration of OmniAuth strategy providers for authentication in OpenProject." + description: "Интеграция поставщиков стратегии OmniAuth для аутентификации в OpenProject." plugin_openproject_auth_saml: name: "OmniAuth SAML / Однозначный вход" description: "Добавляет поставщика OmniAuth SAML в OpenProject" diff --git a/modules/backlogs/config/locales/crowdin/no.yml b/modules/backlogs/config/locales/crowdin/no.yml index 1701425b130c..878f0e499e9e 100644 --- a/modules/backlogs/config/locales/crowdin/no.yml +++ b/modules/backlogs/config/locales/crowdin/no.yml @@ -113,7 +113,7 @@ label_column_in_backlog: "Kolonne i forsinkelse" label_hours: " timer" label_work_package_hierarchy: "Hierarki for arbeidspakker" - label_master_backlog: "Master Backlog" + label_master_backlog: "Master Forsinkelse" label_not_prioritized: "ikke prioritert" label_points: "punkter" label_points_burn_down: "Ned" @@ -132,7 +132,7 @@ label_version: 'Versjon' label_webcal: "Webcal Feed" label_wiki: "Wiki" - permission_view_master_backlog: "Vis master backlog" + permission_view_master_backlog: "Vis master forsinkelse" permission_view_taskboards: "Vis oppgavetavler" permission_select_done_statuses: "Velg ferdige statuser" permission_update_sprints: "Oppdater etapper" diff --git a/modules/bim/config/locales/crowdin/ru.seeders.yml b/modules/bim/config/locales/crowdin/ru.seeders.yml index 926938dc2002..78364b883b7c 100644 --- a/modules/bim/config/locales/crowdin/ru.seeders.yml +++ b/modules/bim/config/locales/crowdin/ru.seeders.yml @@ -120,25 +120,7 @@ ru: options: name: Приступая к работе text: | - We are glad you joined! We suggest to try a few things to get started in OpenProject. - - But before you jump right into it, you should know that this exemplary project is split up into two different projects: - - 1. [Construction project]({{opSetting:base_url}}/projects/demo-planning-constructing-project): Here you will find the classical roles, some workflows and work packages for your construction project. - 2. [Creating BIM Model]({{opSetting:base_url}}/projects/demo-bim-project): This project also offers roles, workflows and work packages but especially in the BIM context. - - _Try the following steps:_ - - 1. _Invite new members to your project_: → Go to [Members]({{opSetting:base_url}}/projects/demo-construction-project/members) in the project navigation. - 2. _View the work in your projects_: → Go to [Work packages]({{opSetting:base_url}}/projects/demo-construction-project/work_packages?query_props=%7B%22c%22%3A%5B%22type%22%2C%22id%22%2C%22subject%22%2C%22status%22%2C%22assignee%22%2C%22priority%22%5D%2C%22hl%22%3A%22priority%22%2C%22hi%22%3Atrue%2C%22g%22%3A%22%22%2C%22t%22%3A%22startDate%3Aasc%22%2C%22f%22%3A%5B%7B%22n%22%3A%22bcfIssueAssociated%22%2C%22o%22%3A%22%3D%22%2C%22v%22%3A%5B%22f%22%5D%7D%5D%2C%22pa%22%3A1%2C%22pp%22%3A100%2C%22dr%22%3A%22list%22%7D) in the project navigation. - 3. _Create a new work package_: → Go to [Work packages → Create]({{opSetting:base_url}}/projects/demo-construction-project/work_packages/new?query_props=%7B%22c%22%3A%5B%22type%22%2C%22id%22%2C%22subject%22%2C%22status%22%2C%22assignee%22%2C%22priority%22%5D%2C%22hl%22%3A%22priority%22%2C%22hi%22%3Atrue%2C%22g%22%3A%22%22%2C%22t%22%3A%22startDate%3Aasc%22%2C%22f%22%3A%5B%7B%22n%22%3A%22bcfIssueAssociated%22%2C%22o%22%3A%22%3D%22%2C%22v%22%3A%5B%22f%22%5D%7D%5D%2C%22pa%22%3A1%2C%22pp%22%3A100%2C%22dr%22%3A%22list%22%7D&type=11). - 4. _Create and update a Gantt chart_: → Go to [Gantt chart]({{opSetting:base_url}}/projects/demo-construction-project/work_packages?query_props=%7B%22c%22%3A%5B%22type%22%2C%22id%22%2C%22subject%22%2C%22assignee%22%2C%22responsible%22%5D%2C%22tv%22%3Atrue%2C%22tzl%22%3A%22weeks%22%2C%22hl%22%3A%22priority%22%2C%22hi%22%3Atrue%2C%22g%22%3A%22%22%2C%22t%22%3A%22startDate%3Aasc%22%2C%22f%22%3A%5B%5D%2C%22pa%22%3A1%2C%22pp%22%3A100%2C%22dr%22%3A%22list%22%7D) in the project navigation. - 5. _Activate further modules_: → Go to [Project settings → Modules]({{opSetting:base_url}}/projects/demo-construction-project/settings/modules). - 6. _Check out the tile view to get an overview of your BCF issues:_ → Go to [Work packages]({{opSetting:base_url}}/projects/demo-construction-project/work_packages?query_props=%7B%22c%22%3A%5B%22type%22%2C%22id%22%2C%22subject%22%2C%22status%22%2C%22assignee%22%2C%22priority%22%5D%2C%22hl%22%3A%22priority%22%2C%22hi%22%3Atrue%2C%22g%22%3A%22%22%2C%22t%22%3A%22id%3Aasc%22%2C%22f%22%3A%5B%5D%2C%22pa%22%3A1%2C%22pp%22%3A100%2C%22dr%22%3A%22card%22%7D) - 7. _Agile working? Check out our brand new boards:_ → Go to [Boards]({{opSetting:base_url}}/projects/demo-construction-project/boards) - - Here you will find our [User Guides](https://www.openproject.org/docs/user-guide/). - Please let us know if you have any questions or need support. Contact us: [support\[at\]openproject.com](mailto:support@openproject.com). + shared with me item_4: options: name: Участники diff --git a/modules/budgets/config/locales/crowdin/no.yml b/modules/budgets/config/locales/crowdin/no.yml index 1fa52a07735a..14bf7f262d3f 100644 --- a/modules/budgets/config/locales/crowdin/no.yml +++ b/modules/budgets/config/locales/crowdin/no.yml @@ -33,7 +33,7 @@ spent: "Brukt" status: "Status" subject: "Emne" - type: "Type kostnader" + type: "Kostnadstype" labor_budget: "Planlagte arbeidskostnader" material_budget: "Planlagte enhetskostnader" work_package: @@ -53,12 +53,12 @@ button_cancel_edit_costs: "Avbryt redigering av kostnader" caption_labor: "Arbeid" caption_labor_costs: "Reelle arbeidkostnader" - caption_material_costs: "Reell utgift" + caption_material_costs: "Reell enhetskostnad" budgets_title: "Budsjetter" events: budget: "Budsjett endret" help_click_to_edit: "Klikk her for å redigere." - help_currency_format: "Formatet på vist valuta %n erstattes med valutaverdien, %u" + help_currency_format: "Formatet på vist valuta. %n erstattes med valutaverdien, %u ertsattes av valutaenheten." help_override_rate: "Skriv inn en verdi her for å overstyre standard sats." label_budget: "Budsjett" label_budget_new: "Nytt budsjett" @@ -74,5 +74,5 @@ permission_view_budgets: "Vis budsjetter" project_module_budgets: "Budsjetter" text_budget_reassign_to: "Flytt dem til dette budsjettet:" - text_budget_delete: "Slett budsjettet fra alle oppgaver" - text_budget_destroy_assigned_wp: "Det er %{count} oppgaver i dette budsjettet. Hva vil du gjøre?" + text_budget_delete: "Slett budsjettet fra alle arbeidspakker" + text_budget_destroy_assigned_wp: "Det er %{count} arbeidspakker i dette budsjettet. Hva vil du gjøre?" diff --git a/modules/costs/config/locales/crowdin/no.yml b/modules/costs/config/locales/crowdin/no.yml index 73072ec66c8a..9d326f3b617a 100644 --- a/modules/costs/config/locales/crowdin/no.yml +++ b/modules/costs/config/locales/crowdin/no.yml @@ -46,7 +46,7 @@ default_rates: "Standard satser" models: cost_type: - one: "Type kostnader" + one: "Kostnadstype" other: "Kostnadstyper" rate: "Sats" errors: @@ -56,7 +56,7 @@ nullify_is_not_valid_for_cost_entries: "Kostnadsoppføringer kan ikke tilordnes et prosjekt." attributes: comment: "Kommentar" - cost_type: "Type kostnader" + cost_type: "Kostnadstype" costs: "Kostnader" current_rate: "Nåværende sats" hours: "Timer" diff --git a/modules/ldap_groups/config/locales/crowdin/no.yml b/modules/ldap_groups/config/locales/crowdin/no.yml index 62dfe0b17d9a..18e5f1dca1d9 100644 --- a/modules/ldap_groups/config/locales/crowdin/no.yml +++ b/modules/ldap_groups/config/locales/crowdin/no.yml @@ -11,7 +11,7 @@ ldap_groups/synchronized_filter: filter_string: 'LDAP-filter' ldap_auth_source: 'LDAP-tilkobling' - group_name_attribute: "Gruppenavn-attributt" + group_name_attribute: "Gruppenavn-egenskap" sync_users: 'Synkroniser brukere' base_dn: "Søk i DN-basen" models: diff --git a/modules/meeting/config/locales/crowdin/lt.yml b/modules/meeting/config/locales/crowdin/lt.yml index 4ef402d3d976..035789fb594f 100644 --- a/modules/meeting/config/locales/crowdin/lt.yml +++ b/modules/meeting/config/locales/crowdin/lt.yml @@ -110,7 +110,7 @@ lt: agenda_text: "Kopijuoti seno susitikimo darbotvarkę" email: send_emails: "Siųsti laiškus" - send_invitation_emails: "Išsiųsti pakvitimo laiškus baigus kūrimą" + send_invitation_emails: "Išsiųsti pakvietimo laiškus baigus kūrimą" open_meeting_link: "Atverti susitikimą" invited: summary: "%{actor} atsiuntė jums pakvietimą į susitikimą %{title}" diff --git a/modules/meeting/config/locales/crowdin/no.yml b/modules/meeting/config/locales/crowdin/no.yml index e0559831e6d5..cac6c4f429d8 100644 --- a/modules/meeting/config/locales/crowdin/no.yml +++ b/modules/meeting/config/locales/crowdin/no.yml @@ -35,7 +35,7 @@ participants: "Deltagere" participant: one: "1 Deltaker" - other: "%{count} deltakere" + other: "%{count} Deltakere" participants_attended: "Tilsluttete" participants_invited: "Inviterte" project: "Prosjekt" @@ -45,7 +45,7 @@ meeting_agenda_item: title: "Tittel" author: "Forfatter" - duration_in_minutes: "min" + duration_in_minutes: "minutter" description: "Notater" presenter: "Foredragsholder" meeting_section: @@ -107,9 +107,9 @@ agenda: "Kopier saksliste" agenda_text: "Kopier sakslisten fra det forrige møtet" email: - send_emails: "Send emails" - send_invitation_emails: "Send out invitation emails upon creation" - open_meeting_link: "Åpne møte" + send_emails: "Send e-post" + send_invitation_emails: "Send ut invitasjons e-poster ved opprettelse" + open_meeting_link: "Åpent møte" invited: summary: "%{actor} har sendt deg en invitasjon til møtet %{title}" rescheduled: @@ -152,7 +152,7 @@ text_in_hours: "i timer" text_meeting_agenda_for_meeting: 'saksliste for møtet "%{meeting}"' text_meeting_closing_are_you_sure: "Er du sikker på at du vil lukke agendaen?" - text_meeting_agenda_open_are_you_sure: "Dette vil overskrive alle endringer i minuttene! Vil du fortsette?" + text_meeting_agenda_open_are_you_sure: "Dette vil overskrive alle endringer i referatet! Vil du fortsette?" text_meeting_minutes_for_meeting: 'referat for møtet "%{meeting}"' text_notificiation_invited: "Denne e-posten inneholder ny informasjon for møtet nedenfor:" text_meeting_empty_heading: "Ditt møte er tomt" @@ -183,7 +183,7 @@ label_meeting_details: "Møtedetaljer" label_meeting_details_edit: "Rediger møtedetaljer" label_meeting_state: "Møtestatus" - label_meeting_state_open: "Åpne" + label_meeting_state_open: "Åpen" label_meeting_state_open_html: "<i>Åpen</i>" label_meeting_state_closed: "Stengt" label_meeting_state_closed_html: "<i>Stengt</i>" diff --git a/modules/reporting/config/locales/crowdin/no.yml b/modules/reporting/config/locales/crowdin/no.yml index 1d6a4ef67c79..d62803eec530 100644 --- a/modules/reporting/config/locales/crowdin/no.yml +++ b/modules/reporting/config/locales/crowdin/no.yml @@ -27,7 +27,7 @@ comments: "Kommentar" cost_reports_title: "Tid og kostnader" label_cost_report: "Kostnadsrapport" - label_cost_report_plural: "Kostnadsrapport" + label_cost_report_plural: "Kostnadsrapporter" description_drill_down: "Vis detaljer" description_filter_selection: "Utvalg" description_multi_select: "Vis flervalg" @@ -36,7 +36,7 @@ label_click_to_edit: "Klikk for å redigere." label_closed: "lukket" label_columns: "Kolonner" - label_cost_entry_attributes: "Kostnadsattributter" + label_cost_entry_attributes: "Kostnadsegenskaper" label_days_ago: "for de siste dagene" label_entry: "Kostnad" label_filter_text: "Filtrer tekst" diff --git a/modules/storages/config/locales/crowdin/ru.yml b/modules/storages/config/locales/crowdin/ru.yml index 1f13f6749070..80b9abc13c0d 100644 --- a/modules/storages/config/locales/crowdin/ru.yml +++ b/modules/storages/config/locales/crowdin/ru.yml @@ -40,18 +40,18 @@ ru: errors: too_many_elements_created_at_once: Слишком много элементов, созданных сразу. Ожидалось %{max} максимум - получено %{actual}. external_file_storages: Внешние хранилища файлов - permission_create_files: 'Automatically managed project folders: Create files' - permission_create_files_explanation: This permission is only available for Nextcloud storages - permission_delete_files: 'Automatically managed project folders: Delete files' - permission_delete_files_explanation: This permission is only available for Nextcloud storages + permission_create_files: 'Автоматически управляемые папки проекта: Создание файлов' + permission_create_files_explanation: Это разрешение доступно только для хранилищ Nextcloud + permission_delete_files: 'Автоматически управляемые папки проекта: Удаление файлов' + permission_delete_files_explanation: Это разрешение доступно только для хранилищ Nextcloud permission_header_for_project_module_storages: Автоматически управляемые папки проектов permission_manage_file_links: Управление ссылками файлов permission_manage_storages_in_project: Управление файловыми хранилищами в проекте - permission_read_files: 'Automatically managed project folders: Read files' - permission_share_files: 'Automatically managed project folders: Share files' - permission_share_files_explanation: This permission is only available for Nextcloud storages + permission_read_files: 'Автоматически управляемые папки проекта: Чтение файлов' + permission_share_files: 'Автоматически управляемые папки проекта: Делиться файлами' + permission_share_files_explanation: Это разрешение доступно только для хранилищ Nextcloud permission_view_file_links: Просмотр ссылок на файл - permission_write_files: 'Automatically managed project folders: Write files' + permission_write_files: 'Автоматически управляемые папки проекта: Запись файлов' project_module_storages: Файлы storages: buttons: @@ -68,8 +68,8 @@ ru: one_drive: Разрешить OpenProject доступ к данным Azure, используя OAuth для подключения OneDrive/Sharepoint. redirect_uri_incomplete: one_drive: Завершите установку с правильным перенаправлением URI. - confirm_replace_oauth_application: This action will reset the current OAuth credentials. After confirming you will have to reenter the credentials at the storage provider and all remote users will have to authorize against OpenProject again. Are you sure you want to proceed? - confirm_replace_oauth_client: This action will reset the current OAuth credentials. After confirming you will have to enter new credentials from the storage provider and all users will have to authorize against %{provider_type} again. Are you sure you want to proceed? + confirm_replace_oauth_application: Это действие приведет к сбросу текущих учетных данных OAuth. После подтверждения вам придется повторно ввести учетные данные у поставщика хранилища, и всем удаленным пользователям придется снова авторизоваться в OpenProject. Вы уверены, что хотите продолжить? + confirm_replace_oauth_client: Это действие приведет к сбросу текущих учетных данных OAuth. После подтверждения вам нужно будет ввести новые учетные данные от поставщика хранилища, и всем пользователям придется снова авторизоваться в %{provider_type}. Вы уверены, что хотите продолжить? delete_warning: input_delete_confirmation: Введите имя хранилища файлов %{file_storage} для подтверждения удаления. irreversible_notice: Удаление хранилища файлов является необратимым действием. @@ -85,9 +85,9 @@ ru: access_management: automatic_management: Автоматически управляемый доступ и папки automatic_management_description: Разрешить OpenProject автоматически создавать папки для каждого проекта и управлять доступом пользователей к ним. Это рекомендуется, так как гарантирует, что каждый член команды всегда будет иметь правильные права на доступ. - description: Select the type of management of user access and folder creation. We recommend to use the Automatically managed access to have a more organised structure and guarantee access to all relevant users. + description: Выберите тип управления доступом пользователя и созданием папок. Мы рекомендуем использовать "автоматически управляемый доступ" для более организованной структуры и гарантировать доступ всем необходимым пользователям. manual_management: Вручную управляемый доступ и папки - manual_management_description: Create and manage folders per project manually on your own. You will need to manually ensure relevant users have access. + manual_management_description: Создавайте и управляйте папками для каждого проекта вручную. Вам нужно будет вручную обеспечить доступ соответствующим пользователям. setup_incomplete: Выберите тип управления доступом пользователя и созданием папок. subtitle: Управление доступом title: Доступ и папки проекта @@ -232,7 +232,7 @@ ru: project_storage_members: subtitle: Проверьте статус подключения для хранилища %{storage_name_link} всех участников проекта. title: Статус подключения участников - permission_header_explanation: 'File permissions on external storages are applied only to folders and files within automatically managed project folders. Note that not all file permissions are supported by all storage providers. Please check the documentation on <a target=''_blank'' href=''https://www.openproject.org/docs/system-admin-guide/users-permissions/roles-permissions/#file-storages-permissions''>file storage permissions</a> for more information.' + permission_header_explanation: 'Разрешения для файлов во внешних хранилищах применяются только к папкам и файлам в автоматически управляемых папках проекта. Обратите внимание, что не все разрешения для файлов поддерживаются всеми поставщиками хранилищ. Для получения дополнительной информации ознакомьтесь с документацией по <a target=''_blank'' href=''https://www.openproject.org/docs/system-admin-guide/users-permissions/roles-permissions/#file-storages-permissions''>разрешениям на хранение файлов</a>.' provider_types: label: Тип поставщика nextcloud: @@ -246,7 +246,7 @@ ru: name: OneDrive/SharePoint name_placeholder: напр. OneDrive show_attachments_toggle: - description: 'Deactivating this option will hide the attachments list on the work packages files tab. The files attached in the description of a work package will still be uploaded in the internal attachments storage. ' + description: 'Деактивация этой опции скроет список вложений на вкладке «Файлы» пакетов работ. Файлы, прикрепленные к описанию пакета работ, по-прежнему будут загружены во внутреннее хранилище вложений.' label: Показывать вложения во вкладке "Файлы" пакетов работ storage_list_blank_slate: description: Добавьте хранилище, чтобы увидеть его здесь. diff --git a/modules/team_planner/config/locales/crowdin/no.yml b/modules/team_planner/config/locales/crowdin/no.yml index b963d67f0a0e..ef969fe7592b 100644 --- a/modules/team_planner/config/locales/crowdin/no.yml +++ b/modules/team_planner/config/locales/crowdin/no.yml @@ -5,12 +5,12 @@ description: "Tilbyr teamplanlegger visninger." permission_view_team_planner: "Vis teamplanlegger" permission_manage_team_planner: "Administrer teamplanlegger" - project_module_team_planner_view: "Teamplanlegger" + project_module_team_planner_view: "Teamplanleggere" team_planner: label_team_planner: "Teamplanlegger" label_new_team_planner: "Ny teamplanlegger" label_create_new_team_planner: "Opprett ny teamplanlegger" - label_team_planner_plural: "Teamplanlegger" + label_team_planner_plural: "Teamplanleggere" label_assignees: "Tildelt" upsale: title: "Teamplanlegger"