From 14da063cdeeebee9e90d5f43161ee3c0e69dbe16 Mon Sep 17 00:00:00 2001 From: Henriette Darge Date: Thu, 14 Mar 2024 17:45:27 +0100 Subject: [PATCH 001/325] Enable dark mode in personal settings --- app/helpers/application_helper.rb | 5 +++-- app/views/custom_styles/_primer_color_mapping.erb | 3 ++- config/locales/en.yml | 1 + config/schemas/user_preferences.schema.json | 2 +- .../app/shared/components/colors/colors.service.ts | 13 ++++++++++++- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 86113995dcac..f8e3154ae532 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -279,8 +279,9 @@ def all_lang_options_for_select def theme_options_for_select [ - [t('themes.light'), 'light'], - [t('themes.light_high_contrast'), 'light_high_contrast'] + [t("themes.light"), "light"], + [t("themes.light_high_contrast"), "light_high_contrast"], + [t("themes.dark"), "dark"] ] end diff --git a/app/views/custom_styles/_primer_color_mapping.erb b/app/views/custom_styles/_primer_color_mapping.erb index 424b9edb4199..01064dfe61c3 100644 --- a/app/views/custom_styles/_primer_color_mapping.erb +++ b/app/views/custom_styles/_primer_color_mapping.erb @@ -13,7 +13,8 @@ --button-primary-bgColor-rest: var(--button--primary-background-color) !important; --button-primary-bgColor-hover: var(--button--primary-background-hover-color) !important; } - [data-light-theme=light_high_contrast]{ + [data-light-theme=light_high_contrast], + [data-light-theme=dark] { --avatar-border-color: var(--color-avatar-border); --list-item-hover--border-color: var(--color-action-list-item-default-active-border); --list-item-hover--color: var(--color-fg-default); diff --git a/config/locales/en.yml b/config/locales/en.yml index b11d56224dcb..df06d1442355 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -431,6 +431,7 @@ en: no_results_content_text: Add a new status themes: + dark: "Dark" light: "Light" light_high_contrast: "Light high contrast" diff --git a/config/schemas/user_preferences.schema.json b/config/schemas/user_preferences.schema.json index 8953b4ef48cc..b6dfb34596ae 100644 --- a/config/schemas/user_preferences.schema.json +++ b/config/schemas/user_preferences.schema.json @@ -14,7 +14,7 @@ }, "theme": { "type": "string", - "enum": ["light", "light_high_contrast"] + "enum": ["light", "light_high_contrast", "dark"] }, "warn_on_leaving_unsaved": { "type": "boolean" diff --git a/frontend/src/app/shared/components/colors/colors.service.ts b/frontend/src/app/shared/components/colors/colors.service.ts index 065462cdb892..d8739273be5a 100644 --- a/frontend/src/app/shared/components/colors/colors.service.ts +++ b/frontend/src/app/shared/components/colors/colors.service.ts @@ -3,6 +3,7 @@ import { Injectable } from '@angular/core'; export const colorModes = { lightHighContrast: 'lightHighContrast', light: 'light', + dark: 'dark', }; @Injectable({ providedIn: 'root' }) @@ -25,6 +26,16 @@ export class ColorsService { } public colorMode():string { - return document.body.getAttribute('data-light-theme') === 'light_high_contrast' ? colorModes.lightHighContrast : colorModes.light; + switch (document.body.getAttribute('data-light-theme')) { + case 'light_high_contrast': + return colorModes.lightHighContrast; + case 'dark': + return colorModes.dark; + case 'light': + return colorModes.light; + default: { + return colorModes.light; + } + } } } From afb7a98c4958015deaf560c47de94733be01ddf3 Mon Sep 17 00:00:00 2001 From: Henriette Darge Date: Thu, 14 Mar 2024 17:45:27 +0100 Subject: [PATCH 002/325] Enable dark mode in personal settings --- app/helpers/application_helper.rb | 3 ++- app/views/custom_styles/_primer_color_mapping.erb | 3 ++- config/locales/en.yml | 1 + config/schemas/user_preferences.schema.json | 2 +- .../app/shared/components/colors/colors.service.ts | 13 ++++++++++++- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 5a1610f8a357..c03499add44e 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -280,7 +280,8 @@ def all_lang_options_for_select def theme_options_for_select [ [t("themes.light"), "light"], - [t("themes.light_high_contrast"), "light_high_contrast"] + [t("themes.light_high_contrast"), "light_high_contrast"], + [t("themes.dark"), "dark"] ] end diff --git a/app/views/custom_styles/_primer_color_mapping.erb b/app/views/custom_styles/_primer_color_mapping.erb index 424b9edb4199..d14e6838868f 100644 --- a/app/views/custom_styles/_primer_color_mapping.erb +++ b/app/views/custom_styles/_primer_color_mapping.erb @@ -13,7 +13,8 @@ --button-primary-bgColor-rest: var(--button--primary-background-color) !important; --button-primary-bgColor-hover: var(--button--primary-background-hover-color) !important; } - [data-light-theme=light_high_contrast]{ + [data-light-theme=light_high_contrast], + [data-dark-theme=dark] { --avatar-border-color: var(--color-avatar-border); --list-item-hover--border-color: var(--color-action-list-item-default-active-border); --list-item-hover--color: var(--color-fg-default); diff --git a/config/locales/en.yml b/config/locales/en.yml index 98df69b847df..3969dc8751bb 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -432,6 +432,7 @@ en: no_results_content_text: Add a new status themes: + dark: "Dark" light: "Light" light_high_contrast: "Light high contrast" diff --git a/config/schemas/user_preferences.schema.json b/config/schemas/user_preferences.schema.json index 8953b4ef48cc..b6dfb34596ae 100644 --- a/config/schemas/user_preferences.schema.json +++ b/config/schemas/user_preferences.schema.json @@ -14,7 +14,7 @@ }, "theme": { "type": "string", - "enum": ["light", "light_high_contrast"] + "enum": ["light", "light_high_contrast", "dark"] }, "warn_on_leaving_unsaved": { "type": "boolean" diff --git a/frontend/src/app/shared/components/colors/colors.service.ts b/frontend/src/app/shared/components/colors/colors.service.ts index 065462cdb892..d8739273be5a 100644 --- a/frontend/src/app/shared/components/colors/colors.service.ts +++ b/frontend/src/app/shared/components/colors/colors.service.ts @@ -3,6 +3,7 @@ import { Injectable } from '@angular/core'; export const colorModes = { lightHighContrast: 'lightHighContrast', light: 'light', + dark: 'dark', }; @Injectable({ providedIn: 'root' }) @@ -25,6 +26,16 @@ export class ColorsService { } public colorMode():string { - return document.body.getAttribute('data-light-theme') === 'light_high_contrast' ? colorModes.lightHighContrast : colorModes.light; + switch (document.body.getAttribute('data-light-theme')) { + case 'light_high_contrast': + return colorModes.lightHighContrast; + case 'dark': + return colorModes.dark; + case 'light': + return colorModes.light; + default: { + return colorModes.light; + } + } } } From b303f485fc83ca727e57a078f4b9b431df02ab15 Mon Sep 17 00:00:00 2001 From: Henriette Darge Date: Fri, 22 Mar 2024 10:46:46 +0100 Subject: [PATCH 003/325] Extract sidebar and header styles from the generic primer overrides as it should only be applied for the accessibility themes for now --- .../custom_styles/_primer_color_mapping.erb | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/app/views/custom_styles/_primer_color_mapping.erb b/app/views/custom_styles/_primer_color_mapping.erb index d14e6838868f..5e48a0bcadd9 100644 --- a/app/views/custom_styles/_primer_color_mapping.erb +++ b/app/views/custom_styles/_primer_color_mapping.erb @@ -13,6 +13,8 @@ --button-primary-bgColor-rest: var(--button--primary-background-color) !important; --button-primary-bgColor-hover: var(--button--primary-background-hover-color) !important; } + + /* Generic color mapping for content variables */ [data-light-theme=light_high_contrast], [data-dark-theme=dark] { --avatar-border-color: var(--color-avatar-border); @@ -24,24 +26,6 @@ --table-border-color: var(--color-border-default); --toolbar-item--bg-color: var(--color-btn-bg); --toolbar-item--border-color: var(--color-border-default); - --header-border-bottom-width: 1px; - --header-bg-color: var(--color-page-header-bg); - --header-item-font-color: var(--color-fg-default); - --header-item-bg-hover-color: var(--color-action-list-item-default-hover-bg); - --header-item-font-hover-color: var(--color-fg-default); - --header-border-bottom-color: var(--color-border-muted) !important; - --main-menu-bg-color: var(--color-page-header-bg); - --main-menu-hover-font-color: var(--color-fg-default); - --main-menu-bg-selected-background: var(--color-action-list-item-default-hover-bg); - --main-menu-bg-hover-background: var(--color-action-list-item-default-hover-bg); - --main-menu-font-color: var(--color-fg-default); - --main-menu-selected-font-color: var(--color-fg-default); - --main-menu-border-color: var(--color-border-muted); - --main-menu-resizer-color: var(--color-border-muted); - --main-menu-bg-selected-border: var(--color-border-muted); - --main-menu-hover-border-color: var(--color-fg-default) !important; - --main-menu-fieldset-header-color: var(--color-fg-subtle) !important; - --main-menu-border-width: 1px; --button--border-color: var(--color-border-default); --button--primary-background-hover-color: var(--color-btn-primary-hover-bg); --button--primary-background-color: var(--color-btn-primary-bg); @@ -53,4 +37,26 @@ --status-selector-border-color: var(--button--border-color); --link-text-decoration: underline; } + + /* For accessibility themes we are also overriding the header and the sidebar */ + [data-light-theme=light_high_contrast] { + --header-border-bottom-width: 1px; + --header-bg-color: var(--color-page-header-bg); + --header-item-font-color: var(--color-fg-default); + --header-item-bg-hover-color: var(--color-action-list-item-default-hover-bg); + --header-item-font-hover-color: var(--color-fg-default); + --header-border-bottom-color: var(--color-border-muted) !important; + --main-menu-bg-color: var(--color-page-header-bg); + --main-menu-hover-font-color: var(--color-fg-default); + --main-menu-bg-selected-background: var(--color-action-list-item-default-hover-bg); + --main-menu-bg-hover-background: var(--color-action-list-item-default-hover-bg); + --main-menu-font-color: var(--color-fg-default); + --main-menu-selected-font-color: var(--color-fg-default); + --main-menu-border-color: var(--color-border-muted); + --main-menu-resizer-color: var(--color-border-muted); + --main-menu-bg-selected-border: var(--color-border-muted); + --main-menu-hover-border-color: var(--color-fg-default) !important; + --main-menu-fieldset-header-color: var(--color-fg-subtle) !important; + --main-menu-border-width: 1px; + } From 3110b69d7d2adc3064b00de6afc969a737d16112 Mon Sep 17 00:00:00 2001 From: Henriette Darge Date: Fri, 22 Mar 2024 14:33:32 +0100 Subject: [PATCH 004/325] Use more variables instead of hexcodes in order to be dark mode compatible --- app/views/custom_styles/_inline_css.erb | 1 + .../custom_styles/_primer_color_mapping.erb | 15 ++++++++++---- .../input/global-search-input.component.sass | 13 ++---------- .../backlogs-page/styles/dialogues.sass | 2 +- .../backlogs-page/styles/master_backlog.sass | 6 +++--- .../backlogs-page/styles/taskboard.sass | 4 ++-- .../bcf-wp-attribute-group.component.sass | 2 +- .../pages/viewer/styles/loading_modal.sass | 4 ++-- .../calendar/wp-calendar/wp-calendar.sass | 2 +- .../in-app-notification-entry.component.sass | 4 ++-- .../add-existing-pane.component.sass | 2 +- .../planner/team-planner.component.sass | 2 +- ...notification-settings-table.component.sass | 2 +- .../wp-single-card.component.sass | 2 +- .../app/shared/components/forms/fieldset.sass | 1 - .../op-wp-loading-skeleton.component.sass | 2 +- .../app/shared/components/table/table.sass | 2 +- .../styles/sass/components/form-field.sass | 4 ---- .../src/global_styles/common/menu/menu.sass | 2 +- .../global_styles/common/select/select.sass | 6 ++---- .../src/global_styles/content/_accounts.sass | 2 +- .../content/_attributes_group.sass | 2 +- .../global_styles/content/_autocomplete.sass | 20 +++++++++++++++---- .../src/global_styles/content/_boxes.sass | 2 +- .../global_styles/content/_context_menu.sass | 3 +-- .../global_styles/content/_enterprise.sass | 2 +- .../src/global_styles/content/_forms.sass | 8 +++----- .../global_styles/content/_pagination.sass | 4 ++-- .../content/_scrollable_tabs.sass | 2 +- .../content/_simple_filters.sass | 2 +- .../src/global_styles/content/_table.sass | 2 +- .../content/editor/_ckeditor.sass | 2 +- .../content/menus/_menu_blocks.sass | 2 +- .../global_styles/content/modules/_bim.sass | 2 +- .../content/modules/_team_planner.sass | 2 +- .../content/user-content/_code-block.sass | 4 ++-- .../content/user-content/_placeholder.sass | 2 +- .../content/user-content/_toc.sass | 2 +- .../content/user-content/_typography.sass | 2 +- .../src/global_styles/layout/_colors.sass | 2 +- .../layout/work_packages/_full_view.sass | 4 ++-- .../src/global_styles/openproject/_forms.sass | 3 +-- .../openproject/_homescreen.sass | 2 +- .../global_styles/openproject/_mixins.sass | 2 +- .../src/global_styles/openproject/_scm.sass | 4 ++-- .../styles/git-actions-menu.sass | 2 +- .../pull-request/pr-check.component.sass | 2 +- 47 files changed, 83 insertions(+), 83 deletions(-) diff --git a/app/views/custom_styles/_inline_css.erb b/app/views/custom_styles/_inline_css.erb index 7ab9ebb63089..fe9dd58e699e 100644 --- a/app/views/custom_styles/_inline_css.erb +++ b/app/views/custom_styles/_inline_css.erb @@ -45,6 +45,7 @@ See COPYRIGHT and LICENSE files for more details. --accent-color--major2: <%= design_color.darken 0.4 %>; --accent-color--minor1: <%= design_color.lighten 0.8 %>; --accent-color--minor2: <%= design_color.lighten 0.6 %>; + --accent-color--minor3: <%= design_color.lighten 0.4 %>; <% end %> <% end %> } diff --git a/app/views/custom_styles/_primer_color_mapping.erb b/app/views/custom_styles/_primer_color_mapping.erb index 5e48a0bcadd9..2097790abc1b 100644 --- a/app/views/custom_styles/_primer_color_mapping.erb +++ b/app/views/custom_styles/_primer_color_mapping.erb @@ -19,23 +19,29 @@ [data-dark-theme=dark] { --avatar-border-color: var(--color-avatar-border); --list-item-hover--border-color: var(--color-action-list-item-default-active-border); - --list-item-hover--color: var(--color-fg-default); + --list-item-hover--color: var(--color-action-list-item-default-hover-bg); --inplace-edit--border-color: var(--color-border-default); --ck-color-toolbar-border: var(--color-border-default); --ck-color-base-border: var(--color-border-default); + --ck-color-button-default-hover-background: var(--color-action-list-item-default-hover-bg); + --ck-color-toolbar-background: var(--body-background); + --ck-color-text: var(--body-font-color); --table-border-color: var(--color-border-default); --toolbar-item--bg-color: var(--color-btn-bg); --toolbar-item--border-color: var(--color-border-default); - --button--border-color: var(--color-border-default); + --button--border-color: var(--color-btn-border); + --button--primary-font-color: var(--color-btn-primary-text); --button--primary-background-hover-color: var(--color-btn-primary-hover-bg); --button--primary-background-color: var(--color-btn-primary-bg); - --button--active-border-color: var(--color-border-default); + --button--active-border-color: var(--color-btn-border); + --button--font-color: var(--color-btn-text); --button--background-hover-color: var(--color-btn-hover-bg); --button--background-color: var(--color-btn-bg); - --accent-color: var(--color-accent-fg); --primary-button-color: var(--color-btn-primary-bg); --status-selector-border-color: var(--button--border-color); --link-text-decoration: underline; + /* Todo: Only when color is not bright enough */ + --accent-color: var(--accent-color--minor3); } /* For accessibility themes we are also overriding the header and the sidebar */ @@ -58,5 +64,6 @@ --main-menu-hover-border-color: var(--color-fg-default) !important; --main-menu-fieldset-header-color: var(--color-fg-subtle) !important; --main-menu-border-width: 1px; + --accent-color: var(--color-accent-fg); } diff --git a/frontend/src/app/core/global_search/input/global-search-input.component.sass b/frontend/src/app/core/global_search/input/global-search-input.component.sass index 85c46526661e..7e4c303f3403 100644 --- a/frontend/src/app/core/global_search/input/global-search-input.component.sass +++ b/frontend/src/app/core/global_search/input/global-search-input.component.sass @@ -38,9 +38,6 @@ $search-input-height: 30px color: var(--header-item-font-hover-color) border-bottom: var(--header-border-bottom-width) solid var(--header-border-bottom-color) - &.-input-focused - color: var(--header-search-field-font-color) - &--loading top: var(--header-height) - 11px // display directly under ng-input field height: 46px // ng-option height + 1px border @@ -56,7 +53,7 @@ $search-input-height: 30px width: 20px .ng-select-container - background: transparent + background: transparent !important border-color: var(--header-item-font-color) !important &:focus-within @@ -94,12 +91,6 @@ $search-input-height: 30px width: $search-input-width-expanded background: white border-radius: 4px - color: var(--header-search-field-font-color) - - .ng-placeholder, - .ng-clear-wrapper, - input - color: var(--header-search-field-font-color) .ng-dropdown-header border-bottom: none @@ -118,7 +109,7 @@ $search-input-height: 30px height: auto .ng-option - border-bottom: 1px solid var(--color-border-muted) + border-bottom: 1px solid var(--color-border-default) white-space: normal padding: 5px 10px // We do not want the default highlighting of ng-select to take place as diff --git a/frontend/src/app/features/backlogs/backlogs-page/styles/dialogues.sass b/frontend/src/app/features/backlogs/backlogs-page/styles/dialogues.sass index e4dc3839499c..b3f495068dc4 100644 --- a/frontend/src/app/features/backlogs/backlogs-page/styles/dialogues.sass +++ b/frontend/src/app/features/backlogs/backlogs-page/styles/dialogues.sass @@ -6,4 +6,4 @@ .ui-dialog background: #FFFFFF - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) diff --git a/frontend/src/app/features/backlogs/backlogs-page/styles/master_backlog.sass b/frontend/src/app/features/backlogs/backlogs-page/styles/master_backlog.sass index 89e241d52778..5ed0d0e05e52 100644 --- a/frontend/src/app/features/backlogs/backlogs-page/styles/master_backlog.sass +++ b/frontend/src/app/features/backlogs/backlogs-page/styles/master_backlog.sass @@ -52,7 +52,7 @@ top: 1px width: 100px #backlogs_container .backlog - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) display: block margin: 0 0 10px 0 width: 100% @@ -74,7 +74,7 @@ position: relative width: 100% .backlog .header .backlog-menu - border-right: 1px solid var(--color-border-muted) + border-right: 1px solid var(--color-border-default) cursor: pointer height: 30px overflow: visible @@ -95,7 +95,7 @@ .items display: none background-color: #EEEEEE - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) position: absolute top: 30px right: -2px diff --git a/frontend/src/app/features/backlogs/backlogs-page/styles/taskboard.sass b/frontend/src/app/features/backlogs/backlogs-page/styles/taskboard.sass index 08d9968e79a1..1c007f2d5457 100644 --- a/frontend/src/app/features/backlogs/backlogs-page/styles/taskboard.sass +++ b/frontend/src/app/features/backlogs/backlogs-page/styles/taskboard.sass @@ -69,7 +69,7 @@ /* Must be the same as min-width */ #board_header background-color: #EBEBEB - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) margin-bottom: 0 margin-right: 10px td @@ -88,7 +88,7 @@ .board background-color: #FCFCFC - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) border-top: none margin-right: 10px /* IE7 table fix */ diff --git a/frontend/src/app/features/bim/bcf/bcf-wp-attribute-group/bcf-wp-attribute-group.component.sass b/frontend/src/app/features/bim/bcf/bcf-wp-attribute-group/bcf-wp-attribute-group.component.sass index aca5c34ecc70..8e75f8fc60fb 100644 --- a/frontend/src/app/features/bim/bcf/bcf-wp-attribute-group/bcf-wp-attribute-group.component.sass +++ b/frontend/src/app/features/bim/bcf/bcf-wp-attribute-group/bcf-wp-attribute-group.component.sass @@ -31,7 +31,7 @@ ngx-gallery ::ng-deep // Disable red border on active thumbnails .ngx-gallery-active, .ngx-gallery-thumbnail - border: 1px solid var(--color-border-muted) !important + border: 1px solid var(--color-border-default) !important .ngx-gallery-preview-img background-color: white diff --git a/frontend/src/app/features/bim/ifc_models/pages/viewer/styles/loading_modal.sass b/frontend/src/app/features/bim/ifc_models/pages/viewer/styles/loading_modal.sass index 5e87e0c69567..e70a9e3e10f6 100644 --- a/frontend/src/app/features/bim/ifc_models/pages/viewer/styles/loading_modal.sass +++ b/frontend/src/app/features/bim/ifc_models/pages/viewer/styles/loading_modal.sass @@ -17,7 +17,7 @@ background-color: #fefefe margin: auto padding: 0 - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) border-radius: 0.5em width: 50% box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19) @@ -47,4 +47,4 @@ .xeokit-busy-modal-body padding: 2px 16px - margin: 20px 2px \ No newline at end of file + margin: 20px 2px diff --git a/frontend/src/app/features/calendar/wp-calendar/wp-calendar.sass b/frontend/src/app/features/calendar/wp-calendar/wp-calendar.sass index d3a64b712b55..2b7a5557d1cb 100644 --- a/frontend/src/app/features/calendar/wp-calendar/wp-calendar.sass +++ b/frontend/src/app/features/calendar/wp-calendar/wp-calendar.sass @@ -1,5 +1,5 @@ .op-wp-calendar - --fc-border-color: var(--color-border-muted) + --fc-border-color: var(--color-border-default) // Ensure some sane min-height // to ensure fullcalendar has something to render diff --git a/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass b/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass index e92c8339ca43..ea88fdaa1042 100644 --- a/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass +++ b/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass @@ -17,7 +17,7 @@ $subject-font-size: 14px margin: 0 padding: 15px 10px font-size: 0.9rem - border-top: 1px solid var(--color-border-muted) + border-top: 1px solid var(--color-border-default) border-radius: 2px height: $ian-height @@ -25,7 +25,7 @@ $subject-font-size: 14px background: $ian-bg-hover-color &:last-of-type - border-bottom: 1px solid var(--color-border-muted) + border-bottom: 1px solid var(--color-border-default) &_selected background: $ian-bg-selected-color diff --git a/frontend/src/app/features/team-planner/team-planner/add-work-packages/add-existing-pane.component.sass b/frontend/src/app/features/team-planner/team-planner/add-work-packages/add-existing-pane.component.sass index 52b2426608ed..2bdfe70dd022 100644 --- a/frontend/src/app/features/team-planner/team-planner/add-work-packages/add-existing-pane.component.sass +++ b/frontend/src/app/features/team-planner/team-planner/add-work-packages/add-existing-pane.component.sass @@ -6,7 +6,7 @@ grid-row-gap: 10px background: #F3F3F3 padding: 8px - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) .op-add-existing-pane &--results diff --git a/frontend/src/app/features/team-planner/team-planner/planner/team-planner.component.sass b/frontend/src/app/features/team-planner/team-planner/planner/team-planner.component.sass index f363b1163811..02388b6d42a1 100644 --- a/frontend/src/app/features/team-planner/team-planner/planner/team-planner.component.sass +++ b/frontend/src/app/features/team-planner/team-planner/planner/team-planner.component.sass @@ -82,7 +82,7 @@ $op-team-planner-resource-width: 180px flex-direction: column justify-content: center align-items: center - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) border-top: 0px diff --git a/frontend/src/app/features/user-preferences/notifications-settings/table/notification-settings-table.component.sass b/frontend/src/app/features/user-preferences/notifications-settings/table/notification-settings-table.component.sass index 1fee0c219a58..179ab0c8413f 100644 --- a/frontend/src/app/features/user-preferences/notifications-settings/table/notification-settings-table.component.sass +++ b/frontend/src/app/features/user-preferences/notifications-settings/table/notification-settings-table.component.sass @@ -16,6 +16,6 @@ margin: auto .op-table--cell--date-alerts - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) text-align: center padding: $spot-spacing-0_75 $spot-spacing-1 diff --git a/frontend/src/app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component.sass b/frontend/src/app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component.sass index 0a317da92883..a16600f77f33 100644 --- a/frontend/src/app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component.sass +++ b/frontend/src/app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component.sass @@ -7,7 +7,7 @@ user-select: none // Leave space for the shadow to be displayed width: calc(100% - 2px) - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) border-radius: 2px padding: 10px position: relative diff --git a/frontend/src/app/shared/components/forms/fieldset.sass b/frontend/src/app/shared/components/forms/fieldset.sass index bc59babcc781..a317a936aa28 100644 --- a/frontend/src/app/shared/components/forms/fieldset.sass +++ b/frontend/src/app/shared/components/forms/fieldset.sass @@ -21,7 +21,6 @@ &--legend width: 100% - color: #4d4d4d font-size: var(--body-font-size) font-weight: var(--base-text-weight-bold) line-height: 1.8 diff --git a/frontend/src/app/shared/components/op-content-loader/op-wp-loading-skeleton/op-wp-loading-skeleton.component.sass b/frontend/src/app/shared/components/op-content-loader/op-wp-loading-skeleton/op-wp-loading-skeleton.component.sass index fc94375deb17..621845729f4a 100644 --- a/frontend/src/app/shared/components/op-content-loader/op-wp-loading-skeleton/op-wp-loading-skeleton.component.sass +++ b/frontend/src/app/shared/components/op-content-loader/op-wp-loading-skeleton/op-wp-loading-skeleton.component.sass @@ -1,6 +1,6 @@ .op-wp-loading-skeleton width: calc(100% - 2px) - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) border-radius: 2px padding: 10px position: relative diff --git a/frontend/src/app/shared/components/table/table.sass b/frontend/src/app/shared/components/table/table.sass index 0f74d55af3f3..1fc6235b564f 100644 --- a/frontend/src/app/shared/components/table/table.sass +++ b/frontend/src/app/shared/components/table/table.sass @@ -4,7 +4,7 @@ &--cell padding: 12px 16px - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) text-align: center &_heading diff --git a/frontend/src/app/spot/styles/sass/components/form-field.sass b/frontend/src/app/spot/styles/sass/components/form-field.sass index 8356bc3db014..e02cedffae08 100644 --- a/frontend/src/app/spot/styles/sass/components/form-field.sass +++ b/frontend/src/app/spot/styles/sass/components/form-field.sass @@ -21,10 +21,6 @@ margin-bottom: $spot-spacing-0_25 @include spot-body-small($weight: var(--base-text-weight-bold)) - color: $spot-color-basic-gray-1 - - &-indicator - color: $spot-color-basic-black &--help-text padding-left: $spot-spacing-0_25 diff --git a/frontend/src/global_styles/common/menu/menu.sass b/frontend/src/global_styles/common/menu/menu.sass index e77bccfb6034..81bd48d17039 100644 --- a/frontend/src/global_styles/common/menu/menu.sass +++ b/frontend/src/global_styles/common/menu/menu.sass @@ -52,6 +52,6 @@ text-transform: uppercase &--separator - border-bottom: 1px solid var(--color-border-muted) + border-bottom: 1px solid var(--color-border-default) margin: 0 0 10px background: none diff --git a/frontend/src/global_styles/common/select/select.sass b/frontend/src/global_styles/common/select/select.sass index 1b35054f1380..cbbb6c8ee24d 100644 --- a/frontend/src/global_styles/common/select/select.sass +++ b/frontend/src/global_styles/common/select/select.sass @@ -10,12 +10,10 @@ border: 0 padding: 8px 10px line-height: 22px - background-color: #fff - color: rgba(0, 0, 0, 0.87) + color: var(--body-font-color) font-weight: var(--base-text-weight-bold) width: 100% text-align: left &:hover - background-color: #f5faff - color: #333 + background-color: var(--list-item-hover--color) diff --git a/frontend/src/global_styles/content/_accounts.sass b/frontend/src/global_styles/content/_accounts.sass index e25743fcc01b..bb30715187c0 100644 --- a/frontend/src/global_styles/content/_accounts.sass +++ b/frontend/src/global_styles/content/_accounts.sass @@ -71,7 +71,7 @@ // from http://codepen.io/ericrasch/pen/Irlpm &:after - border-bottom: 2px solid var(--color-border-muted) + border-bottom: 2px solid var(--color-border-default) content: "" // this centers the line to the full width specified margin: 0 auto diff --git a/frontend/src/global_styles/content/_attributes_group.sass b/frontend/src/global_styles/content/_attributes_group.sass index 75b9bd3e4b24..6cf830205b9e 100644 --- a/frontend/src/global_styles/content/_attributes_group.sass +++ b/frontend/src/global_styles/content/_attributes_group.sass @@ -33,7 +33,7 @@ .attributes-group--header @include grid-block margin: 0 0 0.5rem 0 - border-bottom: 1px solid var(--color-border-muted) + border-bottom: 1px solid var(--color-border-default) align-items: flex-end diff --git a/frontend/src/global_styles/content/_autocomplete.sass b/frontend/src/global_styles/content/_autocomplete.sass index 85980a95545f..d4ae94a550fe 100644 --- a/frontend/src/global_styles/content/_autocomplete.sass +++ b/frontend/src/global_styles/content/_autocomplete.sass @@ -45,9 +45,9 @@ div.autocomplete padding: 2px cursor: pointer font-size: 90% - border: 1px solid var(--color-border-muted) - border-left: 1px solid var(--color-border-muted) - border-right: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) + border-left: 1px solid var(--color-border-default) + border-right: 1px solid var(--color-border-default) background-color: white &.selected background-color: #ffb @@ -96,10 +96,21 @@ div.autocomplete -webkit-box-sizing: border-box !important -moz-box-sizing: border-box !important box-sizing: border-box !important + .ng-value @include text-shortener line-height: 22px +// Override some basic styles to ensure that ngSelect matches the current theme +.ng-select-container, +.ng-option:not(.ng-option-marked), +.ng-dropdown-panel, +.ng-dropdown-panel-items, +.ng-dropdown-footer + background-color: var(--body-background) !important + color: var(--body-font-color) !important + border-color: var(--color-border-default) !important + .ng-select .ng-arrow-wrapper .ng-arrow border-color: var(--color-fg-muted) transparent transparent @@ -137,7 +148,8 @@ div.autocomplete margin-right: 8px &.ng-option-marked - background-color: $spot-color-basic-gray-6 !important + background-color: var(--list-item-hover--color) !important + color: var(--body-font-color) !important .ng-dropdown-footer padding: 0 !important diff --git a/frontend/src/global_styles/content/_boxes.sass b/frontend/src/global_styles/content/_boxes.sass index ef85507997ea..3602170afb59 100644 --- a/frontend/src/global_styles/content/_boxes.sass +++ b/frontend/src/global_styles/content/_boxes.sass @@ -30,7 +30,7 @@ padding: 6px margin-bottom: 10px line-height: 1.5em - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) .box p padding-top: 5px diff --git a/frontend/src/global_styles/content/_context_menu.sass b/frontend/src/global_styles/content/_context_menu.sass index e182a4d2396e..ea3ff74fad97 100644 --- a/frontend/src/global_styles/content/_context_menu.sass +++ b/frontend/src/global_styles/content/_context_menu.sass @@ -32,7 +32,7 @@ list-style-type: none margin: 0 min-width: 240px - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) padding: 3px 0 background: #ffffff @@ -112,4 +112,3 @@ html:not(.-browser-mobile) &:hover, &:focus .context-menu--icon opacity: 100 - diff --git a/frontend/src/global_styles/content/_enterprise.sass b/frontend/src/global_styles/content/_enterprise.sass index 76bc9b1956db..c83b4b0dd8ad 100644 --- a/frontend/src/global_styles/content/_enterprise.sass +++ b/frontend/src/global_styles/content/_enterprise.sass @@ -11,7 +11,7 @@ margin-bottom: 20px box-shadow: 4px 4px 10px rgb(0 0 0 / 15%) border-radius: 25px - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) .widget-box--teaser-image_default width: 30% diff --git a/frontend/src/global_styles/content/_forms.sass b/frontend/src/global_styles/content/_forms.sass index c1ad93008c6d..95f614abaf3f 100644 --- a/frontend/src/global_styles/content/_forms.sass +++ b/frontend/src/global_styles/content/_forms.sass @@ -78,7 +78,7 @@ form &.-bordered padding: 30px 20px background-color: var(--content-form-bg-color) - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) &.-compressed padding: 10px 20px 0 20px @@ -181,7 +181,7 @@ hr border: 0 &.form--separator - border-bottom: 1px solid var(--color-border-muted) + border-bottom: 1px solid var(--color-border-default) margin: 0 0 30px background: none @@ -226,12 +226,11 @@ hr %form--fieldset-legend-or-section-title - color: #4d4d4d font-size: var(--body-font-size) font-weight: var(--base-text-weight-bold) line-height: 1.8 text-transform: uppercase - border-bottom: 1px solid var(--color-border-muted) + border-bottom: 1px solid var(--color-border-default) // HACK. TODO: Remove fieldset element rules in various places. .form--fieldset, @@ -270,7 +269,6 @@ fieldset.form--fieldset .form--toolbar float: right text-align: right - color: #4d4d4d font-size: var(--body-font-size) font-style: italic line-height: 1.8 diff --git a/frontend/src/global_styles/content/_pagination.sass b/frontend/src/global_styles/content/_pagination.sass index a536e8ed020b..4b3033cd4e2b 100644 --- a/frontend/src/global_styles/content/_pagination.sass +++ b/frontend/src/global_styles/content/_pagination.sass @@ -79,7 +79,7 @@ $pagination--font-size: 0.8125rem min-width: 25px text-align: center padding: 3px 3px - background: #f8f8f8 + background: var(--button--background-color) border-radius: 2px border: 1px solid var(--button--border-color) color: var(--body-font-color) @@ -89,7 +89,7 @@ $pagination--font-size: 0.8125rem &:hover color: var(--body-font-color) text-decoration: none - background: #eaeaea + background: var(--button--background-hover-color) &--space background: #ffffff diff --git a/frontend/src/global_styles/content/_scrollable_tabs.sass b/frontend/src/global_styles/content/_scrollable_tabs.sass index 844676b6a93e..603e762ee466 100644 --- a/frontend/src/global_styles/content/_scrollable_tabs.sass +++ b/frontend/src/global_styles/content/_scrollable_tabs.sass @@ -1,6 +1,6 @@ .op-scrollable-tabs display: flex - border-bottom: 1px solid var(--color-border-muted) + border-bottom: 1px solid var(--color-border-default) margin-bottom: 1.5rem &--tab-container diff --git a/frontend/src/global_styles/content/_simple_filters.sass b/frontend/src/global_styles/content/_simple_filters.sass index e1d2cd02ba72..643da0612dbf 100644 --- a/frontend/src/global_styles/content/_simple_filters.sass +++ b/frontend/src/global_styles/content/_simple_filters.sass @@ -26,7 +26,7 @@ // See COPYRIGHT and LICENSE files for more details. //++ -$filters--border-color: var(--color-border-muted) !default +$filters--border-color: var(--color-border-default) !default %filters--container border: 1px solid $filters--border-color diff --git a/frontend/src/global_styles/content/_table.sass b/frontend/src/global_styles/content/_table.sass index eae4123ca540..e41031154d14 100644 --- a/frontend/src/global_styles/content/_table.sass +++ b/frontend/src/global_styles/content/_table.sass @@ -348,7 +348,7 @@ thead.-sticky th .generic-table--no-results-container background: var(--gray-light) - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) border-radius: 4px padding: 14px 14px 14px 36px display: block diff --git a/frontend/src/global_styles/content/editor/_ckeditor.sass b/frontend/src/global_styles/content/editor/_ckeditor.sass index 6c6b6b23af68..1f0a029c318c 100644 --- a/frontend/src/global_styles/content/editor/_ckeditor.sass +++ b/frontend/src/global_styles/content/editor/_ckeditor.sass @@ -112,5 +112,5 @@ ckeditor-augmented-textarea .op-ckeditor--wrapper margin-left: 0 margin-right: 40px -.ck tr .ck-editor__nested-editable +.ck tr .ck-editor__nested-editable border: 1px solid var(--ck-color-base-border) diff --git a/frontend/src/global_styles/content/menus/_menu_blocks.sass b/frontend/src/global_styles/content/menus/_menu_blocks.sass index 5ececb005396..9c20452fd5a2 100644 --- a/frontend/src/global_styles/content/menus/_menu_blocks.sass +++ b/frontend/src/global_styles/content/menus/_menu_blocks.sass @@ -14,7 +14,7 @@ justify-items: center text-align: center background: #cccccc30 - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) &:hover outline: 1px solid grey diff --git a/frontend/src/global_styles/content/modules/_bim.sass b/frontend/src/global_styles/content/modules/_bim.sass index 454a022ce65b..7cc117a7a47f 100644 --- a/frontend/src/global_styles/content/modules/_bim.sass +++ b/frontend/src/global_styles/content/modules/_bim.sass @@ -9,7 +9,7 @@ padding: 10px &.-failed - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) img width: 100% diff --git a/frontend/src/global_styles/content/modules/_team_planner.sass b/frontend/src/global_styles/content/modules/_team_planner.sass index 758c45bdf856..015f0b8fa7b3 100644 --- a/frontend/src/global_styles/content/modules/_team_planner.sass +++ b/frontend/src/global_styles/content/modules/_team_planner.sass @@ -15,7 +15,7 @@ $view-select-dropdown-width: 8rem display: none !important .op-team-planner - --fc-border-color: var(--color-border-muted) + --fc-border-color: var(--color-border-default) &--calendar_empty .fc-scrollgrid-section-body, diff --git a/frontend/src/global_styles/content/user-content/_code-block.sass b/frontend/src/global_styles/content/user-content/_code-block.sass index 7a50b1d289ba..080a5b8b28e5 100644 --- a/frontend/src/global_styles/content/user-content/_code-block.sass +++ b/frontend/src/global_styles/content/user-content/_code-block.sass @@ -6,7 +6,7 @@ overflow-x: auto overflow-y: hidden background-color: #fafafa - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) > * background-color: transparent @@ -27,6 +27,6 @@ font-weight: normal color: #333739 background-color: #fafafa - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) padding: 0.125em 0.3125em break-inside: avoid diff --git a/frontend/src/global_styles/content/user-content/_placeholder.sass b/frontend/src/global_styles/content/user-content/_placeholder.sass index 7a4b6437cd58..6d5743838f50 100644 --- a/frontend/src/global_styles/content/user-content/_placeholder.sass +++ b/frontend/src/global_styles/content/user-content/_placeholder.sass @@ -4,4 +4,4 @@ color: #6f6f6f padding: 1rem background-color: #fafafa - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) diff --git a/frontend/src/global_styles/content/user-content/_toc.sass b/frontend/src/global_styles/content/user-content/_toc.sass index 59ad91e95543..6a91b0668c2b 100644 --- a/frontend/src/global_styles/content/user-content/_toc.sass +++ b/frontend/src/global_styles/content/user-content/_toc.sass @@ -2,7 +2,7 @@ break-inside: avoid font-size: var(--wiki-default-font-size) background-color: #fafafa - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) float: right margin: 1rem 0rem 1rem 2rem padding: 1.5rem 1.5rem 1.5rem 0rem diff --git a/frontend/src/global_styles/content/user-content/_typography.sass b/frontend/src/global_styles/content/user-content/_typography.sass index cb993bf99070..a9f54fe8f275 100644 --- a/frontend/src/global_styles/content/user-content/_typography.sass +++ b/frontend/src/global_styles/content/user-content/_typography.sass @@ -23,7 +23,7 @@ .op-uc-h1 margin-bottom: 0.5rem - border-bottom: 1px solid var(--color-border-muted) + border-bottom: 1px solid var(--color-border-default) .op-uc-container_reduced-headings border-bottom: none diff --git a/frontend/src/global_styles/layout/_colors.sass b/frontend/src/global_styles/layout/_colors.sass index d3f7d826c2e8..a5bf77fae3db 100644 --- a/frontend/src/global_styles/layout/_colors.sass +++ b/frontend/src/global_styles/layout/_colors.sass @@ -65,7 +65,7 @@ // Square items flex: 0 0 150px height: 150px - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) margin: 10px diff --git a/frontend/src/global_styles/layout/work_packages/_full_view.sass b/frontend/src/global_styles/layout/work_packages/_full_view.sass index f5f99a590f03..35e9f98ef1ff 100644 --- a/frontend/src/global_styles/layout/work_packages/_full_view.sass +++ b/frontend/src/global_styles/layout/work_packages/_full_view.sass @@ -39,14 +39,14 @@ &--split-container display: flex flex-shrink: 8 - border-top: 1px solid var(--color-border-muted) + border-top: 1px solid var(--color-border-default) overflow: visible height: 100% // Important for Firefox to let 'flex-shrink' work correctly. min-height: 0 &--split-left - border-right: 1px solid var(--color-border-muted) + border-right: 1px solid var(--color-border-default) overflow-y: auto overflow-x: hidden flex: 2 diff --git a/frontend/src/global_styles/openproject/_forms.sass b/frontend/src/global_styles/openproject/_forms.sass index 71b79dce941f..13bd677e4dca 100644 --- a/frontend/src/global_styles/openproject/_forms.sass +++ b/frontend/src/global_styles/openproject/_forms.sass @@ -46,7 +46,6 @@ $form-fontsize: 0.875rem !default $form-padding: 0.5rem !default // Text fields -$input-color: #000 !default $input-border: 1px solid var(--color-border-default) !default $input-border-focus: 1px solid #999 !default @@ -79,7 +78,7 @@ $select-arrow-color: #000 !default border: $input-border border-radius: 2px background-color: transparent - color: $input-color + color: var(--body-font-color) font-size: $form-fontsize -webkit-font-smoothing: antialiased vertical-align: middle diff --git a/frontend/src/global_styles/openproject/_homescreen.sass b/frontend/src/global_styles/openproject/_homescreen.sass index 540d224359bd..5dd25513929f 100644 --- a/frontend/src/global_styles/openproject/_homescreen.sass +++ b/frontend/src/global_styles/openproject/_homescreen.sass @@ -31,7 +31,7 @@ .controller-homescreen #content-wrapper .widget-box box-shadow: none - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) &.upsale background: $spot-color-feedback-info-light diff --git a/frontend/src/global_styles/openproject/_mixins.sass b/frontend/src/global_styles/openproject/_mixins.sass index 27b915ab97b9..c9c5a2014647 100644 --- a/frontend/src/global_styles/openproject/_mixins.sass +++ b/frontend/src/global_styles/openproject/_mixins.sass @@ -83,7 +83,7 @@ @mixin widget-box--style background: var(--body-background) margin: 10px - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) box-shadow: 0px 1px 5px 0px rgba(0,0,0,0.1) @mixin widget-box--hover-style diff --git a/frontend/src/global_styles/openproject/_scm.sass b/frontend/src/global_styles/openproject/_scm.sass index 2372afc02d2e..7b95d0d68dd4 100644 --- a/frontend/src/global_styles/openproject/_scm.sass +++ b/frontend/src/global_styles/openproject/_scm.sass @@ -96,14 +96,14 @@ li.change color: var(--color-fg-muted) table.filecontent - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) border-collapse: collapse width: 98% background-color: #fafafa line-height: initial th - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) background-color: #eee &.filename background-color: #e4e4d4 diff --git a/modules/github_integration/frontend/module/git-actions-menu/styles/git-actions-menu.sass b/modules/github_integration/frontend/module/git-actions-menu/styles/git-actions-menu.sass index 7a02a628d70e..39ed99899035 100644 --- a/modules/github_integration/frontend/module/git-actions-menu/styles/git-actions-menu.sass +++ b/modules/github_integration/frontend/module/git-actions-menu/styles/git-actions-menu.sass @@ -1,6 +1,6 @@ .git-actions-menu background-color: var(--body-background) - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) padding: 1rem 1rem 2rem 1rem min-width: 25rem box-shadow: .1em .1em .4em rgba(0,0,0,0.1) diff --git a/modules/github_integration/frontend/module/pull-request/pr-check.component.sass b/modules/github_integration/frontend/module/pull-request/pr-check.component.sass index e813fe944090..876f643ef097 100644 --- a/modules/github_integration/frontend/module/pull-request/pr-check.component.sass +++ b/modules/github_integration/frontend/module/pull-request/pr-check.component.sass @@ -4,7 +4,7 @@ grid-template-columns: 28px 33px 1fr auto grid-template-areas: "check-state-icon check-avatar check-info check-details" list-style-type: none - border: 1px solid var(--color-border-muted) + border: 1px solid var(--color-border-default) padding: 0.3rem 1rem background: rgba(0, 0, 0, 0.05) font-size: 0.9rem From 4ec3e5039d885a08028efc4066c36bf2a3b1f643 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Wed, 24 Apr 2024 11:10:22 +0200 Subject: [PATCH 005/325] replace deprecated Primer variables with their new names --- .../custom_styles/_primer_color_mapping.erb | 18 +++++++++--------- .../input/global-search-input.component.sass | 2 +- .../backlogs-page/styles/dialogues.sass | 2 +- .../backlogs-page/styles/master_backlog.sass | 6 +++--- .../backlogs-page/styles/taskboard.sass | 4 ++-- .../bcf-wp-attribute-group.component.sass | 2 +- .../pages/viewer/styles/loading_modal.sass | 2 +- .../calendar/wp-calendar/wp-calendar.sass | 2 +- .../in-app-notification-entry.component.sass | 4 ++-- .../add-existing-pane.component.sass | 2 +- .../planner/team-planner.component.sass | 2 +- .../notification-settings-table.component.sass | 2 +- .../wp-single-card.component.sass | 2 +- .../draggable-autocomplete.component.sass | 2 +- .../op-wp-loading-skeleton.component.sass | 2 +- .../src/app/shared/components/table/table.sass | 2 +- .../src/global_styles/common/input/input.sass | 2 +- .../src/global_styles/common/menu/menu.sass | 2 +- .../src/global_styles/content/_accounts.sass | 3 +-- .../content/_attributes_group.sass | 2 +- .../global_styles/content/_autocomplete.sass | 10 +++++----- frontend/src/global_styles/content/_boxes.sass | 2 +- .../global_styles/content/_context_menu.sass | 2 +- .../src/global_styles/content/_enterprise.sass | 2 +- frontend/src/global_styles/content/_forms.sass | 8 ++++---- .../content/_scrollable_tabs.sass | 2 +- .../global_styles/content/_simple_filters.sass | 2 +- frontend/src/global_styles/content/_table.sass | 2 +- .../content/menus/_menu_blocks.sass | 2 +- .../global_styles/content/modules/_bim.sass | 2 +- .../content/modules/_team_planner.sass | 2 +- .../content/user-content/_code-block.sass | 4 ++-- .../content/user-content/_placeholder.sass | 2 +- .../content/user-content/_toc.sass | 2 +- .../content/user-content/_typography.sass | 2 +- .../work_packages/shared/_file_section.sass | 4 ++-- frontend/src/global_styles/layout/_colors.sass | 2 +- .../layout/work_packages/_full_view.sass | 4 ++-- .../src/global_styles/openproject/_forms.sass | 2 +- .../global_styles/openproject/_homescreen.sass | 2 +- .../src/global_styles/openproject/_mixins.sass | 2 +- .../src/global_styles/openproject/_scm.sass | 4 ++-- .../styles/git-actions-menu.sass | 4 ++-- .../pull-request/pr-check.component.sass | 2 +- 44 files changed, 68 insertions(+), 69 deletions(-) diff --git a/app/views/custom_styles/_primer_color_mapping.erb b/app/views/custom_styles/_primer_color_mapping.erb index 2097790abc1b..e806f7e5359e 100644 --- a/app/views/custom_styles/_primer_color_mapping.erb +++ b/app/views/custom_styles/_primer_color_mapping.erb @@ -20,15 +20,15 @@ --avatar-border-color: var(--color-avatar-border); --list-item-hover--border-color: var(--color-action-list-item-default-active-border); --list-item-hover--color: var(--color-action-list-item-default-hover-bg); - --inplace-edit--border-color: var(--color-border-default); - --ck-color-toolbar-border: var(--color-border-default); - --ck-color-base-border: var(--color-border-default); + --inplace-edit--border-color: var(--borderColor-default); + --ck-color-toolbar-border: var(--borderColor-default); + --ck-color-base-border: var(--borderColor-default); --ck-color-button-default-hover-background: var(--color-action-list-item-default-hover-bg); --ck-color-toolbar-background: var(--body-background); --ck-color-text: var(--body-font-color); - --table-border-color: var(--color-border-default); + --table-border-color: var(--borderColor-default); --toolbar-item--bg-color: var(--color-btn-bg); - --toolbar-item--border-color: var(--color-border-default); + --toolbar-item--border-color: var(--borderColor-default); --button--border-color: var(--color-btn-border); --button--primary-font-color: var(--color-btn-primary-text); --button--primary-background-hover-color: var(--color-btn-primary-hover-bg); @@ -51,16 +51,16 @@ --header-item-font-color: var(--color-fg-default); --header-item-bg-hover-color: var(--color-action-list-item-default-hover-bg); --header-item-font-hover-color: var(--color-fg-default); - --header-border-bottom-color: var(--color-border-muted) !important; + --header-border-bottom-color: var(--borderColor-muted) !important; --main-menu-bg-color: var(--color-page-header-bg); --main-menu-hover-font-color: var(--color-fg-default); --main-menu-bg-selected-background: var(--color-action-list-item-default-hover-bg); --main-menu-bg-hover-background: var(--color-action-list-item-default-hover-bg); --main-menu-font-color: var(--color-fg-default); --main-menu-selected-font-color: var(--color-fg-default); - --main-menu-border-color: var(--color-border-muted); - --main-menu-resizer-color: var(--color-border-muted); - --main-menu-bg-selected-border: var(--color-border-muted); + --main-menu-border-color: var(--borderColor-muted); + --main-menu-resizer-color: var(--borderColor-muted); + --main-menu-bg-selected-border: var(--borderColor-muted); --main-menu-hover-border-color: var(--color-fg-default) !important; --main-menu-fieldset-header-color: var(--color-fg-subtle) !important; --main-menu-border-width: 1px; diff --git a/frontend/src/app/core/global_search/input/global-search-input.component.sass b/frontend/src/app/core/global_search/input/global-search-input.component.sass index 7e4c303f3403..56278c3d9c99 100644 --- a/frontend/src/app/core/global_search/input/global-search-input.component.sass +++ b/frontend/src/app/core/global_search/input/global-search-input.component.sass @@ -109,7 +109,7 @@ $search-input-height: 30px height: auto .ng-option - border-bottom: 1px solid var(--color-border-default) + border-bottom: 1px solid var(--borderColor-default) white-space: normal padding: 5px 10px // We do not want the default highlighting of ng-select to take place as diff --git a/frontend/src/app/features/backlogs/backlogs-page/styles/dialogues.sass b/frontend/src/app/features/backlogs/backlogs-page/styles/dialogues.sass index b3f495068dc4..51f842063717 100644 --- a/frontend/src/app/features/backlogs/backlogs-page/styles/dialogues.sass +++ b/frontend/src/app/features/backlogs/backlogs-page/styles/dialogues.sass @@ -6,4 +6,4 @@ .ui-dialog background: #FFFFFF - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) diff --git a/frontend/src/app/features/backlogs/backlogs-page/styles/master_backlog.sass b/frontend/src/app/features/backlogs/backlogs-page/styles/master_backlog.sass index 5ed0d0e05e52..1e712a015351 100644 --- a/frontend/src/app/features/backlogs/backlogs-page/styles/master_backlog.sass +++ b/frontend/src/app/features/backlogs/backlogs-page/styles/master_backlog.sass @@ -52,7 +52,7 @@ top: 1px width: 100px #backlogs_container .backlog - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) display: block margin: 0 0 10px 0 width: 100% @@ -74,7 +74,7 @@ position: relative width: 100% .backlog .header .backlog-menu - border-right: 1px solid var(--color-border-default) + border-right: 1px solid var(--borderColor-default) cursor: pointer height: 30px overflow: visible @@ -95,7 +95,7 @@ .items display: none background-color: #EEEEEE - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) position: absolute top: 30px right: -2px diff --git a/frontend/src/app/features/backlogs/backlogs-page/styles/taskboard.sass b/frontend/src/app/features/backlogs/backlogs-page/styles/taskboard.sass index 1c007f2d5457..623870356138 100644 --- a/frontend/src/app/features/backlogs/backlogs-page/styles/taskboard.sass +++ b/frontend/src/app/features/backlogs/backlogs-page/styles/taskboard.sass @@ -69,7 +69,7 @@ /* Must be the same as min-width */ #board_header background-color: #EBEBEB - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) margin-bottom: 0 margin-right: 10px td @@ -88,7 +88,7 @@ .board background-color: #FCFCFC - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) border-top: none margin-right: 10px /* IE7 table fix */ diff --git a/frontend/src/app/features/bim/bcf/bcf-wp-attribute-group/bcf-wp-attribute-group.component.sass b/frontend/src/app/features/bim/bcf/bcf-wp-attribute-group/bcf-wp-attribute-group.component.sass index 8e75f8fc60fb..2ca063119d22 100644 --- a/frontend/src/app/features/bim/bcf/bcf-wp-attribute-group/bcf-wp-attribute-group.component.sass +++ b/frontend/src/app/features/bim/bcf/bcf-wp-attribute-group/bcf-wp-attribute-group.component.sass @@ -31,7 +31,7 @@ ngx-gallery ::ng-deep // Disable red border on active thumbnails .ngx-gallery-active, .ngx-gallery-thumbnail - border: 1px solid var(--color-border-default) !important + border: 1px solid var(--borderColor-default) !important .ngx-gallery-preview-img background-color: white diff --git a/frontend/src/app/features/bim/ifc_models/pages/viewer/styles/loading_modal.sass b/frontend/src/app/features/bim/ifc_models/pages/viewer/styles/loading_modal.sass index e70a9e3e10f6..0a5633795341 100644 --- a/frontend/src/app/features/bim/ifc_models/pages/viewer/styles/loading_modal.sass +++ b/frontend/src/app/features/bim/ifc_models/pages/viewer/styles/loading_modal.sass @@ -17,7 +17,7 @@ background-color: #fefefe margin: auto padding: 0 - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) border-radius: 0.5em width: 50% box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19) diff --git a/frontend/src/app/features/calendar/wp-calendar/wp-calendar.sass b/frontend/src/app/features/calendar/wp-calendar/wp-calendar.sass index 2b7a5557d1cb..ad5a0f97f77d 100644 --- a/frontend/src/app/features/calendar/wp-calendar/wp-calendar.sass +++ b/frontend/src/app/features/calendar/wp-calendar/wp-calendar.sass @@ -1,5 +1,5 @@ .op-wp-calendar - --fc-border-color: var(--color-border-default) + --fc-border-color: var(--borderColor-default) // Ensure some sane min-height // to ensure fullcalendar has something to render diff --git a/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass b/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass index ea88fdaa1042..5045a4d67ca6 100644 --- a/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass +++ b/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass @@ -17,7 +17,7 @@ $subject-font-size: 14px margin: 0 padding: 15px 10px font-size: 0.9rem - border-top: 1px solid var(--color-border-default) + border-top: 1px solid var(--borderColor-default) border-radius: 2px height: $ian-height @@ -25,7 +25,7 @@ $subject-font-size: 14px background: $ian-bg-hover-color &:last-of-type - border-bottom: 1px solid var(--color-border-default) + border-bottom: 1px solid var(--borderColor-default) &_selected background: $ian-bg-selected-color diff --git a/frontend/src/app/features/team-planner/team-planner/add-work-packages/add-existing-pane.component.sass b/frontend/src/app/features/team-planner/team-planner/add-work-packages/add-existing-pane.component.sass index 2bdfe70dd022..f6a862086357 100644 --- a/frontend/src/app/features/team-planner/team-planner/add-work-packages/add-existing-pane.component.sass +++ b/frontend/src/app/features/team-planner/team-planner/add-work-packages/add-existing-pane.component.sass @@ -6,7 +6,7 @@ grid-row-gap: 10px background: #F3F3F3 padding: 8px - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) .op-add-existing-pane &--results diff --git a/frontend/src/app/features/team-planner/team-planner/planner/team-planner.component.sass b/frontend/src/app/features/team-planner/team-planner/planner/team-planner.component.sass index 02388b6d42a1..90132f33f75f 100644 --- a/frontend/src/app/features/team-planner/team-planner/planner/team-planner.component.sass +++ b/frontend/src/app/features/team-planner/team-planner/planner/team-planner.component.sass @@ -82,7 +82,7 @@ $op-team-planner-resource-width: 180px flex-direction: column justify-content: center align-items: center - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) border-top: 0px diff --git a/frontend/src/app/features/user-preferences/notifications-settings/table/notification-settings-table.component.sass b/frontend/src/app/features/user-preferences/notifications-settings/table/notification-settings-table.component.sass index 179ab0c8413f..a42ccde83a9c 100644 --- a/frontend/src/app/features/user-preferences/notifications-settings/table/notification-settings-table.component.sass +++ b/frontend/src/app/features/user-preferences/notifications-settings/table/notification-settings-table.component.sass @@ -16,6 +16,6 @@ margin: auto .op-table--cell--date-alerts - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) text-align: center padding: $spot-spacing-0_75 $spot-spacing-1 diff --git a/frontend/src/app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component.sass b/frontend/src/app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component.sass index a16600f77f33..6680671779a2 100644 --- a/frontend/src/app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component.sass +++ b/frontend/src/app/features/work-packages/components/wp-card-view/wp-single-card/wp-single-card.component.sass @@ -7,7 +7,7 @@ user-select: none // Leave space for the shadow to be displayed width: calc(100% - 2px) - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) border-radius: 2px padding: 10px position: relative diff --git a/frontend/src/app/shared/components/autocompleter/draggable-autocomplete/draggable-autocomplete.component.sass b/frontend/src/app/shared/components/autocompleter/draggable-autocomplete/draggable-autocomplete.component.sass index a3a3b7c55561..f3034f754dce 100644 --- a/frontend/src/app/shared/components/autocompleter/draggable-autocomplete/draggable-autocomplete.component.sass +++ b/frontend/src/app/shared/components/autocompleter/draggable-autocomplete/draggable-autocomplete.component.sass @@ -9,7 +9,7 @@ margin-right: 5px margin-bottom: 5px min-width: 50px - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) background: #F8F8F8 cursor: move display: flex diff --git a/frontend/src/app/shared/components/op-content-loader/op-wp-loading-skeleton/op-wp-loading-skeleton.component.sass b/frontend/src/app/shared/components/op-content-loader/op-wp-loading-skeleton/op-wp-loading-skeleton.component.sass index 621845729f4a..66e30b4c8aad 100644 --- a/frontend/src/app/shared/components/op-content-loader/op-wp-loading-skeleton/op-wp-loading-skeleton.component.sass +++ b/frontend/src/app/shared/components/op-content-loader/op-wp-loading-skeleton/op-wp-loading-skeleton.component.sass @@ -1,6 +1,6 @@ .op-wp-loading-skeleton width: calc(100% - 2px) - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) border-radius: 2px padding: 10px position: relative diff --git a/frontend/src/app/shared/components/table/table.sass b/frontend/src/app/shared/components/table/table.sass index 1fc6235b564f..b91a94f6c43e 100644 --- a/frontend/src/app/shared/components/table/table.sass +++ b/frontend/src/app/shared/components/table/table.sass @@ -4,7 +4,7 @@ &--cell padding: 12px 16px - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) text-align: center &_heading diff --git a/frontend/src/global_styles/common/input/input.sass b/frontend/src/global_styles/common/input/input.sass index e0f93f92bf3b..729ec6d0a847 100644 --- a/frontend/src/global_styles/common/input/input.sass +++ b/frontend/src/global_styles/common/input/input.sass @@ -1,6 +1,6 @@ .op-input background: white - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) border-radius: 2px min-height: 2rem display: flex diff --git a/frontend/src/global_styles/common/menu/menu.sass b/frontend/src/global_styles/common/menu/menu.sass index 81bd48d17039..9e60397eb905 100644 --- a/frontend/src/global_styles/common/menu/menu.sass +++ b/frontend/src/global_styles/common/menu/menu.sass @@ -52,6 +52,6 @@ text-transform: uppercase &--separator - border-bottom: 1px solid var(--color-border-default) + border-bottom: 1px solid var(--borderColor-default) margin: 0 0 10px background: none diff --git a/frontend/src/global_styles/content/_accounts.sass b/frontend/src/global_styles/content/_accounts.sass index bb30715187c0..e8ca16c2f841 100644 --- a/frontend/src/global_styles/content/_accounts.sass +++ b/frontend/src/global_styles/content/_accounts.sass @@ -71,8 +71,7 @@ // from http://codepen.io/ericrasch/pen/Irlpm &:after - border-bottom: 2px solid var(--color-border-default) - content: "" + border-bottom: 2px solid var(--borderColor-default) // this centers the line to the full width specified margin: 0 auto // positioning must be absolute here, and relative positioning diff --git a/frontend/src/global_styles/content/_attributes_group.sass b/frontend/src/global_styles/content/_attributes_group.sass index 6cf830205b9e..4a08f326c05c 100644 --- a/frontend/src/global_styles/content/_attributes_group.sass +++ b/frontend/src/global_styles/content/_attributes_group.sass @@ -33,7 +33,7 @@ .attributes-group--header @include grid-block margin: 0 0 0.5rem 0 - border-bottom: 1px solid var(--color-border-default) + border-bottom: 1px solid var(--borderColor-default) align-items: flex-end diff --git a/frontend/src/global_styles/content/_autocomplete.sass b/frontend/src/global_styles/content/_autocomplete.sass index d4ae94a550fe..419d2e4a4716 100644 --- a/frontend/src/global_styles/content/_autocomplete.sass +++ b/frontend/src/global_styles/content/_autocomplete.sass @@ -45,9 +45,9 @@ div.autocomplete padding: 2px cursor: pointer font-size: 90% - border: 1px solid var(--color-border-default) - border-left: 1px solid var(--color-border-default) - border-right: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) + border-left: 1px solid var(--borderColor-default) + border-right: 1px solid var(--borderColor-default) background-color: white &.selected background-color: #ffb @@ -80,7 +80,7 @@ div.autocomplete z-index: auto !important height: 30px !important min-height: 30px !important - border-color: var(--color-border-default) !important + border-color: var(--borderColor-default) !important .ng-value-container overflow: visible !important @@ -109,7 +109,7 @@ div.autocomplete .ng-dropdown-footer background-color: var(--body-background) !important color: var(--body-font-color) !important - border-color: var(--color-border-default) !important + border-color: var(--borderColor-default) !important .ng-select .ng-arrow-wrapper .ng-arrow border-color: var(--color-fg-muted) transparent transparent diff --git a/frontend/src/global_styles/content/_boxes.sass b/frontend/src/global_styles/content/_boxes.sass index 3602170afb59..2ed17d60a95a 100644 --- a/frontend/src/global_styles/content/_boxes.sass +++ b/frontend/src/global_styles/content/_boxes.sass @@ -30,7 +30,7 @@ padding: 6px margin-bottom: 10px line-height: 1.5em - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) .box p padding-top: 5px diff --git a/frontend/src/global_styles/content/_context_menu.sass b/frontend/src/global_styles/content/_context_menu.sass index ea3ff74fad97..21269797ad9e 100644 --- a/frontend/src/global_styles/content/_context_menu.sass +++ b/frontend/src/global_styles/content/_context_menu.sass @@ -32,7 +32,7 @@ list-style-type: none margin: 0 min-width: 240px - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) padding: 3px 0 background: #ffffff diff --git a/frontend/src/global_styles/content/_enterprise.sass b/frontend/src/global_styles/content/_enterprise.sass index c83b4b0dd8ad..b1f6e45fcb57 100644 --- a/frontend/src/global_styles/content/_enterprise.sass +++ b/frontend/src/global_styles/content/_enterprise.sass @@ -11,7 +11,7 @@ margin-bottom: 20px box-shadow: 4px 4px 10px rgb(0 0 0 / 15%) border-radius: 25px - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) .widget-box--teaser-image_default width: 30% diff --git a/frontend/src/global_styles/content/_forms.sass b/frontend/src/global_styles/content/_forms.sass index 95f614abaf3f..65b87e01c4a2 100644 --- a/frontend/src/global_styles/content/_forms.sass +++ b/frontend/src/global_styles/content/_forms.sass @@ -29,7 +29,7 @@ $form--field-types: (text-field, text-area, select, check-box, radio-button, range-field, search, file, date-picker) $base-line-height: 1.5 $form-label-color: var(--body-font-color) -$content-form-input-border: 1px solid var(--color-border-default) +$content-form-input-border: 1px solid var(--borderColor-default) %input-style border: $content-form-input-border @@ -78,7 +78,7 @@ form &.-bordered padding: 30px 20px background-color: var(--content-form-bg-color) - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) &.-compressed padding: 10px 20px 0 20px @@ -181,7 +181,7 @@ hr border: 0 &.form--separator - border-bottom: 1px solid var(--color-border-default) + border-bottom: 1px solid var(--borderColor-default) margin: 0 0 30px background: none @@ -230,7 +230,7 @@ hr font-weight: var(--base-text-weight-bold) line-height: 1.8 text-transform: uppercase - border-bottom: 1px solid var(--color-border-default) + border-bottom: 1px solid var(--borderColor-default) // HACK. TODO: Remove fieldset element rules in various places. .form--fieldset, diff --git a/frontend/src/global_styles/content/_scrollable_tabs.sass b/frontend/src/global_styles/content/_scrollable_tabs.sass index 603e762ee466..376d96794d5c 100644 --- a/frontend/src/global_styles/content/_scrollable_tabs.sass +++ b/frontend/src/global_styles/content/_scrollable_tabs.sass @@ -1,6 +1,6 @@ .op-scrollable-tabs display: flex - border-bottom: 1px solid var(--color-border-default) + border-bottom: 1px solid var(--borderColor-default) margin-bottom: 1.5rem &--tab-container diff --git a/frontend/src/global_styles/content/_simple_filters.sass b/frontend/src/global_styles/content/_simple_filters.sass index 643da0612dbf..c9c87480f0f2 100644 --- a/frontend/src/global_styles/content/_simple_filters.sass +++ b/frontend/src/global_styles/content/_simple_filters.sass @@ -26,7 +26,7 @@ // See COPYRIGHT and LICENSE files for more details. //++ -$filters--border-color: var(--color-border-default) !default +$filters--border-color: var(--borderColor-default) !default %filters--container border: 1px solid $filters--border-color diff --git a/frontend/src/global_styles/content/_table.sass b/frontend/src/global_styles/content/_table.sass index e41031154d14..d7aa0c7c3f3b 100644 --- a/frontend/src/global_styles/content/_table.sass +++ b/frontend/src/global_styles/content/_table.sass @@ -348,7 +348,7 @@ thead.-sticky th .generic-table--no-results-container background: var(--gray-light) - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) border-radius: 4px padding: 14px 14px 14px 36px display: block diff --git a/frontend/src/global_styles/content/menus/_menu_blocks.sass b/frontend/src/global_styles/content/menus/_menu_blocks.sass index 9c20452fd5a2..2ba5dd1ee0c7 100644 --- a/frontend/src/global_styles/content/menus/_menu_blocks.sass +++ b/frontend/src/global_styles/content/menus/_menu_blocks.sass @@ -14,7 +14,7 @@ justify-items: center text-align: center background: #cccccc30 - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) &:hover outline: 1px solid grey diff --git a/frontend/src/global_styles/content/modules/_bim.sass b/frontend/src/global_styles/content/modules/_bim.sass index 7cc117a7a47f..7bb4543aada2 100644 --- a/frontend/src/global_styles/content/modules/_bim.sass +++ b/frontend/src/global_styles/content/modules/_bim.sass @@ -9,7 +9,7 @@ padding: 10px &.-failed - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) img width: 100% diff --git a/frontend/src/global_styles/content/modules/_team_planner.sass b/frontend/src/global_styles/content/modules/_team_planner.sass index 015f0b8fa7b3..cdc5a3ced543 100644 --- a/frontend/src/global_styles/content/modules/_team_planner.sass +++ b/frontend/src/global_styles/content/modules/_team_planner.sass @@ -15,7 +15,7 @@ $view-select-dropdown-width: 8rem display: none !important .op-team-planner - --fc-border-color: var(--color-border-default) + --fc-border-color: var(--borderColor-default) &--calendar_empty .fc-scrollgrid-section-body, diff --git a/frontend/src/global_styles/content/user-content/_code-block.sass b/frontend/src/global_styles/content/user-content/_code-block.sass index 080a5b8b28e5..5868a787532e 100644 --- a/frontend/src/global_styles/content/user-content/_code-block.sass +++ b/frontend/src/global_styles/content/user-content/_code-block.sass @@ -6,7 +6,7 @@ overflow-x: auto overflow-y: hidden background-color: #fafafa - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) > * background-color: transparent @@ -27,6 +27,6 @@ font-weight: normal color: #333739 background-color: #fafafa - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) padding: 0.125em 0.3125em break-inside: avoid diff --git a/frontend/src/global_styles/content/user-content/_placeholder.sass b/frontend/src/global_styles/content/user-content/_placeholder.sass index 6d5743838f50..b8b2529f534f 100644 --- a/frontend/src/global_styles/content/user-content/_placeholder.sass +++ b/frontend/src/global_styles/content/user-content/_placeholder.sass @@ -4,4 +4,4 @@ color: #6f6f6f padding: 1rem background-color: #fafafa - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) diff --git a/frontend/src/global_styles/content/user-content/_toc.sass b/frontend/src/global_styles/content/user-content/_toc.sass index 6a91b0668c2b..aac0a83f1796 100644 --- a/frontend/src/global_styles/content/user-content/_toc.sass +++ b/frontend/src/global_styles/content/user-content/_toc.sass @@ -2,7 +2,7 @@ break-inside: avoid font-size: var(--wiki-default-font-size) background-color: #fafafa - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) float: right margin: 1rem 0rem 1rem 2rem padding: 1.5rem 1.5rem 1.5rem 0rem diff --git a/frontend/src/global_styles/content/user-content/_typography.sass b/frontend/src/global_styles/content/user-content/_typography.sass index a9f54fe8f275..5caa5e8d8f8c 100644 --- a/frontend/src/global_styles/content/user-content/_typography.sass +++ b/frontend/src/global_styles/content/user-content/_typography.sass @@ -23,7 +23,7 @@ .op-uc-h1 margin-bottom: 0.5rem - border-bottom: 1px solid var(--color-border-default) + border-bottom: 1px solid var(--borderColor-default) .op-uc-container_reduced-headings border-bottom: none diff --git a/frontend/src/global_styles/content/work_packages/shared/_file_section.sass b/frontend/src/global_styles/content/work_packages/shared/_file_section.sass index 92515080cb8a..3d13833f94c6 100644 --- a/frontend/src/global_styles/content/work_packages/shared/_file_section.sass +++ b/frontend/src/global_styles/content/work_packages/shared/_file_section.sass @@ -61,7 +61,7 @@ height: 100% left: 0 width: 100% - border: 2px dashed var(--color-border-default) + border: 2px dashed var(--borderColor-default) &_float display: none @@ -94,7 +94,7 @@ height: calc(100% - #{$spot-spacing-1}) left: $spot-spacing-0_5 width: calc(100% - #{$spot-spacing-1}) - border: 2px dashed var(--color-border-default) + border: 2px dashed var(--borderColor-default) &_dragging display: flex diff --git a/frontend/src/global_styles/layout/_colors.sass b/frontend/src/global_styles/layout/_colors.sass index a5bf77fae3db..ba91a1d30ffd 100644 --- a/frontend/src/global_styles/layout/_colors.sass +++ b/frontend/src/global_styles/layout/_colors.sass @@ -65,7 +65,7 @@ // Square items flex: 0 0 150px height: 150px - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) margin: 10px diff --git a/frontend/src/global_styles/layout/work_packages/_full_view.sass b/frontend/src/global_styles/layout/work_packages/_full_view.sass index 35e9f98ef1ff..88db5bae3729 100644 --- a/frontend/src/global_styles/layout/work_packages/_full_view.sass +++ b/frontend/src/global_styles/layout/work_packages/_full_view.sass @@ -39,14 +39,14 @@ &--split-container display: flex flex-shrink: 8 - border-top: 1px solid var(--color-border-default) + border-top: 1px solid var(--borderColor-default) overflow: visible height: 100% // Important for Firefox to let 'flex-shrink' work correctly. min-height: 0 &--split-left - border-right: 1px solid var(--color-border-default) + border-right: 1px solid var(--borderColor-default) overflow-y: auto overflow-x: hidden flex: 2 diff --git a/frontend/src/global_styles/openproject/_forms.sass b/frontend/src/global_styles/openproject/_forms.sass index 13bd677e4dca..f3fff912bbe6 100644 --- a/frontend/src/global_styles/openproject/_forms.sass +++ b/frontend/src/global_styles/openproject/_forms.sass @@ -46,7 +46,7 @@ $form-fontsize: 0.875rem !default $form-padding: 0.5rem !default // Text fields -$input-border: 1px solid var(--color-border-default) !default +$input-border: 1px solid var(--borderColor-default) !default $input-border-focus: 1px solid #999 !default // Labels diff --git a/frontend/src/global_styles/openproject/_homescreen.sass b/frontend/src/global_styles/openproject/_homescreen.sass index 5dd25513929f..0a4f3965efc1 100644 --- a/frontend/src/global_styles/openproject/_homescreen.sass +++ b/frontend/src/global_styles/openproject/_homescreen.sass @@ -31,7 +31,7 @@ .controller-homescreen #content-wrapper .widget-box box-shadow: none - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) &.upsale background: $spot-color-feedback-info-light diff --git a/frontend/src/global_styles/openproject/_mixins.sass b/frontend/src/global_styles/openproject/_mixins.sass index c9c5a2014647..4fdc0f8cdf63 100644 --- a/frontend/src/global_styles/openproject/_mixins.sass +++ b/frontend/src/global_styles/openproject/_mixins.sass @@ -83,7 +83,7 @@ @mixin widget-box--style background: var(--body-background) margin: 10px - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) box-shadow: 0px 1px 5px 0px rgba(0,0,0,0.1) @mixin widget-box--hover-style diff --git a/frontend/src/global_styles/openproject/_scm.sass b/frontend/src/global_styles/openproject/_scm.sass index 7b95d0d68dd4..d18e0890c701 100644 --- a/frontend/src/global_styles/openproject/_scm.sass +++ b/frontend/src/global_styles/openproject/_scm.sass @@ -96,14 +96,14 @@ li.change color: var(--color-fg-muted) table.filecontent - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) border-collapse: collapse width: 98% background-color: #fafafa line-height: initial th - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) background-color: #eee &.filename background-color: #e4e4d4 diff --git a/modules/github_integration/frontend/module/git-actions-menu/styles/git-actions-menu.sass b/modules/github_integration/frontend/module/git-actions-menu/styles/git-actions-menu.sass index 39ed99899035..33bc2ad63dc5 100644 --- a/modules/github_integration/frontend/module/git-actions-menu/styles/git-actions-menu.sass +++ b/modules/github_integration/frontend/module/git-actions-menu/styles/git-actions-menu.sass @@ -1,6 +1,6 @@ .git-actions-menu background-color: var(--body-background) - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) padding: 1rem 1rem 2rem 1rem min-width: 25rem box-shadow: .1em .1em .4em rgba(0,0,0,0.1) @@ -27,7 +27,7 @@ .copy-button margin: 0 - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) border-radius: 0 2px 2px 0 vertical-align: top left: -1px diff --git a/modules/github_integration/frontend/module/pull-request/pr-check.component.sass b/modules/github_integration/frontend/module/pull-request/pr-check.component.sass index 876f643ef097..c83c2a3b5f55 100644 --- a/modules/github_integration/frontend/module/pull-request/pr-check.component.sass +++ b/modules/github_integration/frontend/module/pull-request/pr-check.component.sass @@ -4,7 +4,7 @@ grid-template-columns: 28px 33px 1fr auto grid-template-areas: "check-state-icon check-avatar check-info check-details" list-style-type: none - border: 1px solid var(--color-border-default) + border: 1px solid var(--borderColor-default) padding: 0.3rem 1rem background: rgba(0, 0, 0, 0.05) font-size: 0.9rem From d2f756bc3db9328c3fde50cdce448089035e5876 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Wed, 24 Apr 2024 15:33:47 +0200 Subject: [PATCH 006/325] fix errors --- .../entry/in-app-notification-entry.component.sass | 2 +- .../add-work-packages/add-existing-pane.component.sass | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass b/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass index bd701560bdd8..f978129b80dc 100644 --- a/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass +++ b/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass @@ -1,4 +1,4 @@ -@import "src/assets/sass/helpers" +@import "helpers" $ian-bg-color: #FFFFFF $ian-bg-hover-color: var(--gray-light) diff --git a/frontend/src/app/features/team-planner/team-planner/add-work-packages/add-existing-pane.component.sass b/frontend/src/app/features/team-planner/team-planner/add-work-packages/add-existing-pane.component.sass index f6a862086357..e9f779c543b5 100644 --- a/frontend/src/app/features/team-planner/team-planner/add-work-packages/add-existing-pane.component.sass +++ b/frontend/src/app/features/team-planner/team-planner/add-work-packages/add-existing-pane.component.sass @@ -1,4 +1,4 @@ -@import "src/assets/sass/helpers" +@import "helpers" \:host display: grid From bd9a8ddb01fa7b8b6ce59eba770a7af2982fd241 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Wed, 24 Apr 2024 16:09:37 +0200 Subject: [PATCH 007/325] fix font color for primary buttons --- app/views/custom_styles/_primer_color_mapping.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/custom_styles/_primer_color_mapping.erb b/app/views/custom_styles/_primer_color_mapping.erb index addb01d353e5..3001ddc02c9d 100644 --- a/app/views/custom_styles/_primer_color_mapping.erb +++ b/app/views/custom_styles/_primer_color_mapping.erb @@ -34,7 +34,7 @@ --toolbar-item--bg-color: var(--button-default-bgColor-rest); --toolbar-item--border-color: var(--borderColor-default); --button--border-color: var(--color-btn-border); - --button--primary-font-color: var(--color-btn-primary-text); + --button--primary-font-color: var(--button-primary-fgColor-rest); --button--primary-background-hover-color: var(--button-primary-bgColor-hover); --button--primary-background-color: var(--button-primary-bgColor-rest); --button--active-border-color: var(--color-btn-border); From f8ef12a3345f76239a6ec3af64ef7871901bf74f Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Wed, 24 Apr 2024 16:43:28 +0200 Subject: [PATCH 008/325] add a feature flag for dark mode --- app/helpers/application_helper.rb | 2 +- config/initializers/feature_decisions.rb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index c03499add44e..a0ae456cd6e1 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -281,7 +281,7 @@ def theme_options_for_select [ [t("themes.light"), "light"], [t("themes.light_high_contrast"), "light_high_contrast"], - [t("themes.dark"), "dark"] + ([t("themes.dark"), "dark"] if OpenProject::FeatureDecisions.dark_mode_active?) ] end diff --git a/config/initializers/feature_decisions.rb b/config/initializers/feature_decisions.rb index b1bd4c7f2cc5..cddbbeff9e48 100644 --- a/config/initializers/feature_decisions.rb +++ b/config/initializers/feature_decisions.rb @@ -39,3 +39,4 @@ # OpenProject::FeatureDecisions.add :some_flag # end OpenProject::FeatureDecisions.add :favorite_projects +OpenProject::FeatureDecisions.add :dark_mode From 7ee5aaca2d9d9ca40fe81456ce95f082814aab5d Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Tue, 4 Jun 2024 07:23:31 +0200 Subject: [PATCH 009/325] fix primary button color and spot modal colors --- .../custom_styles/_primer_color_mapping.erb | 8 ++------ .../spot/styles/sass/components/drop-modal.sass | 4 ++-- .../app/spot/styles/sass/components/list.sass | 16 ++++++++-------- 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/app/views/custom_styles/_primer_color_mapping.erb b/app/views/custom_styles/_primer_color_mapping.erb index 7ff014b597fd..5a12d02962e2 100644 --- a/app/views/custom_styles/_primer_color_mapping.erb +++ b/app/views/custom_styles/_primer_color_mapping.erb @@ -13,10 +13,6 @@ --control-checked-bgColor-active: var(--control-checked-color) !important; --control-checked-bgColor-hover: var(--control-checked-color--major1) !important; --controlKnob-borderColor-checked: var(--control-checked-color) !important; - --button-primary-bgColor-rest: var(--button--primary-background-color) !important; - --button-primary-bgColor-hover: var(--button--primary-background-hover-color) !important; - --button-primary-bgColor-disabled: var(--button--primary-background-disabled-color) !important; - --button-primary-borderColor-disabled: var(--button--primary-border-disabled-color) !important; } /* Generic color mapping for content variables */ @@ -24,11 +20,11 @@ [data-dark-theme=dark] { --avatar-border-color: var(--avatar-borderColor); --list-item-hover--border-color: var(--control-transparent-borderColor-hover); - --list-item-hover--color: var(--color-action-list-item-default-hover-bg); + --list-item-hover--color: var(--fgColor-default); --inplace-edit--border-color: var(--borderColor-default); --ck-color-toolbar-border: var(--borderColor-default); --ck-color-base-border: var(--borderColor-default); - --ck-color-button-default-hover-background: var(--color-action-list-item-default-hover-bg); + --ck-color-button-default-hover-background: var(--fgColor-default); --ck-color-toolbar-background: var(--body-background); --ck-color-text: var(--body-font-color); --table-border-color: var(--borderColor-default); diff --git a/frontend/src/app/spot/styles/sass/components/drop-modal.sass b/frontend/src/app/spot/styles/sass/components/drop-modal.sass index 03b33edaf763..280d405d76b2 100644 --- a/frontend/src/app/spot/styles/sass/components/drop-modal.sass +++ b/frontend/src/app/spot/styles/sass/components/drop-modal.sass @@ -10,8 +10,8 @@ pointer-events: all opacity: 1 - box-shadow: $spot-shadow-light-mid - background: $spot-color-basic-white + box-shadow: var(--shadow-floating-medium) + background: var(--overlay-bgColor) border-radius: $border-radius display: flex diff --git a/frontend/src/app/spot/styles/sass/components/list.sass b/frontend/src/app/spot/styles/sass/components/list.sass index ca50b5aff481..6b6c451dc3b5 100644 --- a/frontend/src/app/spot/styles/sass/components/list.sass +++ b/frontend/src/app/spot/styles/sass/components/list.sass @@ -13,7 +13,7 @@ &-action @include spot-body-small - color: $spot-color-basic-gray-1 + color: var(--body-font-color) display: flex align-items: flex-start justify-content: flex-start @@ -29,7 +29,7 @@ @include spot-focus &:hover - background-color: $spot-color-basic-gray-6 + background-color: var(--control-transparent-bgColor-hover) text-decoration: none border-color: var(--list-item-hover--border-color) color: var(--list-item-hover--color) @@ -39,11 +39,11 @@ &:hover background-color: transparent cursor: not-allowed - color: $spot-color-basic-gray-1 + color: var(--list-item-hover--color) &_active#{&}_disabled - color: var(--fgColor-muted) - background-color: $spot-color-basic-gray-6 + color: var(--fgColor-default) + background-color: var(--control-transparent-bgColor-hover) &_link:not(&_disabled) color: var(--accent-color) @@ -54,12 +54,12 @@ &:hover, &:focus-within - background-color: $spot-color-basic-gray-6 + background-color: var(--control-transparent-bgColor-hover) text-decoration: none border-color: var(--list-item-hover--border-color) &_disabled - color: $spot-color-basic-gray-1 + color: var(--body-font-color) &:hover background: none @@ -110,7 +110,7 @@ &_active &--item-action_active font-weight: var(--base-text-weight-bold) - background-color: $spot-color-basic-gray-6 + background-color: var(--control-transparent-bgColor-hover) text-decoration: none border-color: var(--list-item-hover--border-color) From 8f25eb1608b0685d7dfbdd4ac11521b55734b7f1 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Tue, 4 Jun 2024 07:54:11 +0200 Subject: [PATCH 010/325] fix hover color in wp table --- frontend/src/global_styles/content/_table.sass | 4 ++-- .../global_styles/content/work_packages/_table_content.sass | 2 +- frontend/src/global_styles/layout/work_packages/_table.sass | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/global_styles/content/_table.sass b/frontend/src/global_styles/content/_table.sass index 627b4d5f93e5..14b722cdf20e 100644 --- a/frontend/src/global_styles/content/_table.sass +++ b/frontend/src/global_styles/content/_table.sass @@ -82,7 +82,7 @@ table.generic-table col &:hover, &.hover - background: #f8f8f8 + background: var(--bgColor-muted) thead height: var(--generic-table--header-height) @@ -267,7 +267,7 @@ thead.-sticky th &:hover, &.hover - background: #f8f8f8 + background: var(--bgColor-muted) &_no-highlighting &:hover, diff --git a/frontend/src/global_styles/content/work_packages/_table_content.sass b/frontend/src/global_styles/content/work_packages/_table_content.sass index a2beb11e063a..eef983de1fdf 100644 --- a/frontend/src/global_styles/content/work_packages/_table_content.sass +++ b/frontend/src/global_styles/content/work_packages/_table_content.sass @@ -91,7 +91,7 @@ // Remove padding from grouping rows (exceeds allowed width of 41px) .wp-table--group-header height: var(--table-timeline--row-height) - background-color: var(--gray-light) + background-color: var(--bgColor-muted) td padding: 0 !important background-color: transparent !important diff --git a/frontend/src/global_styles/layout/work_packages/_table.sass b/frontend/src/global_styles/layout/work_packages/_table.sass index b3222d931a66..e310b7fee1ff 100644 --- a/frontend/src/global_styles/layout/work_packages/_table.sass +++ b/frontend/src/global_styles/layout/work_packages/_table.sass @@ -69,7 +69,7 @@ div.row-hovered // Use important to override the background styles from __hl classes // That also have to be important (cf. 30863) - background: var(--gray-light) !important + background: var(--bgColor-muted) !important // Left part of the split view // == flex container for (table|timeline) From 62e18d7a75a610f443f9fdee42c82ebb43e48339 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Tue, 4 Jun 2024 08:33:56 +0200 Subject: [PATCH 011/325] fix background color of toolbar in details view and background color of selected row in a table --- app/views/custom_styles/_primer_color_mapping.erb | 1 + .../src/global_styles/layout/work_packages/_details_view.sass | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/custom_styles/_primer_color_mapping.erb b/app/views/custom_styles/_primer_color_mapping.erb index 5a12d02962e2..8657cdbeb8a5 100644 --- a/app/views/custom_styles/_primer_color_mapping.erb +++ b/app/views/custom_styles/_primer_color_mapping.erb @@ -39,6 +39,7 @@ --button--background-hover-color: var(--button-default-bgColor-hover); --button--background-color: var(--button-default-bgColor-rest); --primary-button-color: var(--button-primary-bgColor-rest); + --table-row-highlighting-color: var(--bgColor-muted); --status-selector-border-color: var(--button-default-borderColor-rest); --link-text-decoration: underline; /* Todo: Only when color is not bright enough */ diff --git a/frontend/src/global_styles/layout/work_packages/_details_view.sass b/frontend/src/global_styles/layout/work_packages/_details_view.sass index 143eb15c2af5..d662ba6c08ba 100644 --- a/frontend/src/global_styles/layout/work_packages/_details_view.sass +++ b/frontend/src/global_styles/layout/work_packages/_details_view.sass @@ -61,7 +61,7 @@ body.router--work-packages-partitioned-split-view-new bottom: 0 height: 55px width: 100% - background: #F8F8F8 + background: var(--bgColor-muted) border: 1px solid #eeeeee padding: 0 1rem 10px From 89f691832b0427271de43fda4653c2e3eca506da Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Tue, 4 Jun 2024 10:39:58 +0200 Subject: [PATCH 012/325] use primer var for selected row in wp table --- app/views/custom_styles/_primer_color_mapping.erb | 1 - frontend/src/global_styles/content/_tables.sass | 6 +++--- .../global_styles/layout/work_packages/_table_embedded.sass | 2 +- .../src/global_styles/openproject/_variable_defaults.scss | 1 - 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/app/views/custom_styles/_primer_color_mapping.erb b/app/views/custom_styles/_primer_color_mapping.erb index 8657cdbeb8a5..5a12d02962e2 100644 --- a/app/views/custom_styles/_primer_color_mapping.erb +++ b/app/views/custom_styles/_primer_color_mapping.erb @@ -39,7 +39,6 @@ --button--background-hover-color: var(--button-default-bgColor-hover); --button--background-color: var(--button-default-bgColor-rest); --primary-button-color: var(--button-primary-bgColor-rest); - --table-row-highlighting-color: var(--bgColor-muted); --status-selector-border-color: var(--button-default-borderColor-rest); --link-text-decoration: underline; /* Todo: Only when color is not bright enough */ diff --git a/frontend/src/global_styles/content/_tables.sass b/frontend/src/global_styles/content/_tables.sass index 0960b7fafae1..a079aed09442 100644 --- a/frontend/src/global_styles/content/_tables.sass +++ b/frontend/src/global_styles/content/_tables.sass @@ -155,13 +155,13 @@ th.hidden tr.context-menu-selection, tr.-checked - background-color: var(--table-row-highlighting-color) !important + background-color: var(--selection-bgColor) !important &[class*=__hl_background] outline: var(--table-row-highlighting-outline-color) solid 2px td - border-top: 1px solid var(--table-row-highlighting-color) !important - border-bottom: 1px solid var(--table-row-highlighting-color) !important + border-top: 1px solid var(--selection-bgColor) !important + border-bottom: 1px solid var(--selection-bgColor) !important color: var(--body-font-color) !important a color: var(--body-font-color) !important diff --git a/frontend/src/global_styles/layout/work_packages/_table_embedded.sass b/frontend/src/global_styles/layout/work_packages/_table_embedded.sass index 1620dafd8955..afe9eddb672b 100644 --- a/frontend/src/global_styles/layout/work_packages/_table_embedded.sass +++ b/frontend/src/global_styles/layout/work_packages/_table_embedded.sass @@ -77,7 +77,7 @@ $table-timeline--compact-row-height: 28px .wp-table--row border-bottom: none !important &:hover - background-color: var(--table-row-highlighting-color) + background-color: var(--selection-bgColor) thead, .generic-table--sort-header-outer diff --git a/frontend/src/global_styles/openproject/_variable_defaults.scss b/frontend/src/global_styles/openproject/_variable_defaults.scss index a6e368dd65b4..1e13473124c8 100644 --- a/frontend/src/global_styles/openproject/_variable_defaults.scss +++ b/frontend/src/global_styles/openproject/_variable_defaults.scss @@ -120,7 +120,6 @@ --inplace-edit--color--disabled: #4d4d4d; --inplace-edit--bg-color--disabled: #eee; --table-border-color: #E7E7E7; - --table-row-highlighting-color: #CCE6F7; --table-row-highlighting-outline-color: #00A6FF; --button--font-color: #222222; --button--background-color: var(--gray-light); From 1a140964aa56091bfd6135db3c5ac75a62f669c5 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Tue, 4 Jun 2024 12:00:04 +0200 Subject: [PATCH 013/325] fix colors in drop down --- frontend/src/global_styles/common/menu/menu.sass | 8 ++++---- .../src/global_styles/content/_context_menu.sass | 2 +- frontend/src/global_styles/layout/_drop_down.sass | 12 +++++------- .../openproject/_variable_defaults.scss | 1 - 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/frontend/src/global_styles/common/menu/menu.sass b/frontend/src/global_styles/common/menu/menu.sass index 4c7ab8e550ec..8b13502da2e2 100644 --- a/frontend/src/global_styles/common/menu/menu.sass +++ b/frontend/src/global_styles/common/menu/menu.sass @@ -20,7 +20,7 @@ text-decoration: none padding: 0 13px 0 10px font-weight: 400 - color: var(--context-menu-unselected-font-color) + color: var(--body-font-color) border: 1px solid transparent .spot-icon @@ -31,12 +31,12 @@ margin-right: 0.75rem &:focus - background-color: #f0f0f0 - color: var(--context-menu-unselected-font-color) + background-color: var(--control-transparent-bgColor-hover) + color: var(--body-font-color) &:hover, &:active - background-color: #f0f0f0 + background-color: var(--control-transparent-bgColor-hover) cursor: pointer text-decoration: none border-color: var(--list-item-hover--border-color) diff --git a/frontend/src/global_styles/content/_context_menu.sass b/frontend/src/global_styles/content/_context_menu.sass index 0596673eca90..4d81ee42fc6a 100644 --- a/frontend/src/global_styles/content/_context_menu.sass +++ b/frontend/src/global_styles/content/_context_menu.sass @@ -53,7 +53,7 @@ margin: -28px 0 0 190px a - color: var(--context-menu-unselected-font-color) + color: var(--body-font-color) font-weight: normal &:hover text-decoration: none diff --git a/frontend/src/global_styles/layout/_drop_down.sass b/frontend/src/global_styles/layout/_drop_down.sass index 66afa11c03d8..19e1a07637c3 100644 --- a/frontend/src/global_styles/layout/_drop_down.sass +++ b/frontend/src/global_styles/layout/_drop_down.sass @@ -47,11 +47,9 @@ .dropdown .dropdown-panel, .drop-down .menu-drop-down-container list-style: none - background: #FFF - border: solid 1px #DDD - border: solid 1px rgba(0, 0, 0, .2) + background: var(--overlay-bgColor) border-radius: 0 - box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.15) + box-shadow: var(--shadow-floating-medium) overflow: visible padding: 3px 0 margin: 0 @@ -77,7 +75,7 @@ margin: 0 background: 0 border: 1px solid transparent - color: var(--context-menu-unselected-font-color) + color: var(--body-font-color) text-decoration: none padding: 4px 13px 4px 10px white-space: nowrap @@ -86,7 +84,7 @@ text-align: left &:not(.inactive):hover - background-color: #F0F0F0 + background-color: var(--control-transparent-bgColor-hover) cursor: pointer border-color: var(--list-item-hover--border-color) color: var(--list-item-hover--color) @@ -139,7 +137,7 @@ .dropdown LI > A.dropdown-menu-hasicons display: block - color: var(--context-menu-unselected-font-color) + color: var(--body-font-color) text-decoration: none padding: 3px 10px white-space: nowrap diff --git a/frontend/src/global_styles/openproject/_variable_defaults.scss b/frontend/src/global_styles/openproject/_variable_defaults.scss index 1e13473124c8..d3a6067bc869 100644 --- a/frontend/src/global_styles/openproject/_variable_defaults.scss +++ b/frontend/src/global_styles/openproject/_variable_defaults.scss @@ -111,7 +111,6 @@ --content-form-danger-zone-font-color: #FFFFFF; --drop-down-selected-bg-color: #E7E7E7; --drop-down-hover-bg-color: #EFEFEF; - --context-menu-unselected-font-color: var(--body-font-color); --wiki-default-font-size: var(--body-font-size); --user-avatar-border-radius: 50%; --inplace-edit--border-color: #ddd; From 256f122fac8ccfa726fbef4d055bb1db704ca292 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Tue, 4 Jun 2024 12:23:14 +0200 Subject: [PATCH 014/325] set correct style for widget boxes --- app/views/custom_styles/_primer_color_mapping.erb | 1 + frontend/src/global_styles/openproject/_mixins.sass | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/custom_styles/_primer_color_mapping.erb b/app/views/custom_styles/_primer_color_mapping.erb index 5a12d02962e2..a94183fbc564 100644 --- a/app/views/custom_styles/_primer_color_mapping.erb +++ b/app/views/custom_styles/_primer_color_mapping.erb @@ -40,6 +40,7 @@ --button--background-color: var(--button-default-bgColor-rest); --primary-button-color: var(--button-primary-bgColor-rest); --status-selector-border-color: var(--button-default-borderColor-rest); + --grid-background-color: var(--bgColor-inset) --link-text-decoration: underline; /* Todo: Only when color is not bright enough */ --accent-color: var(--accent-color--minor3); diff --git a/frontend/src/global_styles/openproject/_mixins.sass b/frontend/src/global_styles/openproject/_mixins.sass index f3ebb5063696..48bbca29ad11 100644 --- a/frontend/src/global_styles/openproject/_mixins.sass +++ b/frontend/src/global_styles/openproject/_mixins.sass @@ -81,7 +81,7 @@ text-decoration: none @mixin widget-box--style - background: var(--body-background) + background: var(--overlay-bgColor) margin: 10px border: 1px solid var(--borderColor-default) box-shadow: 0px 1px 5px 0px rgba(0,0,0,0.1) From 0ab2670a02c0daaac1f57814e15dc0d5bc79e5b9 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Tue, 4 Jun 2024 13:33:13 +0200 Subject: [PATCH 015/325] fix color value for widget title --- .../editable-toolbar-title/editable-toolbar-title.sass | 4 ++-- frontend/src/global_styles/content/_widget_box.sass | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/shared/components/editable-toolbar-title/editable-toolbar-title.sass b/frontend/src/app/shared/components/editable-toolbar-title/editable-toolbar-title.sass index a946c2a7f7eb..32a09e24c342 100644 --- a/frontend/src/app/shared/components/editable-toolbar-title/editable-toolbar-title.sass +++ b/frontend/src/app/shared/components/editable-toolbar-title/editable-toolbar-title.sass @@ -22,13 +22,13 @@ grid-area: 1/1 span:before - color: #5F5F5F + color: var(--fgColor-default) &:hover span:before color: darken(#5F5F5F, 20%) .editable-toolbar-title--input - color: #5F5F5F + color: var(--fgColor-default) &:focus border-color: var(--fgColor-accent) diff --git a/frontend/src/global_styles/content/_widget_box.sass b/frontend/src/global_styles/content/_widget_box.sass index b2f80750e110..7a9cd9c2a1d6 100644 --- a/frontend/src/global_styles/content/_widget_box.sass +++ b/frontend/src/global_styles/content/_widget_box.sass @@ -125,7 +125,7 @@ $widget-box--enumeration-width: 20px // Ensure style for read-only widget headers .editable-toolbar-title--fixed, .toolbar--editable-toolbar - color: #5F5F5F + color: var(--fgColor-default) font-size: var(--body-font-size) letter-spacing: 1px text-transform: uppercase From dc29baf9f0a4dc8daf1654ba5650a75f91649897 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Tue, 4 Jun 2024 13:53:03 +0200 Subject: [PATCH 016/325] change background of modal --- frontend/src/app/spot/styles/sass/components/modal.sass | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/src/app/spot/styles/sass/components/modal.sass b/frontend/src/app/spot/styles/sass/components/modal.sass index 56f225d9fdde..36d071310832 100644 --- a/frontend/src/app/spot/styles/sass/components/modal.sass +++ b/frontend/src/app/spot/styles/sass/components/modal.sass @@ -7,7 +7,8 @@ flex-direction: column overflow: hidden align-items: stretch - background: white + background: var(--overlay-bgColor) + box-shadow: var(--shadow-floating-small) pointer-events: all border-radius: $spot-spacing-0-75 From 023a7644b750e54199804c8e515d2acebd909677 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Tue, 4 Jun 2024 17:44:42 +0200 Subject: [PATCH 017/325] remove background color for file selection --- .../content/work_packages/shared/_file_section.sass | 1 - .../global_styles/content/work_packages/tabs/_tab_content.sass | 1 - 2 files changed, 2 deletions(-) diff --git a/frontend/src/global_styles/content/work_packages/shared/_file_section.sass b/frontend/src/global_styles/content/work_packages/shared/_file_section.sass index 61e9b85264ae..0676ab4a581a 100644 --- a/frontend/src/global_styles/content/work_packages/shared/_file_section.sass +++ b/frontend/src/global_styles/content/work_packages/shared/_file_section.sass @@ -51,7 +51,6 @@ padding: 20px cursor: pointer color: var(--fgColor-muted) - background: rgba($spot-color-basic-white, 0.9) &::after display: block diff --git a/frontend/src/global_styles/content/work_packages/tabs/_tab_content.sass b/frontend/src/global_styles/content/work_packages/tabs/_tab_content.sass index 483cd8af9bdd..80d4b431e720 100644 --- a/frontend/src/global_styles/content/work_packages/tabs/_tab_content.sass +++ b/frontend/src/global_styles/content/work_packages/tabs/_tab_content.sass @@ -47,7 +47,6 @@ align-items: center position: sticky top: 0 - background: $spot-color-basic-white z-index: 1 &-text From 4c44ef4056d6648e68b29544971bac354f5bf5b8 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Wed, 5 Jun 2024 09:37:03 +0200 Subject: [PATCH 018/325] change the background color of dropdown --- frontend/src/global_styles/common/header/app-menu.sass | 7 ++----- frontend/src/global_styles/content/_accounts.sass | 2 +- .../src/global_styles/openproject/_variable_defaults.scss | 2 -- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/frontend/src/global_styles/common/header/app-menu.sass b/frontend/src/global_styles/common/header/app-menu.sass index 8d6f301aaadc..1513bbef4655 100644 --- a/frontend/src/global_styles/common/header/app-menu.sass +++ b/frontend/src/global_styles/common/header/app-menu.sass @@ -58,19 +58,16 @@ top: 100% left: auto right: 0 - - background: #fff border-radius: 0 - box-shadow: 1px 1px 4px rgba(0,0,0,.15) + box-shadow: var(--shadow-floating-small) overflow: visible padding: 3px 0 margin: 0 min-width: 270px padding: 6px 0 - border: 1px solid var(--header-drop-down-border-color) border-top: 0 - background-color: var(--header-drop-down-bg-color) + background-color: var(--overlay-bgColor) max-height: calc(100vh - var(--header-height)) overflow-y: auto overflow-x: hidden diff --git a/frontend/src/global_styles/content/_accounts.sass b/frontend/src/global_styles/content/_accounts.sass index 1c976e75e3f8..8ab5cfac6fdc 100644 --- a/frontend/src/global_styles/content/_accounts.sass +++ b/frontend/src/global_styles/content/_accounts.sass @@ -101,7 +101,7 @@ #nav-login-content .login-auth-providers h3 span - background: var(--header-drop-down-bg-color) + background: var(--overlay-bgColor) .login-auth-provider-list margin-top: 1em margin-bottom: 10px diff --git a/frontend/src/global_styles/openproject/_variable_defaults.scss b/frontend/src/global_styles/openproject/_variable_defaults.scss index 16f5822db021..8c7f687d26dd 100644 --- a/frontend/src/global_styles/openproject/_variable_defaults.scss +++ b/frontend/src/global_styles/openproject/_variable_defaults.scss @@ -78,8 +78,6 @@ --header-item-font-color: #FFFFFF; --header-item-font-hover-color: #FFFFFF; --header-item-bg-hover-color: #175A8E; - --header-drop-down-bg-color: #FFFFFF; - --header-drop-down-border-color: #DDDDDD; --main-menu-width: 230px; --main-menu-folded-width: 0px; --main-menu-border-color: #EAEAEA; From 4e74d4df51cbca3a3feb301d437ca6b0cbdd6c37 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Wed, 5 Jun 2024 11:48:21 +0200 Subject: [PATCH 019/325] remove value for timeline header in gantt --- .../content/work_packages/timelines/_timelines_header.sass | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/src/global_styles/content/work_packages/timelines/_timelines_header.sass b/frontend/src/global_styles/content/work_packages/timelines/_timelines_header.sass index 04dffa929ca1..b359d6d8f0b4 100644 --- a/frontend/src/global_styles/content/work_packages/timelines/_timelines_header.sass +++ b/frontend/src/global_styles/content/work_packages/timelines/_timelines_header.sass @@ -9,7 +9,6 @@ wp-timeline-header z-index: 2 .wp-timeline--header-element - background: white position: absolute height: 10px width: 10px From 21dd69cd8ebe74817fe58d610fd95a71079096fe Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Wed, 5 Jun 2024 12:44:19 +0200 Subject: [PATCH 020/325] set correct color for full calendar --- app/views/custom_styles/_primer_color_mapping.erb | 2 +- frontend/src/global_styles/content/modules/_team_planner.sass | 1 - frontend/src/global_styles/vendor/_full_calendar.sass | 3 +++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/views/custom_styles/_primer_color_mapping.erb b/app/views/custom_styles/_primer_color_mapping.erb index b611a05f1d08..dbf922600841 100644 --- a/app/views/custom_styles/_primer_color_mapping.erb +++ b/app/views/custom_styles/_primer_color_mapping.erb @@ -41,7 +41,7 @@ --button--background-color: var(--button-default-bgColor-rest); --primary-button-color: var(--button-primary-bgColor-rest); --status-selector-border-color: var(--button-default-borderColor-rest); - --grid-background-color: var(--bgColor-inset) + --grid-background-color: var(--bgColor-inset); --link-text-decoration: underline; /* Todo: Only when color is not bright enough */ --accent-color: var(--accent-color--minor3); diff --git a/frontend/src/global_styles/content/modules/_team_planner.sass b/frontend/src/global_styles/content/modules/_team_planner.sass index cdc5a3ced543..2c3e7ccb1a9a 100644 --- a/frontend/src/global_styles/content/modules/_team_planner.sass +++ b/frontend/src/global_styles/content/modules/_team_planner.sass @@ -30,7 +30,6 @@ $view-select-dropdown-width: 8rem .fc-header-toolbar position: sticky top: 0 - background: white z-index: 5 padding-left: 138px // Necessary for the button to switch between views which is hacked in via absolute positioning. diff --git a/frontend/src/global_styles/vendor/_full_calendar.sass b/frontend/src/global_styles/vendor/_full_calendar.sass index 9e0ee5f8e69a..e4cf65c46536 100644 --- a/frontend/src/global_styles/vendor/_full_calendar.sass +++ b/frontend/src/global_styles/vendor/_full_calendar.sass @@ -16,6 +16,8 @@ border: none cursor: unset + .fc-scrollgrid-section-sticky > * + background: none // Note the greater specificity than the standard background colours table .fc-day-today background: rgb(255 255 120 / 20%) @@ -169,6 +171,7 @@ thead .fc-scroller @include no-visible-scroll-bar + // ------------------------ END: Calendar toolbar ------------------------ // ------- // ------------------------ END: Full calendar overwrite ------------------------ From 83f2b3ea241c6de132641ee0842a4517a4ef4733 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Wed, 5 Jun 2024 13:07:22 +0200 Subject: [PATCH 021/325] fix font color in full calendar --- .../features/calendar/te-calendar/te-calendar.component.sass | 2 +- frontend/src/global_styles/vendor/_full_calendar.sass | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/features/calendar/te-calendar/te-calendar.component.sass b/frontend/src/app/features/calendar/te-calendar/te-calendar.component.sass index 077b44dc5ee2..fe9951aebccb 100644 --- a/frontend/src/app/features/calendar/te-calendar/te-calendar.component.sass +++ b/frontend/src/app/features/calendar/te-calendar/te-calendar.component.sass @@ -79,7 +79,7 @@ op-time-entries-calendar .te-calendar--day-sum border: none background-color: initial - color: #000000 + color: var(--body-font-color) text-align: center font-size: 0.875em font-weight: var(--base-text-weight-bold) diff --git a/frontend/src/global_styles/vendor/_full_calendar.sass b/frontend/src/global_styles/vendor/_full_calendar.sass index e4cf65c46536..0decb4211076 100644 --- a/frontend/src/global_styles/vendor/_full_calendar.sass +++ b/frontend/src/global_styles/vendor/_full_calendar.sass @@ -32,7 +32,7 @@ // want to like like actual links .fc-col-header-cell a, a.fc-daygrid-day-number - color: #000000 + color: var(--body-font-color) cursor: default &:hover From 6d928cbba8ac7c9745bacc0c8962febc2a19aeaf Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Wed, 5 Jun 2024 13:28:55 +0200 Subject: [PATCH 022/325] change background of tooltips --- frontend/src/global_styles/content/_tooltip.sass | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/global_styles/content/_tooltip.sass b/frontend/src/global_styles/content/_tooltip.sass index d195de45807b..463242d69329 100644 --- a/frontend/src/global_styles/content/_tooltip.sass +++ b/frontend/src/global_styles/content/_tooltip.sass @@ -33,7 +33,7 @@ .ui-tooltip.ui-widget-content border: 1px solid #c5c5c5 - background: #ffffff + background: var(--overlay-bgColor) opacity: 1 .tooltip--map From 04348314f92be10d7239b7cfeaf05570fb556569 Mon Sep 17 00:00:00 2001 From: Markus Kahl Date: Wed, 5 Jun 2024 15:13:29 +0100 Subject: [PATCH 023/325] remove obsolete example for nested configuration --- .../configuration/environment/README.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/installation-and-operations/configuration/environment/README.md b/docs/installation-and-operations/configuration/environment/README.md index b4d59d5b5e70..08a81877257f 100644 --- a/docs/installation-and-operations/configuration/environment/README.md +++ b/docs/installation-and-operations/configuration/environment/README.md @@ -32,23 +32,26 @@ Underscores within keys have to be escaped by doubling them. For example, given the following configuration: ```yaml -storage: - tmp_path: tmp +scm: + subversion: + access_token: 'token' ``` You can override it by defining the following environment variable: ```ruby -OPENPROJECT_STORAGE_TMP__PATH=/some/other/path +OPENPROJECT_SCM_SUBVERSION_ACCESS__TOKEN=some-other-token ``` -You can also add new values this way. For instance you could add another field 'type' to the -storage config above like this: +You can also add new values this way. For instance you could add another field 'insecure' to the +subversion configuration above like this: ```ruby -OPENPROJECT_STORAGE_TYPE=nfs +OPENPROJECT_SCM_SUBVERSION_INSECURE=true ``` +Mind, these options are simply examples. Neither are they an exhaustive list, nor will they appear as possible options for the `OPENPROJECT_SCM` option listed in the section on supported environment variables below. This is due to the nature of that option as a hash which will allow passing of arbitrary values which are simply passed through to the scm adapter used. + ## Seed variables Some of the provided variables are only applicable during the seeding of a new installation (i.e., during the first start or run of the `db:seeds` setup task). From 115cf5615dbbeb0e6d70f17f623f71af3ddf49c7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Jun 2024 05:56:04 +0000 Subject: [PATCH 024/325] Bump the angular group in /frontend with 10 updates Bumps the angular group in /frontend with 10 updates: | Package | From | To | | --- | --- | --- | | [@angular/animations](https://github.com/angular/angular/tree/HEAD/packages/animations) | `17.3.10` | `17.3.11` | | [@angular/common](https://github.com/angular/angular/tree/HEAD/packages/common) | `17.3.10` | `17.3.11` | | [@angular/compiler](https://github.com/angular/angular/tree/HEAD/packages/compiler) | `17.3.10` | `17.3.11` | | [@angular/compiler-cli](https://github.com/angular/angular/tree/HEAD/packages/compiler-cli) | `17.3.10` | `17.3.11` | | [@angular/core](https://github.com/angular/angular/tree/HEAD/packages/core) | `17.3.10` | `17.3.11` | | [@angular/elements](https://github.com/angular/angular/tree/HEAD/packages/elements) | `17.3.10` | `17.3.11` | | [@angular/forms](https://github.com/angular/angular/tree/HEAD/packages/forms) | `17.3.10` | `17.3.11` | | [@angular/platform-browser](https://github.com/angular/angular/tree/HEAD/packages/platform-browser) | `17.3.10` | `17.3.11` | | [@angular/platform-browser-dynamic](https://github.com/angular/angular/tree/HEAD/packages/platform-browser-dynamic) | `17.3.10` | `17.3.11` | | [@angular/router](https://github.com/angular/angular/tree/HEAD/packages/router) | `17.3.10` | `17.3.11` | Updates `@angular/animations` from 17.3.10 to 17.3.11 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/17.3.11/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.11/packages/animations) Updates `@angular/common` from 17.3.10 to 17.3.11 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/17.3.11/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.11/packages/common) Updates `@angular/compiler` from 17.3.10 to 17.3.11 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/17.3.11/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.11/packages/compiler) Updates `@angular/compiler-cli` from 17.3.10 to 17.3.11 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/17.3.11/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.11/packages/compiler-cli) Updates `@angular/core` from 17.3.10 to 17.3.11 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/17.3.11/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.11/packages/core) Updates `@angular/elements` from 17.3.10 to 17.3.11 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/17.3.11/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.11/packages/elements) Updates `@angular/forms` from 17.3.10 to 17.3.11 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/17.3.11/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.11/packages/forms) Updates `@angular/platform-browser` from 17.3.10 to 17.3.11 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/17.3.11/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.11/packages/platform-browser) Updates `@angular/platform-browser-dynamic` from 17.3.10 to 17.3.11 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/17.3.11/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.11/packages/platform-browser-dynamic) Updates `@angular/router` from 17.3.10 to 17.3.11 - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/17.3.11/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/17.3.11/packages/router) --- updated-dependencies: - dependency-name: "@angular/animations" 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 ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 156 ++++++++++++++++++------------------- 1 file changed, 78 insertions(+), 78 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index f368c4bca0cb..d29cb193cfd7 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -857,9 +857,9 @@ } }, "node_modules/@angular/animations": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.10.tgz", - "integrity": "sha512-9fR5snTuG4aM2K54TG/6DXcKXMDKZMovZhjQOxO8l68/oqn6fKrHs8DLzckFs0XGRZ+2OyURH8WggFm1Z828rA==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.11.tgz", + "integrity": "sha512-1y1Egag5jbdUSUWVK+KA39N9VFDrzq9ObjbAhrXFlXKa0npBRw5bprEEeLFQMETMP9Mpjbmj2PoASfl4vqj/Iw==", "dependencies": { "tslib": "^2.3.0" }, @@ -867,7 +867,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.3.10" + "@angular/core": "17.3.11" } }, "node_modules/@angular/cdk": { @@ -920,9 +920,9 @@ } }, "node_modules/@angular/common": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.10.tgz", - "integrity": "sha512-6SfD21M3LujymmZsZQIxAsV8Bj5u6He6ImZ+p2rr7FAhFxpVJyKldK8LCmJcFsBD4srpQcxEZ0iDxXvg+0ihAw==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.11.tgz", + "integrity": "sha512-WG+HQjUaQziYLGdbcv2aW+G73uroN5VF9yk4qWYcolW+VB8SV/DOAol8uFVgCF21cIOl5+wfJZvA4r5oG3dYaw==", "dependencies": { "tslib": "^2.3.0" }, @@ -930,14 +930,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.3.10", + "@angular/core": "17.3.11", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.10.tgz", - "integrity": "sha512-6Ce4siHyF0fCZBDm/cz+blJByGDu1/hbPkQVGmk5HGZTmCUeKkgyjoM6bZr7ssAsyGDRwxBh2SGHO4Ce31vuPA==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.11.tgz", + "integrity": "sha512-ingRoREDPkeZGSa13DlztSjZgGArNcmsAWjj+f+vQgQekTjkfQD/N+Bix/LSt5ZdbSjHMtrkDMyRPwbNyk5Keg==", "dependencies": { "tslib": "^2.3.0" }, @@ -945,7 +945,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.3.10" + "@angular/core": "17.3.11" }, "peerDependenciesMeta": { "@angular/core": { @@ -954,9 +954,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.10.tgz", - "integrity": "sha512-85SBphqRj3szac3FbeYgEZ+I6WaAlo5h7JX06BdjOLLiaoIwlFhLeAuG+jVekseV+95grFUxIsCMphWHi2e6hQ==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.11.tgz", + "integrity": "sha512-O44H/BKGw0TYq0aNTOKYZfQiTrfjbmcTl8y4UX6C9Xey8hXvijzZOAsjA0TGvvDJxeLR+sxaRF4i9Ihoatnd8g==", "dependencies": { "@babel/core": "7.23.9", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -976,7 +976,7 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/compiler": "17.3.10", + "@angular/compiler": "17.3.11", "typescript": ">=5.2 <5.5" } }, @@ -1028,9 +1028,9 @@ "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" }, "node_modules/@angular/core": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.10.tgz", - "integrity": "sha512-ocEKu7X0yFCOvgJn1uZy76qjhsjKvULrO1k/BuIX0nwhp61DTGYTvCqKmwCBLM8/gvcKYH5vMKMHoQKtiSGE0A==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.11.tgz", + "integrity": "sha512-2wPZwXFei3kVxK2ylIH6CdGebrC4kvooFx7qoX+250OITAEFMODJGdh/e3x0DpFUjlRvQtIFQ+YpQlfC5JnL4g==", "dependencies": { "tslib": "^2.3.0" }, @@ -1043,9 +1043,9 @@ } }, "node_modules/@angular/elements": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-17.3.10.tgz", - "integrity": "sha512-rARoZx0wBlouAQot2ItD0h0gCKbKfa43S2545wiqcIVxrkxYMhyX54GDbUv8zQzd7YBUguITeGjaIC9hKFLeqQ==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-17.3.11.tgz", + "integrity": "sha512-Ojd4Qc0b4Ptbu5F6xf5bfuNOCNS++1qx27VDe9NXtehaUIopaVhsGv3lVkRjHgsTT9Yefuiw1BubXDLoyMBIjA==", "dependencies": { "tslib": "^2.3.0" }, @@ -1053,14 +1053,14 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/core": "17.3.10", + "@angular/core": "17.3.11", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/forms": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.10.tgz", - "integrity": "sha512-0VZWSXDi2M3DAGJlpdV3lo73Yo/73GPRqmfTOrvIoUIenFg5Dz6oNGzvt/1aRkRn6HKccjix6iMpH91EN65pWA==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.11.tgz", + "integrity": "sha512-719flo/1L64YOAxL3pzszTK+7bczVVOQDXT1khnjb48GVZdBUBwW2D+cFbqSW1VMuWWr2Amwy1lL4YM5S7qPJQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -1068,9 +1068,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.3.10", - "@angular/core": "17.3.10", - "@angular/platform-browser": "17.3.10", + "@angular/common": "17.3.11", + "@angular/core": "17.3.11", + "@angular/platform-browser": "17.3.11", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -1084,9 +1084,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.10.tgz", - "integrity": "sha512-LEhBDOKm2A7nRmZqsafVp6OinRDG1OYZBSqjnT1jZ+f0CRRFIXz6aJ0TMPoU6vq9SLRJ7vrGD9P/eBf2hW00NQ==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.11.tgz", + "integrity": "sha512-sWjMy8qKH6AOt5YV4OMoPhExCbGdRIPjNSwUrxCm8a8Zz5DamoX3Sib9yRk1etjBuRj+oJySSxISJim2OYXJQQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -1094,9 +1094,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/animations": "17.3.10", - "@angular/common": "17.3.10", - "@angular/core": "17.3.10" + "@angular/animations": "17.3.11", + "@angular/common": "17.3.11", + "@angular/core": "17.3.11" }, "peerDependenciesMeta": { "@angular/animations": { @@ -1105,9 +1105,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "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==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.11.tgz", + "integrity": "sha512-JPA0enJyJQ5H340WQ2wfXbCCHzjBiAljEDMr/Siw/CzSe0XI8aQYDqKMLUMtRyCdYhNCEYjnBWgXBi9Za9blZg==", "dependencies": { "tslib": "^2.3.0" }, @@ -1115,16 +1115,16 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.3.10", - "@angular/compiler": "17.3.10", - "@angular/core": "17.3.10", - "@angular/platform-browser": "17.3.10" + "@angular/common": "17.3.11", + "@angular/compiler": "17.3.11", + "@angular/core": "17.3.11", + "@angular/platform-browser": "17.3.11" } }, "node_modules/@angular/router": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.10.tgz", - "integrity": "sha512-HlZlR9BOLoEKGOSMjmL5EfYL7F7PeDifbFi0dYWNcrG8zFrVKFklB1cuBdJhfPZgYhDEoGms/EToD71tg5wliA==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.11.tgz", + "integrity": "sha512-A3aU6uHAeJfsfCw1dgNXHn2Kjw/UieRMnFwENkzz96YFCvFPCEZjy/mODuE3zHludMuqVsJhM/uUxWu8ATRTcA==", "dependencies": { "tslib": "^2.3.0" }, @@ -1132,9 +1132,9 @@ "node": "^18.13.0 || >=20.9.0" }, "peerDependencies": { - "@angular/common": "17.3.10", - "@angular/core": "17.3.10", - "@angular/platform-browser": "17.3.10", + "@angular/common": "17.3.11", + "@angular/core": "17.3.11", + "@angular/platform-browser": "17.3.11", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -23201,9 +23201,9 @@ } }, "@angular/animations": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.10.tgz", - "integrity": "sha512-9fR5snTuG4aM2K54TG/6DXcKXMDKZMovZhjQOxO8l68/oqn6fKrHs8DLzckFs0XGRZ+2OyURH8WggFm1Z828rA==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-17.3.11.tgz", + "integrity": "sha512-1y1Egag5jbdUSUWVK+KA39N9VFDrzq9ObjbAhrXFlXKa0npBRw5bprEEeLFQMETMP9Mpjbmj2PoASfl4vqj/Iw==", "requires": { "tslib": "^2.3.0" } @@ -23243,25 +23243,25 @@ } }, "@angular/common": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.10.tgz", - "integrity": "sha512-6SfD21M3LujymmZsZQIxAsV8Bj5u6He6ImZ+p2rr7FAhFxpVJyKldK8LCmJcFsBD4srpQcxEZ0iDxXvg+0ihAw==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-17.3.11.tgz", + "integrity": "sha512-WG+HQjUaQziYLGdbcv2aW+G73uroN5VF9yk4qWYcolW+VB8SV/DOAol8uFVgCF21cIOl5+wfJZvA4r5oG3dYaw==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.10.tgz", - "integrity": "sha512-6Ce4siHyF0fCZBDm/cz+blJByGDu1/hbPkQVGmk5HGZTmCUeKkgyjoM6bZr7ssAsyGDRwxBh2SGHO4Ce31vuPA==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-17.3.11.tgz", + "integrity": "sha512-ingRoREDPkeZGSa13DlztSjZgGArNcmsAWjj+f+vQgQekTjkfQD/N+Bix/LSt5ZdbSjHMtrkDMyRPwbNyk5Keg==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler-cli": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.10.tgz", - "integrity": "sha512-85SBphqRj3szac3FbeYgEZ+I6WaAlo5h7JX06BdjOLLiaoIwlFhLeAuG+jVekseV+95grFUxIsCMphWHi2e6hQ==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-17.3.11.tgz", + "integrity": "sha512-O44H/BKGw0TYq0aNTOKYZfQiTrfjbmcTl8y4UX6C9Xey8hXvijzZOAsjA0TGvvDJxeLR+sxaRF4i9Ihoatnd8g==", "requires": { "@babel/core": "7.23.9", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -23315,25 +23315,25 @@ } }, "@angular/core": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.10.tgz", - "integrity": "sha512-ocEKu7X0yFCOvgJn1uZy76qjhsjKvULrO1k/BuIX0nwhp61DTGYTvCqKmwCBLM8/gvcKYH5vMKMHoQKtiSGE0A==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-17.3.11.tgz", + "integrity": "sha512-2wPZwXFei3kVxK2ylIH6CdGebrC4kvooFx7qoX+250OITAEFMODJGdh/e3x0DpFUjlRvQtIFQ+YpQlfC5JnL4g==", "requires": { "tslib": "^2.3.0" } }, "@angular/elements": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-17.3.10.tgz", - "integrity": "sha512-rARoZx0wBlouAQot2ItD0h0gCKbKfa43S2545wiqcIVxrkxYMhyX54GDbUv8zQzd7YBUguITeGjaIC9hKFLeqQ==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/elements/-/elements-17.3.11.tgz", + "integrity": "sha512-Ojd4Qc0b4Ptbu5F6xf5bfuNOCNS++1qx27VDe9NXtehaUIopaVhsGv3lVkRjHgsTT9Yefuiw1BubXDLoyMBIjA==", "requires": { "tslib": "^2.3.0" } }, "@angular/forms": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.10.tgz", - "integrity": "sha512-0VZWSXDi2M3DAGJlpdV3lo73Yo/73GPRqmfTOrvIoUIenFg5Dz6oNGzvt/1aRkRn6HKccjix6iMpH91EN65pWA==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-17.3.11.tgz", + "integrity": "sha512-719flo/1L64YOAxL3pzszTK+7bczVVOQDXT1khnjb48GVZdBUBwW2D+cFbqSW1VMuWWr2Amwy1lL4YM5S7qPJQ==", "requires": { "tslib": "^2.3.0" } @@ -23345,25 +23345,25 @@ "dev": true }, "@angular/platform-browser": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.10.tgz", - "integrity": "sha512-LEhBDOKm2A7nRmZqsafVp6OinRDG1OYZBSqjnT1jZ+f0CRRFIXz6aJ0TMPoU6vq9SLRJ7vrGD9P/eBf2hW00NQ==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-17.3.11.tgz", + "integrity": "sha512-sWjMy8qKH6AOt5YV4OMoPhExCbGdRIPjNSwUrxCm8a8Zz5DamoX3Sib9yRk1etjBuRj+oJySSxISJim2OYXJQQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser-dynamic": { - "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==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-17.3.11.tgz", + "integrity": "sha512-JPA0enJyJQ5H340WQ2wfXbCCHzjBiAljEDMr/Siw/CzSe0XI8aQYDqKMLUMtRyCdYhNCEYjnBWgXBi9Za9blZg==", "requires": { "tslib": "^2.3.0" } }, "@angular/router": { - "version": "17.3.10", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.10.tgz", - "integrity": "sha512-HlZlR9BOLoEKGOSMjmL5EfYL7F7PeDifbFi0dYWNcrG8zFrVKFklB1cuBdJhfPZgYhDEoGms/EToD71tg5wliA==", + "version": "17.3.11", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-17.3.11.tgz", + "integrity": "sha512-A3aU6uHAeJfsfCw1dgNXHn2Kjw/UieRMnFwENkzz96YFCvFPCEZjy/mODuE3zHludMuqVsJhM/uUxWu8ATRTcA==", "requires": { "tslib": "^2.3.0" } From 225c1cb91f1b7caa3266836b686a3b2e20d99100 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Jun 2024 06:00:00 +0000 Subject: [PATCH 025/325] Bump aws-sdk-s3 from 1.151.0 to 1.152.0 Bumps [aws-sdk-s3](https://github.com/aws/aws-sdk-ruby) from 1.151.0 to 1.152.0. - [Release notes](https://github.com/aws/aws-sdk-ruby/releases) - [Changelog](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-s3/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-ruby/commits) --- updated-dependencies: - dependency-name: aws-sdk-s3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 3263c39e6a86..f9e7a05e527d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -341,17 +341,17 @@ GEM activerecord (>= 4.0.0, < 7.2) awrence (1.2.1) aws-eventstream (1.3.0) - aws-partitions (1.934.0) - aws-sdk-core (3.196.1) + aws-partitions (1.940.0) + aws-sdk-core (3.197.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) aws-sigv4 (~> 1.8) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.82.0) - aws-sdk-core (~> 3, >= 3.193.0) + aws-sdk-kms (1.83.0) + aws-sdk-core (~> 3, >= 3.197.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.151.0) - aws-sdk-core (~> 3, >= 3.194.0) + aws-sdk-s3 (1.152.0) + aws-sdk-core (~> 3, >= 3.197.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.8) aws-sdk-sns (1.75.0) From 4d46233d17ad2493e06ee76cf4f6f6aadc6dc17e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 Jun 2024 06:00:55 +0000 Subject: [PATCH 026/325] Bump aws-sdk-core from 3.196.1 to 3.197.0 Bumps [aws-sdk-core](https://github.com/aws/aws-sdk-ruby) from 3.196.1 to 3.197.0. - [Release notes](https://github.com/aws/aws-sdk-ruby/releases) - [Changelog](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-core/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-ruby/commits) --- updated-dependencies: - dependency-name: aws-sdk-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 3263c39e6a86..b53b1b67a407 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -341,8 +341,8 @@ GEM activerecord (>= 4.0.0, < 7.2) awrence (1.2.1) aws-eventstream (1.3.0) - aws-partitions (1.934.0) - aws-sdk-core (3.196.1) + aws-partitions (1.940.0) + aws-sdk-core (3.197.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) aws-sigv4 (~> 1.8) From 3cbf9da62350bceea46da84f65ca58a33b8ffab1 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Thu, 6 Jun 2024 08:28:37 +0200 Subject: [PATCH 027/325] fix hover color for global search box --- .../core/global_search/input/global-search-input.component.sass | 2 ++ 1 file changed, 2 insertions(+) diff --git a/frontend/src/app/core/global_search/input/global-search-input.component.sass b/frontend/src/app/core/global_search/input/global-search-input.component.sass index 56278c3d9c99..951fba9189dd 100644 --- a/frontend/src/app/core/global_search/input/global-search-input.component.sass +++ b/frontend/src/app/core/global_search/input/global-search-input.component.sass @@ -122,6 +122,8 @@ $search-input-height: 30px border-bottom: none &.ng-option-disabled display: none + &.ng-option-marked + background-color: var(--control-transparent-bgColor-hover) !important &.-markable .ng-option From abdfa2cd2de956066e0afa792a15caf125b3eb85 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Thu, 6 Jun 2024 08:32:31 +0200 Subject: [PATCH 028/325] fix background color for draggable item in configure view modal --- .../draggable-autocomplete.component.sass | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/shared/components/autocompleter/draggable-autocomplete/draggable-autocomplete.component.sass b/frontend/src/app/shared/components/autocompleter/draggable-autocomplete/draggable-autocomplete.component.sass index f3034f754dce..21cae340be12 100644 --- a/frontend/src/app/shared/components/autocompleter/draggable-autocomplete/draggable-autocomplete.component.sass +++ b/frontend/src/app/shared/components/autocompleter/draggable-autocomplete/draggable-autocomplete.component.sass @@ -10,7 +10,7 @@ margin-bottom: 5px min-width: 50px border: 1px solid var(--borderColor-default) - background: #F8F8F8 + background: var(--button-default-bgColor-rest) cursor: move display: flex align-items: center From 8365a1ce1afabd4d3dddc1e622978832653b6a82 Mon Sep 17 00:00:00 2001 From: Christophe Bliard Date: Thu, 6 Jun 2024 08:50:48 +0200 Subject: [PATCH 029/325] Bump version to 14.3 --- lib/open_project/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/open_project/version.rb b/lib/open_project/version.rb index 898a286f6fef..be29dfceec45 100644 --- a/lib/open_project/version.rb +++ b/lib/open_project/version.rb @@ -32,7 +32,7 @@ module OpenProject module VERSION # :nodoc: MAJOR = 14 - MINOR = 2 + MINOR = 3 PATCH = 0 class << self From d30c3da1f1a792c761f792c299fa96d252de07bc Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Thu, 6 Jun 2024 10:55:25 +0200 Subject: [PATCH 030/325] fix background color for expanded input of global search box --- .../global_search/input/global-search-input.component.sass | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/src/app/core/global_search/input/global-search-input.component.sass b/frontend/src/app/core/global_search/input/global-search-input.component.sass index 951fba9189dd..5ada287f4571 100644 --- a/frontend/src/app/core/global_search/input/global-search-input.component.sass +++ b/frontend/src/app/core/global_search/input/global-search-input.component.sass @@ -76,7 +76,6 @@ $search-input-height: 30px top: 0 !important input - color: var(--header-item-font-color) height: $search-input-height cursor: text @@ -89,7 +88,7 @@ $search-input-height: 30px &.-expanded width: $search-input-width-expanded - background: white + background: var(--overlay-bgColor) border-radius: 4px .ng-dropdown-header From 003dfdca82537da5f5d4fd51fe36f45ad7d4cbd4 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Thu, 6 Jun 2024 13:44:38 +0200 Subject: [PATCH 031/325] fix background and border colors for toasts --- .../input/global-search-input.component.sass | 2 +- .../src/global_styles/content/_toast.sass | 29 ++++++++++--------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/frontend/src/app/core/global_search/input/global-search-input.component.sass b/frontend/src/app/core/global_search/input/global-search-input.component.sass index 5ada287f4571..05e0d2ac649d 100644 --- a/frontend/src/app/core/global_search/input/global-search-input.component.sass +++ b/frontend/src/app/core/global_search/input/global-search-input.component.sass @@ -93,7 +93,7 @@ $search-input-height: 30px .ng-dropdown-header border-bottom: none - color: $spot-color-basic-gray-2 + color: var(--fgColor-muted) line-height: 1rem margin-top: 0.5rem padding: 0.5rem 0.75rem diff --git a/frontend/src/global_styles/content/_toast.sass b/frontend/src/global_styles/content/_toast.sass index faa787bfc7ee..cea9e316ad26 100644 --- a/frontend/src/global_styles/content/_toast.sass +++ b/frontend/src/global_styles/content/_toast.sass @@ -36,23 +36,24 @@ $nm-border-radius: rem-calc(2px) $nm-box-padding: rem-calc(10px 35px 10px 35px) $nm-toaster-width: rem-calc(550) -$nm-color-error-background: #fedada -$nm-color-success-border: #35c53f -$nm-color-success-icon: #35c53f -$nm-color-success-background: #d8fdd1 +$nm-color-success-border: var(--borderColor-success-muted) +$nm-color-success-icon: var(--fgColor-success) +$nm-color-success-background: var(--bgColor-success-muted) -$nm-color-warning-border: #ef9e56 -$nm-color-warning-icon: #ef9e56 -$nm-color-warning-background: #ffe6c6 +$nm-color-warning-border: var(--borderColor-attention-muted) +$nm-color-warning-icon: var(--fgColor-attention) +$nm-color-warning-background: var(--bgColor-attention-muted) -$nm-color-info-icon: #155282 -$nm-color-error-icon: var(--content-form-danger-zone-bg-color) +$nm-color-error-icon: var(--fgColor-danger) +$nm-color-error-background: var(--bgColor-danger-muted) +$nm-color-error-border: var(--borderColor-danger-muted) -$nm-color-border: #8fc0db -$nm-color-background: #e3f5ff -$nm-padding-box: rem-calc(10px) +$nm-color-info-icon: var(--fgColor-accent) +$nm-color-border: var(--borderColor-accent-muted) +$nm-color-background: var(--bgColor-accent-muted) +$nm-padding-box: rem-calc(10px) $nm-pb-border-color: $nm-color-border $nm-pb-regress-color: whiteSmoke $nm-pb-regress-fill-color: #00558b @@ -79,7 +80,7 @@ $nm-upload-box-padding: rem-calc(15) rem-calc(25) %error-placeholder background-color: $nm-color-error-background - border-color: var(--content-form-danger-zone-bg-color) + border-color: $nm-color-error-border %success-placeholder background-color: $nm-color-success-background @@ -117,7 +118,7 @@ $nm-upload-box-padding: rem-calc(15) rem-calc(25) .op-toast--close position: absolute - color: $spot-color-basic-gray-1 + color: var(--button-invisible-iconColor-rest) top: $spot-spacing-0_75 right: $spot-spacing-0_5 From d928f0f44b5157ba71227febb6751388651faa72 Mon Sep 17 00:00:00 2001 From: Pavel Balashou Date: Tue, 4 Jun 2024 18:56:35 +0200 Subject: [PATCH 032/325] [#55472] Do not save access token in cookies https://community.openproject.org/work_packages/55472 Reason: This logic is an orphan of old removed behavior. So, it should be safe to just remove it. --- .../lib/open_project/openid_connect/hooks/hook.rb | 15 +-------------- .../spec/requests/openid_connect_spec.rb | 7 ------- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/modules/openid_connect/lib/open_project/openid_connect/hooks/hook.rb b/modules/openid_connect/lib/open_project/openid_connect/hooks/hook.rb index 2d3b92c952d9..0b4c31df3b44 100644 --- a/modules/openid_connect/lib/open_project/openid_connect/hooks/hook.rb +++ b/modules/openid_connect/lib/open_project/openid_connect/hooks/hook.rb @@ -43,20 +43,7 @@ def user_logged_in(context) ## # Once omniauth has returned with an auth hash # persist the access token - def omniauth_user_authorized(context) - auth_hash = context[:auth_hash] - controller = context[:controller] - - # fetch the access token if it's present - access_token = auth_hash.fetch(:credentials, {})[:token] - # put it into a cookie - if controller && access_token - controller.send(:cookies)[:_open_project_session_access_token] = { - value: access_token, - secure: !!Rails.configuration.force_ssl - } - end - end + def omniauth_user_authorized(_context); end end end end diff --git a/modules/openid_connect/spec/requests/openid_connect_spec.rb b/modules/openid_connect/spec/requests/openid_connect_spec.rb index c09af595b26b..686f588b7297 100644 --- a/modules/openid_connect/spec/requests/openid_connect_spec.rb +++ b/modules/openid_connect/spec/requests/openid_connect_spec.rb @@ -98,13 +98,6 @@ expect(response).to have_http_status :found expect(response.location).to match /\/\?first_time_user=true$/ - # after_login requires the optional third context parameter - # remove this guard once we are on v4.1 - if OpenProject::OmniAuth::Authorization.method(:after_login!).arity.abs > 2 - # check that cookie is stored in the access token - expect(response.cookies["_open_project_session_access_token"]).to eq "foo bar baz" - end - user = User.find_by(mail: user_info[:email]) expect(user).not_to be_nil From 5d04c61d0bdacc1c39659f08462fbc4ee965798a Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Thu, 6 Jun 2024 14:22:37 +0200 Subject: [PATCH 033/325] fix colors for pagination buttons --- frontend/src/global_styles/content/_pagination.sass | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/frontend/src/global_styles/content/_pagination.sass b/frontend/src/global_styles/content/_pagination.sass index c1a8b36e1e23..6b5d08decbbd 100644 --- a/frontend/src/global_styles/content/_pagination.sass +++ b/frontend/src/global_styles/content/_pagination.sass @@ -67,8 +67,9 @@ $pagination--font-size: 0.8125rem min-width: 25px &_current - background: #ffffff - border: 1px solid #ffffff + background: var(--bgColor-emphasis) + border: 1px solid var(--borderColor-emphasis) + color: var(--fgColor-onEmphasis) padding: 3px 3px font-style: italic text-align: center From f8caab74090dce26b6056857226a7e00e3b3fa09 Mon Sep 17 00:00:00 2001 From: Markus Kahl Date: Thu, 6 Jun 2024 13:36:17 +0100 Subject: [PATCH 034/325] fix protocol in deployment status check --- .../app/workers/cron/check_deploy_status_job.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/github_integration/app/workers/cron/check_deploy_status_job.rb b/modules/github_integration/app/workers/cron/check_deploy_status_job.rb index 1372811aa5d0..4a55c2e00938 100644 --- a/modules/github_integration/app/workers/cron/check_deploy_status_job.rb +++ b/modules/github_integration/app/workers/cron/check_deploy_status_job.rb @@ -126,7 +126,7 @@ def openproject_core_sha(host, api_token) end def introspection_request(host, api_token) - OpenProject.httpx.basic_auth("apikey", api_token).get("http://#{host}/api/v3") + OpenProject.httpx.basic_auth("apikey", api_token).get("https://#{host}/api/v3") end ## From f0a36ad684f696bc3e1519c9e2ebc0e05de10724 Mon Sep 17 00:00:00 2001 From: Christophe Bliard Date: Thu, 6 Jun 2024 15:22:51 +0200 Subject: [PATCH 035/325] Do not trigger development seeders if installation is obviously old `DevelopmentData::ProjectsSeeder` creates 4 projects trying to be useful for development, but it's possible that we do not need them and delete them. If that's the case, we do not want `DevelopmentData::ProjectsSeeder` to try to create them again. This commit adds an additional check: if there are no projects older than 1 hour, that means that the instance is recent and the dev projects should be seeded. Otherwise, they should not. It should prevent us from having errors in the future when we delete the projects and the seeder tries to create them again. --- app/seeders/development_data/projects_seeder.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/seeders/development_data/projects_seeder.rb b/app/seeders/development_data/projects_seeder.rb index 8ee201e14fab..51677b913b7e 100644 --- a/app/seeders/development_data/projects_seeder.rb +++ b/app/seeders/development_data/projects_seeder.rb @@ -47,7 +47,13 @@ def seed_data! end def applicable? - Project.where(identifier: project_identifiers).count == 0 + recent_installation? && Project.where(identifier: project_identifiers).count == 0 + end + + # returns true if no projects have been created more than 1 hour ago, + # meaning this is a recent installation + def recent_installation? + Project.where(created_at: ..1.hour.ago).none? end def project_identifiers From 56ac0181b9b4d878f3a1ba086a73b87e54a703bc Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Thu, 6 Jun 2024 15:39:28 +0200 Subject: [PATCH 036/325] fix colors of activity tab and project selection in WP page --- .../components/wp-activity/user/user-activity.component.sass | 2 +- .../src/app/shared/components/forms/highlighted-input.sass | 4 ++-- .../content/work_packages/single_view/_single_view.sass | 4 ++-- .../global_styles/content/work_packages/tabs/_activities.sass | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/features/work-packages/components/wp-activity/user/user-activity.component.sass b/frontend/src/app/features/work-packages/components/wp-activity/user/user-activity.component.sass index 24356f8c7d5b..ce36c8c35abc 100644 --- a/frontend/src/app/features/work-packages/components/wp-activity/user/user-activity.component.sass +++ b/frontend/src/app/features/work-packages/components/wp-activity/user/user-activity.component.sass @@ -16,7 +16,7 @@ &--date display: block font-size: 0.8rem - color: $spot-color-basic-gray-2 + color: var(--fgColor-muted) &--avatar flex-shrink: 0 diff --git a/frontend/src/app/shared/components/forms/highlighted-input.sass b/frontend/src/app/shared/components/forms/highlighted-input.sass index 399d9ec59267..897e3b54bfde 100644 --- a/frontend/src/app/shared/components/forms/highlighted-input.sass +++ b/frontend/src/app/shared/components/forms/highlighted-input.sass @@ -2,8 +2,8 @@ padding: 1rem 1rem 0.5rem 0.75rem display: flex flex-direction: column - border: 1px solid #cbd5e0 - background: #f7fafc + border: 1px solid var(--borderColor-neutral-muted) + background: var(--bgColor-neutral-muted) border-radius: 4px &_active diff --git a/frontend/src/global_styles/content/work_packages/single_view/_single_view.sass b/frontend/src/global_styles/content/work_packages/single_view/_single_view.sass index 23984cc971e3..cc990b18f698 100644 --- a/frontend/src/global_styles/content/work_packages/single_view/_single_view.sass +++ b/frontend/src/global_styles/content/work_packages/single_view/_single_view.sass @@ -113,11 +113,11 @@ i // -------------------- Attribute groups -------------------- // Special styling for project context area .attributes-group.-project-context - background: $spot-color-feedback-info-light + background: var(--bgColor-accent-muted) border-radius: 2px padding: 10px margin: 10px 0 0 0 - border: 1px solid $spot-color-feedback-info-dark + border: 1px solid var(--borderColor-accent-muted) // Avoid top border and spacing for special projects/select attribute group .attributes-group.-special-fields diff --git a/frontend/src/global_styles/content/work_packages/tabs/_activities.sass b/frontend/src/global_styles/content/work_packages/tabs/_activities.sass index 358e1f51ca91..f685f29296b2 100644 --- a/frontend/src/global_styles/content/work_packages/tabs/_activities.sass +++ b/frontend/src/global_styles/content/work_packages/tabs/_activities.sass @@ -113,7 +113,7 @@ h4.comment ul.work-package-details-activities-messages li - color: $spot-color-basic-gray-2 + color: var(--fgColor-muted) margin-bottom: 0.1rem &:last-child From c8a31dea5b3708310c54250793a7e586bc85bd90 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Thu, 6 Jun 2024 17:05:29 +0200 Subject: [PATCH 037/325] change color of secondary button and link --- app/views/custom_styles/_primer_color_mapping.erb | 2 +- frontend/src/global_styles/content/_buttons.sass | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/views/custom_styles/_primer_color_mapping.erb b/app/views/custom_styles/_primer_color_mapping.erb index dbf922600841..90e1f1df15ff 100644 --- a/app/views/custom_styles/_primer_color_mapping.erb +++ b/app/views/custom_styles/_primer_color_mapping.erb @@ -44,7 +44,7 @@ --grid-background-color: var(--bgColor-inset); --link-text-decoration: underline; /* Todo: Only when color is not bright enough */ - --accent-color: var(--accent-color--minor3); + --accent-color: var(--accent-color--minor2); } /* For accessibility themes we are also overriding the header and the sidebar */ diff --git a/frontend/src/global_styles/content/_buttons.sass b/frontend/src/global_styles/content/_buttons.sass index 133c3a6c4e0f..8c085085f108 100644 --- a/frontend/src/global_styles/content/_buttons.sass +++ b/frontend/src/global_styles/content/_buttons.sass @@ -82,9 +82,9 @@ a.button border-color: var(--button--primary-background-hover-color) &.-highlight-inverted - @include button-style(#fff, #f2f2f2, var(--accent-color)) - @include button-style(#fff, #f2f2f2, var(--accent-color)) - border-color: var(--accent-color) + @include button-style(var(--button-default-bgColor-rest), var(--button-default-bgColor-hover), var(--button-default-fgColor-rest)) + @include button-style(var(--button-default-bgColor-rest), var(--button-default-bgColor-hover), var(--button-default-fgColor-rest)) + border-color: var(--button-default-borderColor-rest) &.-active @include button-style(var(--button--active-background-color), var(--button--active-background-color), var(--button--active-font-color)) From 8744bed14b7d0962eceea6232c814d9a0d924332 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Thu, 6 Jun 2024 19:15:26 +0200 Subject: [PATCH 038/325] fix color of text in activity module, header of calendar --- .../global_styles/content/_activity_list.sass | 4 ++-- frontend/src/global_styles/content/_forms.sass | 18 +++++------------- frontend/src/global_styles/content/_links.sass | 2 +- frontend/src/global_styles/content/_table.sass | 6 ++---- frontend/src/global_styles/content/_tiles.sass | 4 ++-- .../src/global_styles/content/_widget_box.sass | 2 +- .../work_packages/tabs/_activities.sass | 2 +- .../content/work_packages/tabs/_relations.sass | 2 +- .../global_styles/openproject/_homescreen.sass | 4 ++-- .../openproject/_variable_defaults.scss | 1 - .../global_styles/vendor/_full_calendar.sass | 3 ++- 11 files changed, 19 insertions(+), 29 deletions(-) diff --git a/frontend/src/global_styles/content/_activity_list.sass b/frontend/src/global_styles/content/_activity_list.sass index 92f71498b8ff..b61ed3e9b622 100644 --- a/frontend/src/global_styles/content/_activity_list.sass +++ b/frontend/src/global_styles/content/_activity_list.sass @@ -16,7 +16,7 @@ &-subtitle @include spot-caption - color: $spot-color-basic-gray-2 + color: var(--fgColor-muted) margin-bottom: $spot-spacing-0_5 &-description @@ -29,7 +29,7 @@ padding: $spot-spacing-0_5 padding-left: $spot-spacing-2 margin: 0 - color: $spot-color-basic-gray-2 + color: var(--fgColor-muted) &-detail &:not(:last-child) diff --git a/frontend/src/global_styles/content/_forms.sass b/frontend/src/global_styles/content/_forms.sass index bb91a6f3da19..2d975b26314e 100644 --- a/frontend/src/global_styles/content/_forms.sass +++ b/frontend/src/global_styles/content/_forms.sass @@ -77,8 +77,8 @@ form &.-bordered padding: 30px 20px - background-color: var(--content-form-bg-color) - border: 1px solid var(--borderColor-default) + background-color: var(--bgColor-neutral-muted) + border: 1px solid var(--borderColor-neutral-muted) &.-compressed padding: 10px 20px 0 20px @@ -226,7 +226,7 @@ hr %form--fieldset-legend-or-section-title - color: #4d4d4d + color: var(--fgColor-muted) font-size: var(--body-font-size) font-weight: var(--base-text-weight-bold) line-height: 1.8 @@ -771,19 +771,11 @@ input[readonly].-clickable .form--matrix-header-row font-weight: var(--base-text-weight-bold) border-bottom: $content-form-input-border - background-color: var(--gray-light) + background-color: var(--bgColor-muted) .form--matrix-header-cell padding: 0 1rem -.form--matrix-row - - &:nth-child(odd) - background-color: var(--gray-light) - - &:nth-child(even) - background-color: white - .form--matrix-checkbox-cell min-width: 1rem max-width: 4rem @@ -878,7 +870,7 @@ input[readonly].-clickable flex: 0 0 auto display: flex font-size: 0.9rem - background: #EEEEEE + background: var(--bgColor-neutral-muted) color: var(--body-font-color) border: $content-form-input-border border-radius: 2px diff --git a/frontend/src/global_styles/content/_links.sass b/frontend/src/global_styles/content/_links.sass index c368674e3af0..b00a234541ae 100644 --- a/frontend/src/global_styles/content/_links.sass +++ b/frontend/src/global_styles/content/_links.sass @@ -58,7 +58,7 @@ a text-decoration: none a.icon, a.icon-context - color: var(--content-icon-link-color) + color: var(--control-iconColor-rest) font-weight: normal &.external color: var(--accent-color) diff --git a/frontend/src/global_styles/content/_table.sass b/frontend/src/global_styles/content/_table.sass index f31ea1eb3248..5b727eafb4f7 100644 --- a/frontend/src/global_styles/content/_table.sass +++ b/frontend/src/global_styles/content/_table.sass @@ -136,8 +136,6 @@ table.generic-table vertical-align: text-bottom tfoot - tr - background: #f6f7f8 td font-weight: var(--base-text-weight-bold) @@ -342,8 +340,8 @@ thead.-sticky th visibility: visible .generic-table--no-results-container - background: var(--gray-light) - border: 1px solid var(--borderColor-default) + background: var(--bgColor-neutral-muted) + border: 1px solid var(--borderColor-neutral-muted) border-radius: 4px padding: 14px 14px 14px 36px display: block diff --git a/frontend/src/global_styles/content/_tiles.sass b/frontend/src/global_styles/content/_tiles.sass index c697161960fe..74215ad03eee 100644 --- a/frontend/src/global_styles/content/_tiles.sass +++ b/frontend/src/global_styles/content/_tiles.sass @@ -39,10 +39,10 @@ grid-template: auto / 1fr auto grid-row-gap: 5px justify-items: left - background: #f7fafc + background: var(--bgColor-muted) min-height: 150px padding: 1rem - border: 1px solid var(--button-default-borderColor-rest) + border: 1px solid var(--borderColor-muted) &:disabled background: #fafafa diff --git a/frontend/src/global_styles/content/_widget_box.sass b/frontend/src/global_styles/content/_widget_box.sass index 7a9cd9c2a1d6..2d03cf908e33 100644 --- a/frontend/src/global_styles/content/_widget_box.sass +++ b/frontend/src/global_styles/content/_widget_box.sass @@ -144,7 +144,7 @@ $widget-box--enumeration-width: 20px @extend .icon-context display: inline-block font-size: 0.6rem - color: var(--content-icon-link-color) + color: var(--control-iconColor-rest) width: $widget-box--enumeration-width .widget-box--arrow-multiline diff --git a/frontend/src/global_styles/content/work_packages/tabs/_activities.sass b/frontend/src/global_styles/content/work_packages/tabs/_activities.sass index f685f29296b2..e2be1c0eeced 100644 --- a/frontend/src/global_styles/content/work_packages/tabs/_activities.sass +++ b/frontend/src/global_styles/content/work_packages/tabs/_activities.sass @@ -107,7 +107,7 @@ h4.comment a:hover text-decoration: none .action-icon - color: var(--content-icon-link-color) + color: var(--control-iconColor-rest) &::before padding: 0 0 0 0.3em diff --git a/frontend/src/global_styles/content/work_packages/tabs/_relations.sass b/frontend/src/global_styles/content/work_packages/tabs/_relations.sass index b2c26cdef83a..bb16f8f9e13e 100644 --- a/frontend/src/global_styles/content/work_packages/tabs/_relations.sass +++ b/frontend/src/global_styles/content/work_packages/tabs/_relations.sass @@ -97,7 +97,7 @@ text-decoration: none .wp-relations--icon - color: var(--content-icon-link-color) + color: var(--control-iconColor-rest) .wp-relations-create-button margin: 0.25rem 0 diff --git a/frontend/src/global_styles/openproject/_homescreen.sass b/frontend/src/global_styles/openproject/_homescreen.sass index 0a4f3965efc1..b49d64af9241 100644 --- a/frontend/src/global_styles/openproject/_homescreen.sass +++ b/frontend/src/global_styles/openproject/_homescreen.sass @@ -55,13 +55,13 @@ flex: 1 display: block text-align: center - color: var(--content-icon-link-color) + color: var(--control-iconColor-rest) i::before display: block margin-bottom: 10px font-size: 3rem - color: var(--content-icon-link-color) + color: var(--control-iconColor-rest) &:hover, &:hover span diff --git a/frontend/src/global_styles/openproject/_variable_defaults.scss b/frontend/src/global_styles/openproject/_variable_defaults.scss index 8c7f687d26dd..79e76145d020 100644 --- a/frontend/src/global_styles/openproject/_variable_defaults.scss +++ b/frontend/src/global_styles/openproject/_variable_defaults.scss @@ -101,7 +101,6 @@ --breadcrumb-height: 40px; --breadcrumb-font-size: 12px; --breadcrumb-font-color: lighten(var(--body-font-color), 20); - --content-icon-link-color: #4b4b4b; --content-icon-color: var(--accent-color); --content-form-bg-color: #F8F8F8; --content-form-input-hover-border: 1px solid #888888; diff --git a/frontend/src/global_styles/vendor/_full_calendar.sass b/frontend/src/global_styles/vendor/_full_calendar.sass index 0decb4211076..3c5873cd0632 100644 --- a/frontend/src/global_styles/vendor/_full_calendar.sass +++ b/frontend/src/global_styles/vendor/_full_calendar.sass @@ -31,7 +31,8 @@ // The days in full calendar are anchor elements which we do not // want to like like actual links .fc-col-header-cell a, - a.fc-daygrid-day-number + a.fc-daygrid-day-number, + th.fc-day a color: var(--body-font-color) cursor: default From 1e5d1f2e58e74f56e791b4f2436f17a17066725d Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Fri, 7 Jun 2024 03:06:20 +0000 Subject: [PATCH 039/325] update locales from crowdin [ci skip] --- config/locales/crowdin/cs.yml | 82 +++++++++---------- config/locales/crowdin/js-cs.yml | 2 +- config/locales/crowdin/js-ms.yml | 56 ++++++------- config/locales/crowdin/js-ru.yml | 6 +- config/locales/crowdin/ms.yml | 12 +-- config/locales/crowdin/ru.yml | 18 ++-- .../config/locales/crowdin/js-ru.yml | 2 +- .../config/locales/crowdin/ms.yml | 20 ++--- .../config/locales/crowdin/pt-BR.yml | 6 +- .../config/locales/crowdin/ru.yml | 20 ++--- modules/meeting/config/locales/crowdin/be.yml | 2 +- modules/meeting/config/locales/crowdin/cs.yml | 14 ++-- modules/meeting/config/locales/crowdin/de.yml | 2 +- modules/meeting/config/locales/crowdin/es.yml | 2 +- modules/meeting/config/locales/crowdin/it.yml | 2 +- modules/meeting/config/locales/crowdin/ms.yml | 8 +- .../meeting/config/locales/crowdin/pt-BR.yml | 2 +- .../meeting/config/locales/crowdin/pt-PT.yml | 2 +- modules/meeting/config/locales/crowdin/uk.yml | 2 +- .../reporting/config/locales/crowdin/ms.yml | 2 +- 20 files changed, 131 insertions(+), 131 deletions(-) diff --git a/config/locales/crowdin/cs.yml b/config/locales/crowdin/cs.yml index 86bc449dc686..8ae5b058fa42 100644 --- a/config/locales/crowdin/cs.yml +++ b/config/locales/crowdin/cs.yml @@ -290,22 +290,22 @@ cs: title: "Atributy projektu" description: "These project attributes will be displayed in your project overview page under their respective sections. You can enable or disable individual attributes. Project attributes and sections are defined in the administration settings by the administrator of the instance. " filter: - label: "Search project attribute" + label: "Hledat atribut projektu" actions: label_enable_single: "Aktivní v tomto projektu, kliknutím vypnete" label_disable_single: "Neaktivní v tomto projektu, klikněte pro povolení" - deactivate_for_project: "Deactivate for this project" + deactivate_for_project: "Deaktivovat pro tento projekt" label_enable_all: "Povolit vše" label_disable_all: "Zakázat vše" is_required_blank_slate: - heading: Required in all projects + heading: Povinné u všech projektů description: This project attribute is activated in all projects since the "Required in all projects" option is checked. It cannot be deactivated for individual projects. new_project_mapping_form: - add_projects: Add projects - include_sub_projects: Include sub-projects + add_projects: Přidat projekty + include_sub_projects: Zahrnout všechny podprojekty project_mapping_filter: - label: Search project - placeholder: Filter by text + label: Hledat projekt + placeholder: types: no_results_title_text: V současné době nejsou k dispozici žádné typy. form: @@ -317,13 +317,13 @@ cs: no_results_title_text: Neexistuje žádné další diskové místo využívané tímto projektem. lists: create: - success: "The modified list has been saved as a new list" - failure: "The modified list cannot be saved: %{errors}" + success: "Upravený seznam byl uložen jako nový seznam." + failure: "Upravený seznam nelze uložit: %{errors}" update: success: "The modified list has been saved" failure: "The modified list cannot be saved: %{errors}" publish: - success: "The list has been made public" + success: "Seznam byl zveřejněn" failure: "The list cannot be made public: %{errors}" unpublish: success: "The list has been made private" @@ -363,7 +363,7 @@ cs: other: "However, %{shared_work_packages_link} have also been shared with this group." remove_work_packages_shared_with_user_too: "A user that has been removed as member can still access shared work packages. Would you like to remove the shares too?" remove_work_packages_shared_with_group_too: "A group that has been removed as member can still access shared work packages. Would you like to remove the shares too?" - will_not_affect_inherited_shares: "(This will not affect work packages shared with their group)." + will_not_affect_inherited_shares: "(To nemá vliv na pracovní balíčky sdílené s jejich skupinou)." can_remove_direct_but_not_shared_roles: "You can remove this user as a direct project member but a group they are in is also a member of this project, so they will continue being a member via the group." also_work_packages_shared_with_user_html: one: "Also, %{shared_work_packages_link} has been shared with this user." @@ -476,9 +476,9 @@ cs: no_results_title_text: Momentálně zde nejsou žádné stavy pracovního balíčku. no_results_content_text: Přidat nový stav headers: - is_default: "Default" - is_closed: "Closed" - is_readonly: "Read-only" + is_default: "Výchozí" + is_closed: "Uzavřeno" + is_readonly: "Pouze pro čtení" excluded_from_totals: "Excluded from totals" themes: light: "Světlý" @@ -792,7 +792,7 @@ cs: before_or_equal_to: "musí být před nebo rovno %{date}." blank: "nemůže být prázdné." blank_nested: "musí mít nastavenou vlastnost '%{property}'." - cannot_delete_mapping: "is required. Cannot be deleted." + cannot_delete_mapping: "je povinné. Nelze odstranit." cant_link_a_work_package_with_a_descendant: "Pracovní balíček nemůže být propojen s jedním z jeho podúkolů." circular_dependency: "Tento vztah by vytvořil kruhovou závislost." confirmation: "neshoduje se s %{attribute}." @@ -953,7 +953,7 @@ cs: nonexistent: "Sloupec '%{column}' neexistuje." format: "%{message}" group_by_hierarchies_exclusive: "je vzájemně exkluzivní se skupinou od '%{group_by}'. Nelze aktivovat obojí." - can_only_be_modified_by_owner: "The query can only be modified by its owner." + can_only_be_modified_by_owner: "Dotaz může být upraven pouze jeho vlastníkem." need_permission_to_modify_public_query: "Veřejný dotaz nelze upravit." filters: custom_fields: @@ -988,14 +988,14 @@ cs: base: working_days_are_missing: "Nejméně jeden den v týdnu musí být definován jako pracovní den." previous_working_day_changes_unprocessed: "Předchozí změny nastavení pracovních dnů ještě nebyly použity." - hours_per_day_are_missing: "The number of hours per day must be defined." - days_per_week_are_missing: "The number of days per week must be defined." - days_per_month_are_missing: "The number of days per month must be defined." - durations_are_not_positive_numbers: "The durations must be positive numbers." - hours_per_day_is_out_of_bounds: "Hours per day can't be more than 24" - days_per_week_is_out_of_bounds: "Days per week can't be more than 7" - days_per_month_is_out_of_bounds: "Days per month can't be more than 31" - days_per_week_and_days_per_month_are_inconsistent: "The number of days per week and the number of days per month must be consistent." + hours_per_day_are_missing: "Musí být stanoven počet hodin denně." + days_per_week_are_missing: "Musí být stanoven počet dnů v týdnu." + days_per_month_are_missing: "Musí být stanoven počet dnů v měsíci." + durations_are_not_positive_numbers: "Doba trvání musí být kladná čísla." + hours_per_day_is_out_of_bounds: "Počet hodin za den nesmí být více než 24." + days_per_week_is_out_of_bounds: "Počet dní v týdnu nesmí být vyšší než 7." + days_per_month_is_out_of_bounds: "Počet dní v měsíci nesmí být vyšší než 31." + days_per_week_and_days_per_month_are_inconsistent: "Počet dnů v týdnu a počet dnů v měsíci musí být konzistentní." time_entry: attributes: hours: @@ -1058,8 +1058,8 @@ cs: only_values_greater_or_equal_zeroes_allowed: "Musí být >= 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: "Nemůže být vyšší než Práce." + must_be_set_when_work_is_set: "Vyžadováno, když je nastavena práce." format: "%{message}" readonly_status: "Pracovní balíček je ve stavu jen pro čtení, takže jeho atributy nelze změnit." type: @@ -1179,8 +1179,8 @@ cs: 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}" + removed_on: "odstraněno %{datetime}" + removed_by_on: "odstranil/a %{user} %{datetime}" parent_without_of: "Podprojekt" parent_no_longer: "Již není podprojekt projektu" time_entry: @@ -1372,10 +1372,10 @@ cs: button_remove_member_and_shares: "Remove member and shares" button_revoke_work_package_shares: "Revoke work package shares" button_revoke_access: "Odebrat přístup" - button_revoke_all: "Revoke all" + button_revoke_all: "Zrušit vše" button_revoke_only: "Revoke only %{shared_role_name}" - button_publish: "Make public" - button_unpublish: "Make private" + button_publish: "Zveřejnit" + button_unpublish: "Nastavit jako soukromé" consent: checkbox_label: Zaznamenal(a) jsem a souhlasím s výše uvedeným. failure_message: Souhlas se nezdařil, nelze pokračovat. @@ -1885,7 +1885,7 @@ cs: label_attribute_expand_text: "The complete text for '%{attribute}'" label_authentication: "Ověření" label_available_global_roles: "Dostupné globální role" - label_available_project_attributes: "Available project attributes" + label_available_project_attributes: "Dostupné atributy projektu" label_available_project_forums: "Dostupná fóra" label_available_project_repositories: "Dostupné repozitáře" label_available_project_versions: "Dostupné verze" @@ -2015,7 +2015,7 @@ cs: label_enterprise_support: "Podpora pro Enterprise edici" label_enterprise_addon: "Doplňky Enterprise Edice" label_environment: "Prostředí" - label_estimates_and_progress: "Estimates and progress" + label_estimates_and_progress: "Odhady a posup" label_equals: "je" label_everywhere: "všude" label_example: "Příklad" @@ -2242,7 +2242,7 @@ cs: label_project_attributes_plural: "Atributy projektu" label_project_custom_field_plural: "Atributy projektu" label_project_settings: "Nastavení projektu" - label_project_attributes_settings: "Project attributes settings" + label_project_attributes_settings: "" label_project_storage_plural: "Úložiště souborů" label_project_storage_project_folder: "Úložiště souborů: Složky projektů" label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space" @@ -2417,7 +2417,7 @@ cs: label_workflow: "Pracovní postup" label_workflow_plural: "Pracovní postupy" label_workflow_summary: "Souhrn" - label_working_days_and_hours: "Working days and hours" + label_working_days_and_hours: "Pracovní dny a hodiny" label_x_closed_work_packages_abbr: one: "1 uzavřeno" other: "%{count} uzavřených" @@ -2524,7 +2524,7 @@ cs: plaintext: storage: "Úložiště" healthy: - summary: "Good news! The status of your storage, %{storage_name}, is currently displaying as \"Healthy\"." + summary: "Dobré zprávy! Stav vašeho úložiště, %{storage_name}, se aktuálně zobrazuje jako \"Zdravý\"." error-solved-on: "Vyřešeno" recommendation: "We will continue monitoring the system to ensure it remains in good health. In case of any discrepancies, we will notify you." details: "For more details or to make any necessary amendments, you can visit your storage configuration" @@ -2539,10 +2539,10 @@ cs: see_storage_settings: "Zobrazit nastavení úložiště" healthy: subject: "Storage \"%{name}\" is now healthy!" - solved_at: "solved at" + solved_at: "vyřešeno v" summary: "The problem with your %{storage_name} storage integration is now solved" unhealthy: - subject: "Storage \"%{name}\" is unhealthy!" + subject: "Úložiště \"%{name}\" je nezdravé!" since: "od" summary: "There is a problem with your %{storage_name} storage integration" troubleshooting: @@ -3020,7 +3020,7 @@ cs: setting_cross_project_work_package_relations: "Povolit vztahy mezi projekty a pracovními balíčky" setting_first_week_of_year: "První týden v roce obsahuje" setting_date_format: "Datum" - setting_days_per_month: "Days per month" + setting_days_per_month: "Dny za měsíc" setting_days_per_month_explanation: >- This will define what is considered a "month" when displaying duration in a more natural way (for example, if a month is 20 days, 60 days would be 3 months. setting_default_language: "Výchozí jazyk" @@ -3041,7 +3041,7 @@ cs: setting_hours_per_day: "Hours per day" setting_hours_per_day_explanation: >- This will define what is considered a "day" when displaying duration in a more natural way (for example, if a day is 8 hours, 32 hours would be 4 days). - setting_days_per_week: "Days per week" + setting_days_per_week: "Dnů týdně" setting_days_per_week_explanation: >- This will define what is considered a "week" when displaying duration in a more natural way (for example, if a week is 5 days, 15 days would be 3 weeks). setting_invitation_expiration_days: "Platnost aktivačního e-mailu vyprší po" @@ -3161,7 +3161,7 @@ cs: label_new_attribute: "Atribut projektu" label_new_section: "Sekce" label_edit_section: "Upravit název" - label_section_actions: "Section actions" + label_section_actions: "Akce v sekci" 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_no_project_custom_fields: "No project attributes defined in this section" diff --git a/config/locales/crowdin/js-cs.yml b/config/locales/crowdin/js-cs.yml index b67c8300404b..313664bf61a5 100644 --- a/config/locales/crowdin/js-cs.yml +++ b/config/locales/crowdin/js-cs.yml @@ -335,7 +335,7 @@ cs: description: > Vyberte počáteční úroveň přiblížení, která by se měla zobrazit, pokud není autozoom dostupný. export: - title: "Gantt chart PDF options" + title: "Možnosti Ganttova diagramu PDF" button_export: "Export" column_widths: narrow: "Úzké" diff --git a/config/locales/crowdin/js-ms.yml b/config/locales/crowdin/js-ms.yml index 7563f36c8cdc..68b2ec817008 100644 --- a/config/locales/crowdin/js-ms.yml +++ b/config/locales/crowdin/js-ms.yml @@ -368,7 +368,7 @@ ms: "14_1": standard: new_features_html: > - Keluaran tersebut mengandungi pelbagai fitur baharu dan penambahbaikan:
  • eksport PDF paparan Gantt, cth. untuk mencetak (tambahan Enterprise)
  • Projek kegemaran
  • Bahagian dalam Mesyuarat
  • Paparkan mesyuarat di Halaman Saya dan halaman gambaran keseluruhan projek
  • Kemungkinan untuk sorokkan lampiran dalam tab Fail
  • Ruang tersuai jenis Pautan (URL)
+ Keluaran tersebut mengandungi pelbagai fitur baharu dan penambahbaikan:
  • eksport PDF paparan Gantt, cth. untuk mencetak (tambahan Enterprise)
  • Projek kegemaran
  • Bahagian dalam Mesyuarat
  • Paparkan mesyuarat di Halaman Saya dan halaman gambaran keseluruhan projek
  • Kemungkinan untuk sembunyikan lampiran dalam tab Fail
  • Ruang tersuai jenis Pautan (URL)
ical_sharing_modal: title: "Langgan kalendar" inital_setup_error_message: "Ralat berlaku ketika sedang mengambil data." @@ -595,7 +595,7 @@ ms: overview: "Pilih board untuk tukar paparan dan uruskan projek anda menggunakan paparan board agile." lists_kanban: "Disini anda boleh mencipta pelbagai senarai (kolum) dalam board anda. Fitur ini membenarkan anda untuk mencipta, sebagai contoh, board Kanban." lists_basic: "Disini anda boleh mencipta pelbagai senarai (kolum) dalam board agile anda." - add: "Klik ikon tambah (+) untuk mencipta kad baru atau menambah kad sedia ada ke senarai pada board." + add: "Klik ikon tambah (+) untuk mencipta kad baharu atau menambah kad sedia ada ke senarai pada board." drag: "Tarik dan lepaskan kad anda dalam senarai yang diberikan untuk menyusun mereka semula, atau untuk memindahkannya ke senarai lain.
Anda boleh klik ikon maklumat (i) di sudut kanan atas atau klik dua kali pada kad untuk membuka butirannya." wp: toggler: "Sekarang mari lihat bahagian pakej kerja, yang memberikan anda paparan kerja anda secara terperinci." @@ -604,7 +604,7 @@ ms: back_button: "Guna anak panah kembali di sudut kiri untuk keluar dan kembali ke senarai pakej kerja." create_button: "Butang + Cipta akan menambah pakej kerja baharu ke projek anda." gantt_menu: "Cipta jadual projek dan garis masa dengan mudah menggunakan modul carta Gantt." - timeline: "Di sini anda boleh edit pelan projek anda, cipta pakej kerja baru, seperti tugasan, pencapaian, fasa, dan banyak lagi, serta tambah kebergantungan. Semua ahli pasukan boleh lihat dan kemas kini pelan terkini pada bila-bila masa." + timeline: "Di sini anda boleh edit pelan projek anda, cipta pakej kerja baharu, seperti tugasan, pencapaian, fasa, dan banyak lagi, serta tambah kebergantungan. Semua ahli pasukan boleh lihat dan kemas kini pelan terkini pada bila-bila masa." team_planner: overview: "Perancang pasukan membolehkan anda memberikan tugasan secara visual kepada ahli pasukan dan dapatkan gambaran keseluruhan tentang siapa yang mengusahakan apa." calendar: "Board perancangan mingguan atau dua mingguan memaparkan semua pakej kerja yang ditugaskan ke ahli pasukan anda." @@ -648,7 +648,7 @@ ms: other: "dan %{count} yang lain" no_results: at_all: "Pemberitahuan baharu akan muncul di sini apabila terdapat aktiviti yang berkaitan dengan anda." - with_current_filter: "Tiada pemberitahuan dalam paparan ini pada masa ini" + with_current_filter: "Tiada pemberitahuan dalam paparan ini buat masa ini" mark_all_read: "Tanda semua sudah dibaca" mark_as_read: "Tanda sudah dibaca" text_update_date: "%{date} oleh" @@ -657,7 +657,7 @@ ms: no_notification: "Nampaknya anda telah selesaikan semuanya." no_notification_with_current_project_filter: "Nampaknya anda sudah selesai dengan projek yang dipilih." no_notification_with_current_filter: "Nampaknya anda sudah selesai untuk penyaringan %{filter}." - no_selection: "Klik pada pemberitahuan untuk paparkan semua butiran aktiviti." + no_selection: "Klik pemberitahuan untuk paparkan semua butiran aktiviti." new_notifications: message: "Terdapat pemberitahuan baharu." link_text: "Klik sini untuk memuatkan mereka." @@ -697,7 +697,7 @@ ms: work_package_commented: "Semua komen baharu" work_package_created: "Pakej kerja baharu" work_package_processed: "Semua perubahan status" - work_package_prioritized: "Semua perubahan keutamaan" + work_package_prioritized: "Semua perubahan utama" work_package_scheduled: "Semua perubahan tarikh" global: immediately: @@ -780,13 +780,13 @@ ms: text_user_wrote: "%{value} menulis:" types: attribute_groups: - error_duplicate_group_name: "Nama %{group} digunakan lebih dari sekali. Nama kumpulan mesti unik." + error_duplicate_group_name: "Nama %{group} digunakan lebih dari sekali. Nama kumpulan mestilah unik." error_no_table_configured: "Sila konfigurasi jadual untuk %{group}." reset_title: "Set semula konfigurasi borang" confirm_reset: > Amaran: Adakah anda pasti anda ingin set semula konfigurasi borang? Ini akan set semula atribut kumpulan asal mereka dan menyahdayakan SEMUA ruang tersuai. upgrade_to_ee: "Naik taraf edisi Enterprise di premis" - upgrade_to_ee_text: "Wah! Jika anda perlukan tambahan ini anda adalah sungguh pro! Bolehkah anda menyokong kami pemaju OpenProject dengan menjadi pelanggan edisi Enterprise?" + upgrade_to_ee_text: "Wah! Jika anda perlukan tambahan ini anda sungguh pro! Bolehkah anda menyokong kami, pembangun OpenProject, dengan menjadi pelanggan edisi Enterprise?" more_information: "Maklumat lanjut" nevermind: "Tidak mengapa" edit: @@ -846,10 +846,10 @@ ms: add_existing: "Tambah sedia ada" add_existing_child: "Tambah anak sedia ada" remove_child: "Padam anak" - add_new_relation: "Cipta perhubungan baru" + add_new_relation: "Cipta perhubungan baharu" add_existing_relation: "Tambah perhubungan sedia ada" update_description: "Tetapkan atau kemas kini penerangan perhubungan ini" - toggle_description: "Tukar penerangan perhubungan" + toggle_description: "Tukar deskripsi perhubungan" update_relation: "Klik untuk ubah jenis perhubungan" add_follower: "Tambah pengikut" show_relations: "Paparkan perhubungan" @@ -951,15 +951,15 @@ ms: column_incompatible: "Kolum ini tidak menunjukkan perubahan dalam mod asas." filters: title: "Saring pakej kerja" - baseline_incompatible: "Penyaring atribut ini tidak diambil kira dalam mod asas." - baseline_warning: "Mod asas sedang aktif tetapi beberapa penyaring aktif tidak termasuk dalam perbandingan." + baseline_incompatible: "Penyaring atribut ini tidak diambil kira dalam mod Asas." + baseline_warning: "Mod garis panduan asas sedang aktif tetapi beberapa penyaring aktif tidak termasuk dalam perbandingan." inline_create: title: "Klik di sini untuk tambah pakej kerja baharu ke senarai ini" create: title: "Pakej kerja baharu" header: "%{type} baharu" header_no_type: "Pakej kerja baharu (Jenis belum ditetapkan)" - header_with_parent: "%{type} baharu (Anak %{parent_type} #%{id})" + header_with_parent: "%{type} baharu (Anak kepada %{parent_type} #%{id})" button: "Cipta" copy: title: "Salin pakej kerja" @@ -988,8 +988,8 @@ ms: createdAt: "Dicipta pada" description: "Deskripsi" date: "Tarikh" - percentComplete: "% Lengkap" - percentCompleteAlternative: "\nPerkembangan" + percentComplete: "% Selesai" + percentCompleteAlternative: "Perkembangan" dueDate: "Tarikh tamat" duration: "Tempoh" spentTime: "Masa yang dihabiskan" @@ -1025,7 +1025,7 @@ ms: pagination: "Pergi ke jadual penomboran" label_pagination: "Klik di sini untuk langkau jadual pakej kerja dan pergi ke penomboran" content: "Lompat ke kandungan" - label_content: "Klik di sini untuk langkau ke menu dan pergi ke kandungan" + label_content: "Klik sini untuk langkau ke menu dan pergi ke kandungan" placeholders: default: "-" date: "Pilih tarikh" @@ -1033,7 +1033,7 @@ ms: column_names: "Kolum-kolum" group_by: "Kumpulkan hasil mengikut" group: "Kumpulkan mengikut" - group_by_disabled_by_hierarchy: "Kumpulkan mengikut dinyahaktifkan kerana mod hierarki sedang aktif." + group_by_disabled_by_hierarchy: "Kumpulkan mengikut telah dinyahaktifkan kerana mod hierarki sedang aktif." hierarchy_disabled_by_group_by: "Mod hierarki dinyahaktifkan kerana hasil dikumpulkan oleh %{column}." sort_ascending: "Susun menaik" sort_descending: "Susun menurun" @@ -1130,7 +1130,7 @@ ms: save_as: "Simpan sebagai" export: "Eksport" visibility_settings: "Tetapan keterlihatan" - share_calendar: "Langgan ke kalendar" + share_calendar: "Langgan kalendar" page_settings: "Namakan semula paparan" delete: "Padam" filter: "Saring" @@ -1160,7 +1160,7 @@ ms: notice_no_results_to_display: "Tiada hasil yang boleh dilihat untuk dipaparkan." notice_successful_create: "Penciptaan yang berjaya." notice_successful_delete: "Pemadaman yang berjaya." - notice_successful_update: "Kemas kini yang berjaya." + notice_successful_update: "Kemas kini berjaya." notice_job_started: "kerja bermula." notice_bad_request: "Ralat Permintaan." relations: @@ -1180,8 +1180,8 @@ ms: errors: required: "%{field} tidak boleh kosong" number: "%{field} bukan nombor yang sah" - maxlength: "%{field} tidak boleh mengandungi lebih dari %{maxLength} digit" - minlength: "%{field} tidak boleh mengandungi kurang dari %{minLength} digit" + maxlength: "%{field} tidak boleh mengandungi lebih daripada %{maxLength} digit" + minlength: "%{field} tidak boleh mengandungi kurang daripada %{minLength} digit" messages_on_field: "Ruang ini tidak sah: %{messages}" error_could_not_resolve_version_name: "Tidak dapat menyelesaikan nama versi" error_could_not_resolve_user_name: "Tidak dapat menyelesaikan nama pengguna" @@ -1280,15 +1280,15 @@ ms: success: title: "%{principal} telah dijemput!" description: - user: "Pengguna kini boleh log masuk ke akses %{project}. Sementara itu, anda boleh merancang dengan pengguna itu dan tugaskan pakej kerja sebagai contoh." + user: "Pengguna kini boleh log masuk untuk mengakses %{project}. Sementara itu, anda boleh merancang dengan pengguna tersebut dan tugaskan pakej kerja sebagai contoh." placeholder: "Placeholder kini boleh digunakan dalam %{project}. Sementara itu anda sudah boleh merancang dengan pengguna tersebut dan tugaskan pakej kerja sebagai contoh." group: "Kumpulan tersebut kini sebahagian daripada %{project}. Sementara itu anda sudah boleh merancang dengan kumpulan tersebut dan menugaskan pakej kerja sebagai contoh." next_button: "Teruskan" exclusion_info: modal: - title: "Status excluded from hierarchy totals" + title: "Status dikeluarkan daripada jumlah hierarki" content: >- - The status '%{status_name}' has been configured to be excluded from hierarchy totals of Work, Remaining work, and % Complete. The totals do not take this value into account. + Status %{status_name} telah dikonfigurasikan untuk dikeluarkan daripada jumlah hierarki Kerja, Kerja yang berbaki, dan % Selesai. Jumlah tersebut tidak mengambil kira nilai ini. favorite_projects: no_results: "Anda tiada projek kegemaran" no_results_subtext: "Tambah satu atau beberapa projek sebagai kegemaran melalui gambaran keseluruhan mereka atau dalam senarai projek." @@ -1308,14 +1308,14 @@ ms: does_not_match_search: "Projek tidak sepadan dengan kriteria carian." no_results: "Tiada projek yang sepadan dengan kriteria carian anda." baseline: - toggle_title: "Dasar" + toggle_title: "Garis panduan asas" clear: "Kosongkan" apply: "Gunakan" header_description: "Sorotkan perubahan yang dibuat ke senarai ini pada bila-bila masa lalu." enterprise_header_description: "Sorotkan perubahan yang dibuat ke senarai ini pada bila-bila masa lalu dengan edisi Enterprise." show_changes_since: "Paparkan perubahan sejak" - baseline_comparison: "Perbandingan asas" - help_description: "Zon masa rujukan untuk yang dasar." + baseline_comparison: "Perbandingan garis panduan asas" + help_description: "Zon masa rujukan untuk garis panduan asas." time_description: "Dalam masa tempatan anda: %{datetime}" time: "Masa" from: "Dari" @@ -1349,7 +1349,7 @@ ms: remove: "Keluarkan" drop_modal: focus_grab: "Ini adalah paksi fokus untuk modul. Tekan shift+tab untuk kembali ke elemen pencetus modul." - close: "Close modal" + close: "Tutup modal" open_project_storage_modal: waiting_title: timeout: "Had Masa" diff --git a/config/locales/crowdin/js-ru.yml b/config/locales/crowdin/js-ru.yml index 225deb25d762..0e6c5b88673f 100644 --- a/config/locales/crowdin/js-ru.yml +++ b/config/locales/crowdin/js-ru.yml @@ -275,9 +275,9 @@ ru: Хотите продолжить? work_packages_settings: warning_progress_calculation_mode_change_from_status_to_field_html: >- - Changing progress calculation mode from status-based to work-based will make % Complete a non-editable field whose value is derived from Work and Remaining work. Existing values for % Complete are preserved. If values for Work and Remaining work were not present, they will be required in order to change % Complete. + При изменении расчета прогресса с режима на основе статуса на режим на основе трудозатрат поле % Завершения станет нередактируемым, его значение будет получено из значений Работа и Оставшаяся работа. Существующие значения для % Завершения сохраняются. Если значения для Работа и Оставшаяся работа отсутствуют, они потребуются для изменения % Завершения. warning_progress_calculation_mode_change_from_field_to_status_html: >- - Changing progress calculation mode from work-based to status-based will result in all existing % Complete values to be lost and replaced with values associated with each status. Existing values for Remaining work may also be recalculated to reflect this change. This action is not reversible. + При изменении расчета прогресса с режима на основе трудозатрат на режим на основе статуса все существующие значения % Завершения будут потеряны и заменены значениями, связанными с каждым статусом. Существующие значения параметра Оставшаяся работа также могут быть пересчитаны с учетом этого изменения. Это действие необратимо. custom_actions: date: specific: "вкл" @@ -416,7 +416,7 @@ ru: label_details: "Детали" label_display: "Отображение" label_cancel_comment: "Отменить комментарий" - label_closed_work_packages: "закрыт" + label_closed_work_packages: "закрыто" label_collapse: "свернуть" label_collapsed: "свернуто" label_collapse_all: "Свернуть все" diff --git a/config/locales/crowdin/ms.yml b/config/locales/crowdin/ms.yml index 6c8dbf133d7e..1cf2444d57f7 100644 --- a/config/locales/crowdin/ms.yml +++ b/config/locales/crowdin/ms.yml @@ -430,7 +430,7 @@ ms: upsale: title: Pengguna placeholder description: > - Placeholder ialah satu cara untuk memperuntukkan pakej kerja kepada pengguna yang bukan sebahagian daripada projek anda. Ianya berguna dalam pelbagai senario; contohnya, jika anda perlu menjejaki tugas untuk sumber yang masih belum dinamakan atau disediakan, atau jika anda tidak ingin memberikan seseorang akses ke OpenProject, tetapi masih hendak menjejaki tugas yang telah diperuntukkan ke mereka. + Pengguna placeholder ialah satu cara untuk memperuntukkan pakej kerja kepada pengguna yang bukan sebahagian daripada projek anda. Ianya berguna dalam pelbagai senario; contohnya, jika anda perlu menjejaki tugas untuk sumber yang masih belum dinamakan atau disediakan, atau jika anda tidak ingin memberikan akses kepada seseorang di OpenProject, tetapi masih hendak menjejaki tugas yang telah diperuntukkan ke mereka. prioritiies: edit: priority_color_text: | @@ -722,7 +722,7 @@ ms: begin_insertion: "Permulaan kemasukan" begin_deletion: "Permulaan pemadaman" children: "Subelemen" - derived_done_ratio: "Jumlah % disiapkan" + derived_done_ratio: "Jumlah % selesai" derived_remaining_hours: "Jumlah kerja berbaki" derived_remaining_time: "Jumlah kerja berbaki" done_ratio: "% Selesai" @@ -1493,7 +1493,7 @@ ms: add_groups: "Tambah kumpulan atribut baharu" rename_groups: "Nama semula kumpulan atribut" project_filters: - description_html: "Menyaring dan menyusun ruang tersuai ialah tambahan edisi Enterprise." + description_html: "Menyaring dan menyusun ruang tersuai adalah tambahan edisi Enterprise." enumeration_activities: "Aktiviti penjejakan masa" enumeration_work_package_priorities: "Keutamaan pakej kerja" enumeration_reported_project_statuses: "Status projek yang dilaporkan" @@ -1679,7 +1679,7 @@ ms: admin: mail_notification: "Pemberitahuan e-mel" mails_and_notifications: "E-mel dan pemberitahuan" - aggregation: "Pengagregatan" + aggregation: "Pengumpulan" api_and_webhooks: "API dan webhooks" quick_add: label: "Buka menu tambah cepat" @@ -3109,7 +3109,7 @@ ms: text_custom_field_hint_activate_per_project_and_type: > Ruang tersuai perlu diaktifkan untuk setiap jenis pakej kerja dan setiap projek. text_wp_status_read_only_html: > - Edisi Enterprise akan menambahkan segala tambahan ke ruang status pakej kerja:
  • Benarkan untuk menandakan pakej kerja untuk baca sahaja pada status tertentu
+ Edisi Enterprise akan menambahkan segala tambahan ke ruang status pakej kerja:
  • Benarkan untuk menandakan pakej kerja untuk baca-sahaja pada status tertentu
text_project_custom_field_html: > Edisi Enterprise akan menambahkan segala jenis tambahan ke ruang tersuai projek:
  • Tambah ruang tersuai ke projek ke senarai Projek anda untuk ciptakan paparan portfolio project
text_custom_logo_instructions: > @@ -3301,7 +3301,7 @@ ms: https_mismatch: title: "Mod penyediaan HTTPS tidak sepadan" text_html: > - Aplikasi anda sedang berjalan dengan mod HTTPS ditetapkan kepada %{set_protocol}, tetapi permintaannya ialah permintaan %{actual_protocol}. Ini akan mengakibatkan ralat! Anda perlu menetapkan nilai konfigurasi seperti yang berikut: %{setting_value}. Sila lihat dokumentasi pemasangan atas cara-cara untuk menetapkan konfigurasi ini. + Aplikasi anda sedang berjalan dengan mod HTTPS ditetapkan kepada %{set_protocol}, tetapi permintaannya adalah permintaan %{actual_protocol}. Ini akan mengakibatkan ralat! Anda perlu menetapkan nilai konfigurasi seperti yang berikut: %{setting_value}. Sila lihat dokumentasi pemasangan atas cara-cara untuk menetapkan konfigurasi ini. hostname_mismatch: title: "Tetapan nama hos tidak sepadan" text_html: > diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index a47c7380a783..de3d25619e21 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -300,11 +300,11 @@ ru: heading: Требуется во всех проектах description: Этот атрибут проекта активирован во всех проектах, поскольку установлен флажок «Требуется во всех проектах». Его нельзя отключить для отдельных проектов. new_project_mapping_form: - add_projects: Add projects - include_sub_projects: Include sub-projects + add_projects: Добавить проекты + include_sub_projects: Включить подпроекты project_mapping_filter: - label: Search project - placeholder: Filter by text + label: Поиск проекта + placeholder: Фильтр по тексту types: no_results_title_text: На данный момент доступных типов нет. form: @@ -1682,11 +1682,11 @@ ru: image: omitted: "Изображение не экспортировано." macro: - error: "Macro error, %{message}" - attribute_not_found: "attribute not found: %{attribute}" - model_not_found: "invalid attribute model: %{model}" - resource_not_found: "resource not found: %{resource}" - rich_text_unsupported: "Rich text embedding currently not supported in export" + error: "Ошибка макроса, %{message}" + attribute_not_found: "атрибут не найден: %{attribute}" + model_not_found: "неверная модель атрибута: %{model}" + resource_not_found: "ресурс не найден: %{resource}" + rich_text_unsupported: "Встраивание форматированного текста в настоящее время не поддерживается при экспорте." units: hours: ч days: д diff --git a/modules/github_integration/config/locales/crowdin/js-ru.yml b/modules/github_integration/config/locales/crowdin/js-ru.yml index 8f82b01901ef..67de504b75da 100644 --- a/modules/github_integration/config/locales/crowdin/js-ru.yml +++ b/modules/github_integration/config/locales/crowdin/js-ru.yml @@ -45,7 +45,7 @@ ru: referenced_message: "Запрос на извлечение #%{pr_number} %{pr_link} для %{repository_link} автором %{github_user_link} ссылается на этот пакет работ." states: opened: 'открыт' - closed: 'закрыт' + closed: 'закрыто' draft: 'составлен' merged: 'объединен' ready_for_review: 'отмечен как готовый к просмотру' diff --git a/modules/github_integration/config/locales/crowdin/ms.yml b/modules/github_integration/config/locales/crowdin/ms.yml index 5194c5899f6a..fadbf9dc1c1d 100644 --- a/modules/github_integration/config/locales/crowdin/ms.yml +++ b/modules/github_integration/config/locales/crowdin/ms.yml @@ -20,20 +20,20 @@ #See COPYRIGHT and LICENSE files for more details. #++ ms: - button_add_deploy_target: Add deploy target - label_deploy_target: Deploy target - label_deploy_target_new: New deploy target - label_deploy_target_plural: Deploy targets - label_github_integration: GitHub Integration - notice_deploy_target_created: Deploy target created - notice_deploy_target_destroyed: Deploy target deleted + button_add_deploy_target: Tambah sasaran penyerahan + label_deploy_target: Sasaran penyerahan + label_deploy_target_new: Sasaran penyerahan baharu + label_deploy_target_plural: Sasaran penyerahan + label_github_integration: Integrasi GitHub + notice_deploy_target_created: Sasaran penyerahan dicipta + notice_deploy_target_destroyed: Sasaran penyerahan dipadam plugin_openproject_github_integration: name: "Integrasi GitHub OpenProject" description: "Mengintegrasikan OpenProject dan GitHub untuk aliran kerja yang lebih baik" project_module_github: "GitHub" permission_show_github_content: "Paparkan kandungan GitHub" - permission_introspection: Read running OpenProject core version and build SHA + permission_introspection: Baca versi teras OpenProject yang aktif dan bangunkan SHA text_deploy_target_type_info: > - So far we only support OpenProject itself. + Setakat ini kami hanya menyokong OpenProject sahaja. text_deploy_target_api_key_info: > - An OpenProject [API key](docs_url) belonging to a user who has the global introspection permission. + [API key](docs_url) OpenProject yang dimiliki oleh pengguna yang mempunyai kebenaran intipan global. diff --git a/modules/github_integration/config/locales/crowdin/pt-BR.yml b/modules/github_integration/config/locales/crowdin/pt-BR.yml index 6537addd962d..784fd3607cd6 100644 --- a/modules/github_integration/config/locales/crowdin/pt-BR.yml +++ b/modules/github_integration/config/locales/crowdin/pt-BR.yml @@ -24,7 +24,7 @@ pt-BR: label_deploy_target: Deploy target label_deploy_target_new: New deploy target label_deploy_target_plural: Deploy targets - label_github_integration: GitHub Integration + label_github_integration: Integração com o GitHub notice_deploy_target_created: Deploy target created notice_deploy_target_destroyed: Deploy target deleted plugin_openproject_github_integration: @@ -34,6 +34,6 @@ pt-BR: permission_show_github_content: "Exibir conteúdo GitHub" permission_introspection: Read running OpenProject core version and build SHA text_deploy_target_type_info: > - So far we only support OpenProject itself. + No momento, oferecemos suporte apenas ao próprio OpenProject text_deploy_target_api_key_info: > - An OpenProject [API key](docs_url) belonging to a user who has the global introspection permission. + Uma [API key](docs_url) do OpenProject pertencente a um usuário que tenha permissões globais de introspecção. diff --git a/modules/github_integration/config/locales/crowdin/ru.yml b/modules/github_integration/config/locales/crowdin/ru.yml index 003a9741bdfd..16c78629da77 100644 --- a/modules/github_integration/config/locales/crowdin/ru.yml +++ b/modules/github_integration/config/locales/crowdin/ru.yml @@ -20,20 +20,20 @@ #See COPYRIGHT and LICENSE files for more details. #++ ru: - button_add_deploy_target: Add deploy target - label_deploy_target: Deploy target - label_deploy_target_new: New deploy target - label_deploy_target_plural: Deploy targets - label_github_integration: GitHub Integration - notice_deploy_target_created: Deploy target created - notice_deploy_target_destroyed: Deploy target deleted + button_add_deploy_target: Добавить цель установки + label_deploy_target: Цель установки + label_deploy_target_new: Новая цель установки + label_deploy_target_plural: Цели установки + label_github_integration: Интеграция с GitHub + notice_deploy_target_created: Цель установки создана + notice_deploy_target_destroyed: Цель установки удалена plugin_openproject_github_integration: name: "Интеграция с OpenProject GitHub" description: "Интегрирует OpenProject и GitHub для лучшего рабочего процесса" project_module_github: "GitHub" permission_show_github_content: "Показать контент GitHub" - permission_introspection: Read running OpenProject core version and build SHA + permission_introspection: Ознакомьтесь с версией ядра OpenProject и сборкой SHA text_deploy_target_type_info: > - So far we only support OpenProject itself. + Пока что мы поддерживаем только сам OpenProject. text_deploy_target_api_key_info: > - An OpenProject [API key](docs_url) belonging to a user who has the global introspection permission. + OpenProject [API key](docs_url), принадлежащий пользователю, имеющему глобальное разрешение на самоанализ. diff --git a/modules/meeting/config/locales/crowdin/be.yml b/modules/meeting/config/locales/crowdin/be.yml index a199dcd61cb7..f5a573058061 100644 --- a/modules/meeting/config/locales/crowdin/be.yml +++ b/modules/meeting/config/locales/crowdin/be.yml @@ -60,7 +60,7 @@ be: meeting_agenda_item: "Agenda item" meeting_agenda: "Agenda" meeting_minutes: "Minutes" - meeting_section: "Section" + meeting_section: "Раздзел" activity: filter: meeting: "Meetings" diff --git a/modules/meeting/config/locales/crowdin/cs.yml b/modules/meeting/config/locales/crowdin/cs.yml index c585e54808cd..865f2a0cb50d 100644 --- a/modules/meeting/config/locales/crowdin/cs.yml +++ b/modules/meeting/config/locales/crowdin/cs.yml @@ -60,7 +60,7 @@ cs: meeting_agenda_item: "Pořad jednání" meeting_agenda: "Agenda" meeting_minutes: "Zápis" - meeting_section: "Section" + meeting_section: "Sekce" activity: filter: meeting: "Schůzky" @@ -119,12 +119,12 @@ cs: copy: title: "Kopírovat schůzku %{title}" attachments: "Kopírovat přílohy" - attachments_text: "Copy over all attached files to the new meeting" + attachments_text: "Zkopírujte všechny přiložené soubory do nové schůzky" agenda: "Kopírovat program" agenda_text: "Zkopírujte program staré schůzky" email: send_emails: "Odeslat e-maily" - send_invitation_emails: "Send out invitation emails upon creation" + send_invitation_emails: "Odeslat e-maily s pozvánkou při vytvoření" open_meeting_link: "Otevřít schůzku" invited: summary: "%{actor} vám poslal pozvánku na schůzku %{title}" @@ -192,17 +192,17 @@ cs: label_agenda_item_move_down: "Přesunout níž" label_agenda_item_add_notes: "Přidat poznámky" label_agenda_item_work_package: "Agenda item work package" - text_agenda_item_title: 'Agenda item "%{title}"' + text_agenda_item_title: 'Bod programu "%{title}"' text_agenda_work_package_deleted: 'Agenda item for deleted work package' text_deleted_agenda_item: 'Deleted agenda item' label_initial_meeting_details: "Schůzka" label_meeting_details: "Podrobnosti o schůzce" label_meeting_details_edit: "Upravit podrobnosti schůzky" - label_meeting_state: "Meeting status" + label_meeting_state: "Stav schůzky" label_meeting_state_open: "Otevřít" - label_meeting_state_open_html: "Open" + label_meeting_state_open_html: "Otevřeno" label_meeting_state_closed: "Uzavřený" - label_meeting_state_closed_html: "Closed" + label_meeting_state_closed_html: "Uzavřeno" label_meeting_reopen_action: "Znovu otevřít schůzku" label_meeting_close_action: "Ukončit schůzku" text_meeting_open_description: "Tato schůzka je otevřená. Můžete přidat/odebrat položky programu a upravit je, jak chcete. Po skončení schůzky ji zavřete a uzamkněte ji." diff --git a/modules/meeting/config/locales/crowdin/de.yml b/modules/meeting/config/locales/crowdin/de.yml index 672ce0be8056..47b58d5629d2 100644 --- a/modules/meeting/config/locales/crowdin/de.yml +++ b/modules/meeting/config/locales/crowdin/de.yml @@ -58,7 +58,7 @@ de: meeting_agenda_item: "Tagesordnungspunkt" meeting_agenda: "Agenda" meeting_minutes: "Protokoll" - meeting_section: "Section" + meeting_section: "Abschnitt" activity: filter: meeting: "Besprechungen" diff --git a/modules/meeting/config/locales/crowdin/es.yml b/modules/meeting/config/locales/crowdin/es.yml index 0534701eb97c..947fb6921cdd 100644 --- a/modules/meeting/config/locales/crowdin/es.yml +++ b/modules/meeting/config/locales/crowdin/es.yml @@ -58,7 +58,7 @@ es: meeting_agenda_item: "Puntos de Agenda" meeting_agenda: "Agenda" meeting_minutes: "Minutas" - meeting_section: "Section" + meeting_section: "Sección" activity: filter: meeting: "Reuniones" diff --git a/modules/meeting/config/locales/crowdin/it.yml b/modules/meeting/config/locales/crowdin/it.yml index 0f65741c2f62..3294609561c4 100644 --- a/modules/meeting/config/locales/crowdin/it.yml +++ b/modules/meeting/config/locales/crowdin/it.yml @@ -58,7 +58,7 @@ it: meeting_agenda_item: "Attività" meeting_agenda: "Ordine del giorno" meeting_minutes: "Verbali" - meeting_section: "Section" + meeting_section: "Sezione" activity: filter: meeting: "Riunioni" diff --git a/modules/meeting/config/locales/crowdin/ms.yml b/modules/meeting/config/locales/crowdin/ms.yml index cd3f4b60a5d4..207e324421f3 100644 --- a/modules/meeting/config/locales/crowdin/ms.yml +++ b/modules/meeting/config/locales/crowdin/ms.yml @@ -67,13 +67,13 @@ ms: added: "ditetapkan kepada %{value}" added_html: "ditetapkan kepada %{value}" removed: "dikeluarkan" - updated: "ditukar dari %{old_value} kepada %{value}" - updated_html: "ditukar dari %{old_value} kepada %{value}" + updated: "ditukar daripada %{old_value} kepada %{value}" + updated_html: "ditukar daripada %{old_value} kepada %{value}" position: updated: "disusun semula" work_package: - updated: "ditukar dari %{old_value} kepada %{value}" - updated_html: "ditukar dari %{old_value} kepada %{value}" + updated: "ditukar daripada %{old_value} kepada %{value}" + updated_html: "ditukar daripada %{old_value} kepada %{value}" description_attended: "dihadiri" description_invite: "dijemput" events: diff --git a/modules/meeting/config/locales/crowdin/pt-BR.yml b/modules/meeting/config/locales/crowdin/pt-BR.yml index 4ee36b373c64..3323826b1a12 100644 --- a/modules/meeting/config/locales/crowdin/pt-BR.yml +++ b/modules/meeting/config/locales/crowdin/pt-BR.yml @@ -58,7 +58,7 @@ pt-BR: meeting_agenda_item: "Item da agenda" meeting_agenda: "Agenda" meeting_minutes: "Atas" - meeting_section: "Section" + meeting_section: "Seção" activity: filter: meeting: "Reuniões" diff --git a/modules/meeting/config/locales/crowdin/pt-PT.yml b/modules/meeting/config/locales/crowdin/pt-PT.yml index c1359db8c076..310c39be9dbc 100644 --- a/modules/meeting/config/locales/crowdin/pt-PT.yml +++ b/modules/meeting/config/locales/crowdin/pt-PT.yml @@ -58,7 +58,7 @@ pt-PT: meeting_agenda_item: "Pontos da ordem de trabalhos" meeting_agenda: "Agenda" meeting_minutes: "Minutos" - meeting_section: "Section" + meeting_section: "Secção" activity: filter: meeting: "Reuniões" diff --git a/modules/meeting/config/locales/crowdin/uk.yml b/modules/meeting/config/locales/crowdin/uk.yml index c39410201798..831cf2f93a4a 100644 --- a/modules/meeting/config/locales/crowdin/uk.yml +++ b/modules/meeting/config/locales/crowdin/uk.yml @@ -60,7 +60,7 @@ uk: meeting_agenda_item: "Порядок денний" meeting_agenda: "Порядок денний" meeting_minutes: "Хвилини" - meeting_section: "Section" + meeting_section: "Розділ" activity: filter: meeting: "Наради" diff --git a/modules/reporting/config/locales/crowdin/ms.yml b/modules/reporting/config/locales/crowdin/ms.yml index 66823c595542..a3bcbcb3f812 100644 --- a/modules/reporting/config/locales/crowdin/ms.yml +++ b/modules/reporting/config/locales/crowdin/ms.yml @@ -22,7 +22,7 @@ ms: plugin_openproject_reporting: name: "Pelaporan OpenProject" - description: "Plugin ini membenarkan mencipta laporan kos tersuai dengan menyaring dan pengumpulan yang dibuat oleh plugin Masa dan kos OpenProject." + description: "Plugin ini membenarkan untuk mencipta laporan kos tersuai dengan penyaring dan pengumpulan yang dibuat oleh plugin Masa dan kos OpenProject." button_save_as: "Simpan laporan sebagai..." comments: "Komen" cost_reports_title: "Masa dan kos" From 5330b41ccfb1428476f7602366357b9f39460b9a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 05:50:43 +0000 Subject: [PATCH 040/325] Bump @openproject/primer-view-components in /frontend Bumps [@openproject/primer-view-components](https://github.com/opf/primer_view_components) from 0.33.1 to 0.33.2. - [Release notes](https://github.com/opf/primer_view_components/releases) - [Changelog](https://github.com/opf/primer_view_components/blob/main/CHANGELOG.md) - [Commits](https://github.com/opf/primer_view_components/compare/v0.33.1...v0.33.2) --- updated-dependencies: - dependency-name: "@openproject/primer-view-components" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index d29cb193cfd7..a06a5e94bee8 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -4816,9 +4816,9 @@ } }, "node_modules/@openproject/primer-view-components": { - "version": "0.33.1", - "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.33.1.tgz", - "integrity": "sha512-lOKqObPWYfuscBJnj0fFuyq8Lz/sQYBlXsvFAs3N1Nu0XSDH/Ak97bFcuIIX4lRWxnyGWSj/BREvIjCoyi2BCA==", + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.33.2.tgz", + "integrity": "sha512-TVxwv4R3QqANMkBl54t0LssMkwdfmFHv+rUCInap+1wrdb6pmGh+K1TvMS7yt+Uvu+0joxegorDmIiWLjJqWMA==", "dependencies": { "@github/auto-check-element": "^5.2.0", "@github/auto-complete-element": "^3.6.2", @@ -25864,9 +25864,9 @@ } }, "@openproject/primer-view-components": { - "version": "0.33.1", - "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.33.1.tgz", - "integrity": "sha512-lOKqObPWYfuscBJnj0fFuyq8Lz/sQYBlXsvFAs3N1Nu0XSDH/Ak97bFcuIIX4lRWxnyGWSj/BREvIjCoyi2BCA==", + "version": "0.33.2", + "resolved": "https://registry.npmjs.org/@openproject/primer-view-components/-/primer-view-components-0.33.2.tgz", + "integrity": "sha512-TVxwv4R3QqANMkBl54t0LssMkwdfmFHv+rUCInap+1wrdb6pmGh+K1TvMS7yt+Uvu+0joxegorDmIiWLjJqWMA==", "requires": { "@github/auto-check-element": "^5.2.0", "@github/auto-complete-element": "^3.6.2", From f95a9509eaf34281e29284bd79fba4f5dfb754c8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 05:50:59 +0000 Subject: [PATCH 041/325] Bump zone.js from 0.14.6 to 0.14.7 in /frontend Bumps [zone.js](https://github.com/angular/angular/tree/HEAD/packages/zone.js) from 0.14.6 to 0.14.7. - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/main/packages/zone.js/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/zone.js-0.14.7/packages/zone.js) --- updated-dependencies: - dependency-name: zone.js dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index d29cb193cfd7..e825b31f7be9 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -22755,9 +22755,9 @@ } }, "node_modules/zone.js": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.6.tgz", - "integrity": "sha512-vyRNFqofdaHVdWAy7v3Bzmn84a1JHWSjpuTZROT/uYn8I3p2cmo7Ro9twFmYRQDPhiYOV7QLk0hhY4JJQVqS6Q==" + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.7.tgz", + "integrity": "sha512-0w6DGkX2BPuiK/NLf+4A8FLE43QwBfuqz2dVgi/40Rj1WmqUskCqj329O/pwrqFJLG5X8wkeG2RhIAro441xtg==" } }, "dependencies": { @@ -39071,9 +39071,9 @@ "dev": true }, "zone.js": { - "version": "0.14.6", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.6.tgz", - "integrity": "sha512-vyRNFqofdaHVdWAy7v3Bzmn84a1JHWSjpuTZROT/uYn8I3p2cmo7Ro9twFmYRQDPhiYOV7QLk0hhY4JJQVqS6Q==" + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.7.tgz", + "integrity": "sha512-0w6DGkX2BPuiK/NLf+4A8FLE43QwBfuqz2dVgi/40Rj1WmqUskCqj329O/pwrqFJLG5X8wkeG2RhIAro441xtg==" } } } From ea37f257943b60bdd319cd43b0ac57f47252dd2a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Jun 2024 06:01:50 +0000 Subject: [PATCH 042/325] Bump openproject-primer_view_components from 0.33.1 to 0.33.2 Bumps openproject-primer_view_components from 0.33.1 to 0.33.2. --- updated-dependencies: - dependency-name: openproject-primer_view_components dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index f9e7a05e527d..015eda43ca1c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -386,7 +386,7 @@ GEM brakeman (6.1.2) racc browser (6.0.0) - builder (3.2.4) + builder (3.3.0) byebug (11.1.3) capybara (3.40.0) addressable @@ -775,7 +775,7 @@ GEM actionview openproject-octicons (= 19.14.0) railties - openproject-primer_view_components (0.33.1) + openproject-primer_view_components (0.33.2) actionview (>= 5.0.0) activesupport (>= 5.0.0) openproject-octicons (>= 19.12.0) From 400d3b0bf62c23ffa0edfa05519220703ee3835b Mon Sep 17 00:00:00 2001 From: Pavel Balashou Date: Fri, 7 Jun 2024 13:28:57 +0200 Subject: [PATCH 043/325] [#55472] Extend omniauth_user_authorized comment. Co-authored-by: Kabiru Mwenja --- .../lib/open_project/openid_connect/hooks/hook.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/openid_connect/lib/open_project/openid_connect/hooks/hook.rb b/modules/openid_connect/lib/open_project/openid_connect/hooks/hook.rb index 0b4c31df3b44..f2d446830767 100644 --- a/modules/openid_connect/lib/open_project/openid_connect/hooks/hook.rb +++ b/modules/openid_connect/lib/open_project/openid_connect/hooks/hook.rb @@ -41,8 +41,8 @@ def user_logged_in(context) end ## - # Once omniauth has returned with an auth hash - # persist the access token + # Called once omniauth has returned with an auth hash + # NOTE: It's a passthrough as we no longer persist the access token into the cookie def omniauth_user_authorized(_context); end end end From a3aa240823104c564d76ec7ee15f5816d6e80511 Mon Sep 17 00:00:00 2001 From: ulferts Date: Fri, 7 Jun 2024 16:52:00 +0200 Subject: [PATCH 044/325] enforce checking authorization by adding a before_action --- app/controllers/application_controller.rb | 17 +- .../concerns/accounts/authorization.rb | 139 ++++++++ .../concerns/authorization_spec.rb | 302 ++++++++++++++++++ 3 files changed, 448 insertions(+), 10 deletions(-) create mode 100644 app/controllers/concerns/accounts/authorization.rb create mode 100644 spec/controllers/concerns/authorization_spec.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 4375d2aa21dc..41584ef4d6fa 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -47,6 +47,7 @@ class ApplicationController < ActionController::Base include ErrorsHelper include Accounts::CurrentUser include Accounts::UserLogin + include Accounts::Authorization include ::OpenProject::Authentication::SessionExpiry include AdditionalUrlHelpers include OpenProjectErrorHelper @@ -130,7 +131,8 @@ def handle_unverified_request payload: ::OpenProject::Logging::ThreadPoolContextBuilder.build! end - before_action :user_setup, + before_action :authorization_check_required, + :user_setup, :set_localization, :tag_request, :check_if_login_required, @@ -359,19 +361,14 @@ def find_project_by_project_id # Find a project based on params[:project_id] # TODO: some subclasses override this, see about merging their logic - def find_optional_project - find_optional_project_and_raise_error + def authorize_in_optional_project + @project = Project.find(params[:project_id]) if params[:project_id].present? + + do_authorize({ controller: params[:controller], action: params[:action] }, global: params[:project_id].blank?) rescue ActiveRecord::RecordNotFound render_404 end - def find_optional_project_and_raise_error - @project = Project.find(params[:project_id]) if params[:project_id].present? - allowed = User.current.allowed_based_on_permission_context?({ controller: params[:controller], action: params[:action] }, - project: @project) - allowed ? true : deny_access - end - # Finds and sets @project based on @object.project def find_project_from_association render_404 if @object.blank? diff --git a/app/controllers/concerns/accounts/authorization.rb b/app/controllers/concerns/accounts/authorization.rb new file mode 100644 index 000000000000..cfed68a66b28 --- /dev/null +++ b/app/controllers/concerns/accounts/authorization.rb @@ -0,0 +1,139 @@ +# -- copyright +# OpenProject is an open source project management software. +# Copyright (C) 2010-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. +# ++ + +## +# Intended to be used by the ApplicationController to provide authorization helpers +module Accounts::Authorization + extend ActiveSupport::Concern + + METHODS_ENFORCING_AUTHORIZATION = %i[require_admin authorize authorize_global authorize_in_optional_project].freeze + + included do + class_attribute :authorization_ensured, + default: { + only: [], + except: [], + generally_allowed: false, + controller: self + } + end + + def require_admin + return unless require_login + + render_403 unless current_user.admin? + end + + def authorization_check_required + unless authorization_is_ensured?(params[:action]) + if Rails.env.development? + raise <<-MESSAGE + Authorization check required for #{params[:action]} in #{self.class.name}. + + Use any method of 'authorize', 'authorize_global', 'authorize_in_optional_project' + or 'require_admin' to ensure authorization. If authorization is checked by any other means, + affirm the same by calling 'authorization_checked!' in the controller. If the authorization does + not need to be checked for this action, affirm the same by calling 'no_authorization_required!' + MESSAGE + else + render_403 + end + end + end + + private + + def authorization_is_ensured?(action) + return false if authorization_ensured.nil? + + (authorization_ensured[:generally_allowed] == true || authorization_ensured[:only].include?(action.to_sym)) && + authorization_ensured[:except].exclude?(action.to_sym) + end + + class_methods do + # Overriding before_action of rails to check if any authorization method is by now defined. + def before_action(*names, &) + if METHODS_ENFORCING_AUTHORIZATION.intersect?(names) + no_authorization_required!(only: names.last.is_a?(Hash) ? Array(names.last[:only]) : [], + except: names.last.is_a?(Hash) ? Array(names.last[:except]) : []) + end + + super + end + + def no_authorization_required!(only: [], except: []) + only = Array(only) + except = Array(except) + + # A class_attribute is used so that inheritance works also for defined only/except actions. + # But since the only/accept arrays are only modified in place, the same object would be used from the + # ApplicationController downwards. So whenever it is detected that the controller the authorization_ensured + # object is defined for changes, we clone it so that henceforth all changes are local. + clone_authorization_ensured unless self == authorization_ensured[:controller] + + if only.any? || except.any? + update_authorization_ensured_on_actions(only:, except:) + else + update_authorization_ensured_on_all + end + end + + alias :authorization_checked! :no_authorization_required! + + def update_authorization_ensured_on_actions(only: [], except: []) + update_authorization_ensured_on_action_only(only) + update_authorization_ensured_on_action_except(only, except) + end + + def update_authorization_ensured_on_action_only(only) + authorization_ensured[:generally_allowed] = true if only.empty? + + if only.any? + authorization_ensured[:only] += only + authorization_ensured[:only].uniq! + end + end + + def update_authorization_ensured_on_action_except(only, except) + authorization_ensured[:except] += except - authorization_ensured[:only] if except.any? + authorization_ensured[:except] -= only if only.any? + authorization_ensured[:except].uniq! + end + + def update_authorization_ensured_on_all + authorization_ensured[:generally_allowed] = true + end + + def clone_authorization_ensured + self.authorization_ensured = { only: authorization_ensured[:only].dup, + except: authorization_ensured[:except].dup, + generally_allowed: authorization_ensured[:generally_allowed], + controller: self } + end + end +end diff --git a/spec/controllers/concerns/authorization_spec.rb b/spec/controllers/concerns/authorization_spec.rb new file mode 100644 index 000000000000..97ce57187a9e --- /dev/null +++ b/spec/controllers/concerns/authorization_spec.rb @@ -0,0 +1,302 @@ +# -- copyright +# OpenProject is an open source project management software. +# Copyright (C) 2010-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 ApplicationController, "enforcement of authorization" do # rubocop:disable RSpec/FilePath, RSpec/SpecFilePathFormat + shared_let(:user) { create(:user) } + + controller_setup = Module.new do + extend ActiveSupport::Concern + + included do + def index + render plain: "OK" + end + + private + + def require_admin; end + def authorize_global; end + + def authorize; end + + def authorize_in_optional_project; end + + def other_before_action; end + end + end + + current_user { user } + + shared_examples "succeeds" do + it "succeeds" do + get :index + + expect(response) + .to have_http_status :ok + end + end + + shared_examples "is prevented" do + it "fails with a 403" do + get :index + + expect(response) + .to have_http_status :forbidden + end + end + + context "without authorization or authorization forfeiting" do + controller do + include controller_setup + end + + it_behaves_like "is prevented" + end + + context "with authorization checked with require_admin" do + controller do + before_action :require_admin + + include controller_setup + end + + it_behaves_like "succeeds" + end + + context "with authorization checked with authorize_global" do + controller do + before_action :authorize_global + + include controller_setup + end + + it_behaves_like "succeeds" + end + + context "with authorization checked with authorize" do + controller do + before_action :authorize + + include controller_setup + end + + it_behaves_like "succeeds" + end + + context "with authorization checked with authorize_in_optional_project" do + controller do + before_action :authorize_in_optional_project + + include controller_setup + end + + it_behaves_like "succeeds" + end + + context "with another before action specified" do + controller do + before_action :other_before_action + + include controller_setup + end + + it_behaves_like "is prevented" + end + + context "when forfeiting authorization checks" do + controller do + no_authorization_required! + + include controller_setup + end + + it_behaves_like "succeeds" + end + + context "when stating that authorization has been checked" do + controller do + authorization_checked! + + include controller_setup + end + + it_behaves_like "succeeds" + end + + context "with authorization check in the superclass" do + controller(described_class) do + before_action :require_admin + end + + controller(controller_class) do + include controller_setup + end + + it_behaves_like "succeeds" + end + + context "when stating that authorization has been checked in the superclass" do + controller(described_class) do + authorization_checked! + end + + controller(controller_class) do + include controller_setup + end + + it_behaves_like "succeeds" + end + + context "when forfeiting authorization checks in the superclass" do + controller(described_class) do + no_authorization_required! + end + + controller(controller_class) do + include controller_setup + end + + it_behaves_like "succeeds" + end + + context "when forfeiting authorization checks on this specific action with only" do + controller do + no_authorization_required! only: %i[index] + + include controller_setup + end + + it_behaves_like "succeeds" + end + + context "when forfeiting authorization checks on another action with only" do + controller do + no_authorization_required! only: %i[some_other_action] + + include controller_setup + end + + it_behaves_like "is prevented" + end + + context "when forfeiting authorization checks on all but another action with except" do + controller do + no_authorization_required! except: %i[some_other_action] + + include controller_setup + end + + it_behaves_like "succeeds" + end + + context "when forfeiting authorization on all other actions with except" do + controller do + no_authorization_required! except: %i[index] + + include controller_setup + end + + it_behaves_like "is prevented" + end + + context "with authorization checked on another action with only" do + controller do + before_action :require_admin, only: %i[some_other_action] + + include controller_setup + end + + it_behaves_like "is prevented" + end + + context "with authorization checked on the action with only" do + controller do + before_action :require_admin, only: %i[index] + + include controller_setup + end + + it_behaves_like "succeeds" + end + + context "with authorization checked on all but this action with except" do + controller do + before_action :require_admin, except: %i[index] + + include controller_setup + end + + it_behaves_like "is prevented" + end + + context "with authorization checked on all but another action with except" do + controller do + before_action :require_admin, except: %i[another_action] + + def another_action; end + + include controller_setup + end + + it_behaves_like "succeeds" + end + + context "with authorization checked in a sibling class" do + # Superclass + controller do + include controller_setup + end + + anonymous_superclass = controller_class + + # Sibling class + controller(anonymous_superclass) do + before_action :require_admin + end + + # actually tested class + controller(anonymous_superclass) do + # Nothing extra + end + + it_behaves_like "is prevented" + end + + context "with authorization checked by a number of different actions" do + controller do + before_action :require_admin, except: %i[index] + before_action :authorize, only: %i[index] + + include controller_setup + end + + it_behaves_like "succeeds" + end +end From ed5a16223002821c660abfef08277c03c97f523b Mon Sep 17 00:00:00 2001 From: ulferts Date: Fri, 7 Jun 2024 16:55:40 +0200 Subject: [PATCH 045/325] allow actions to be called on those not using default authorization before_actions --- app/controllers/account_controller.rb | 1 + app/controllers/activities_controller.rb | 2 +- app/controllers/angular_controller.rb | 2 ++ app/controllers/api_docs_controller.rb | 1 + app/controllers/colors_controller.rb | 1 + .../concerns/accounts/omniauth_login.rb | 7 +++++-- app/controllers/custom_styles_controller.rb | 13 +++++++++--- app/controllers/favorites_controller.rb | 1 + app/controllers/groups_controller.rb | 2 ++ app/controllers/help_controller.rb | 2 ++ app/controllers/highlighting_controller.rb | 1 + app/controllers/homescreen_controller.rb | 1 + app/controllers/journals_controller.rb | 9 ++++++--- app/controllers/messages_controller.rb | 2 ++ .../my/auto_login_tokens_controller.rb | 3 +++ app/controllers/my/sessions_controller.rb | 2 ++ app/controllers/my_controller.rb | 20 +++++++++++++++++-- app/controllers/news_controller.rb | 2 +- app/controllers/oauth/auth_base_controller.rb | 2 ++ app/controllers/oauth/grants_controller.rb | 2 ++ app/controllers/oauth_clients_controller.rb | 2 ++ app/controllers/onboarding_controller.rb | 2 ++ .../placeholder_users_controller.rb | 1 + app/controllers/projects/menus_controller.rb | 1 + .../projects/queries_controller.rb | 1 + app/controllers/projects_controller.rb | 2 ++ app/controllers/search_controller.rb | 2 +- app/controllers/users_controller.rb | 3 +++ app/controllers/watchers_controller.rb | 19 ++++++++++-------- .../auto_completes_controller.rb | 3 +++ .../work_packages/progress_controller.rb | 1 + app/controllers/work_packages_controller.rb | 3 ++- .../controllers/avatars/avatar_controller.rb | 2 ++ .../avatars/my_avatar_controller.rb | 2 ++ .../bim/ifc_models/ifc_models_controller.rb | 1 + .../controllers/boards/boards_controller.rb | 5 +---- .../app/controllers/budgets_controller.rb | 5 +++-- .../calendar/calendars_controller.rb | 2 +- .../controllers/calendar/ical_controller.rb | 1 + .../controllers/hourly_rates_controller.rb | 3 ++- .../app/controllers/gantt/gantt_controller.rb | 2 +- .../app/controllers/gantt/menus_controller.rb | 2 +- .../app/controllers/meetings_controller.rb | 2 +- .../recaptcha/request_controller.rb | 1 + .../controllers/cost_reports_controller.rb | 2 +- .../storages/project_storages_controller.rb | 1 + .../team_planner/team_planner_controller.rb | 4 +--- .../authentication_controller.rb | 1 + .../two_factor_devices_controller.rb | 6 ++++++ .../my/backup_codes_controller.rb | 3 +++ .../my/remember_cookie_controller.rb | 1 + .../my/two_factor_devices_controller.rb | 4 +++- .../webhooks/incoming/hooks_controller.rb | 3 +++ .../application_controller_spec.rb | 4 ++++ 54 files changed, 135 insertions(+), 38 deletions(-) diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb index 700a0c132ed2..ebb0b2959512 100644 --- a/app/controllers/account_controller.rb +++ b/app/controllers/account_controller.rb @@ -36,6 +36,7 @@ class AccountController < ApplicationController # prevents login action to be filtered by check_if_login_required application scope filter skip_before_action :check_if_login_required + no_authorization_required! before_action :apply_csp_appends, only: %i[login] before_action :disable_api diff --git a/app/controllers/activities_controller.rb b/app/controllers/activities_controller.rb index fee13edbd990..8093becbaf1e 100644 --- a/app/controllers/activities_controller.rb +++ b/app/controllers/activities_controller.rb @@ -30,7 +30,7 @@ class ActivitiesController < ApplicationController include Layout menu_item :activity - before_action :find_optional_project, + before_action :authorize_in_optional_project, :verify_activities_module_activated, :determine_subprojects, :determine_author, diff --git a/app/controllers/angular_controller.rb b/app/controllers/angular_controller.rb index d44fd99127a7..8697a2fb39a7 100644 --- a/app/controllers/angular_controller.rb +++ b/app/controllers/angular_controller.rb @@ -29,6 +29,8 @@ class AngularController < ApplicationController before_action :require_login + no_authorization_required! + def empty_layout # Frontend will handle rendering # but we will need to render with layout diff --git a/app/controllers/api_docs_controller.rb b/app/controllers/api_docs_controller.rb index 50ac41572efd..5a1bec3d2edb 100644 --- a/app/controllers/api_docs_controller.rb +++ b/app/controllers/api_docs_controller.rb @@ -28,6 +28,7 @@ class APIDocsController < ApplicationController before_action :require_login + no_authorization_required! only: :index helper API::APIDocsHelper diff --git a/app/controllers/colors_controller.rb b/app/controllers/colors_controller.rb index 018c6cbfaac1..569dacf95405 100644 --- a/app/controllers/colors_controller.rb +++ b/app/controllers/colors_controller.rb @@ -28,6 +28,7 @@ class ColorsController < ApplicationController before_action :require_admin_unless_readonly_api_request + authorization_checked! only: %i[index show new edit create update confirm_destroy destroy] layout "admin" diff --git a/app/controllers/concerns/accounts/omniauth_login.rb b/app/controllers/concerns/accounts/omniauth_login.rb index efb866c89664..96a7a4475314 100644 --- a/app/controllers/concerns/accounts/omniauth_login.rb +++ b/app/controllers/concerns/accounts/omniauth_login.rb @@ -38,10 +38,13 @@ module Accounts::OmniauthLogin # the other filters are not applicable either since OmniAuth is doing authentication # itself %i[ - verify_authenticity_token user_setup - check_if_login_required check_session_lifetime + verify_authenticity_token + user_setup + check_if_login_required + check_session_lifetime ] .each { |key| skip_before_action key, only: [:omniauth_login] } + no_authorization_required! only: %i[omniauth_login omniauth_failure] helper :omniauth end diff --git a/app/controllers/custom_styles_controller.rb b/app/controllers/custom_styles_controller.rb index 692a06ec23f1..228c47c8343c 100644 --- a/app/controllers/custom_styles_controller.rb +++ b/app/controllers/custom_styles_controller.rb @@ -30,12 +30,19 @@ class CustomStylesController < ApplicationController layout "admin" menu_item :custom_style + UNGUARDED_ACTIONS = %i[logo_download + export_logo_download + export_cover_download + favicon_download + touch_icon_download].freeze + before_action :require_admin, - except: %i[logo_download export_logo_download export_cover_download favicon_download touch_icon_download] + except: UNGUARDED_ACTIONS before_action :require_ee_token, - except: %i[upsale logo_download export_logo_download export_cover_download favicon_download touch_icon_download] + except: UNGUARDED_ACTIONS + %i[upsale] skip_before_action :check_if_login_required, - only: %i[logo_download export_logo_download export_cover_download favicon_download touch_icon_download] + only: UNGUARDED_ACTIONS + no_authorization_required! only: UNGUARDED_ACTIONS def show @custom_style = CustomStyle.current || CustomStyle.new diff --git a/app/controllers/favorites_controller.rb b/app/controllers/favorites_controller.rb index 6f4cc9c089e3..3dc66c8bdeac 100644 --- a/app/controllers/favorites_controller.rb +++ b/app/controllers/favorites_controller.rb @@ -29,6 +29,7 @@ class FavoritesController < ApplicationController before_action :find_favored_by_object before_action :require_login + no_authorization_required! only: %i[favorite unfavorite] def favorite if @favored.visible?(User.current) diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index c305bb1c7f78..ba45fc56000b 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -31,6 +31,8 @@ class GroupsController < ApplicationController layout "admin" before_action :require_admin, except: %i[show] + no_authorization_required! only: %i[show] + before_action :find_group, only: %i[destroy update show create_memberships destroy_membership edit_membership add_users] diff --git a/app/controllers/help_controller.rb b/app/controllers/help_controller.rb index 2af67cb280a4..ffcc23bfe192 100644 --- a/app/controllers/help_controller.rb +++ b/app/controllers/help_controller.rb @@ -27,6 +27,8 @@ #++ class HelpController < ApplicationController + no_authorization_required! only: %i[keyboard_shortcuts text_formatting] + def keyboard_shortcuts redirect_to OpenProject::Static::Links[:shortcuts][:href] end diff --git a/app/controllers/highlighting_controller.rb b/app/controllers/highlighting_controller.rb index 6cd953a7f8f6..b67442cd91f8 100644 --- a/app/controllers/highlighting_controller.rb +++ b/app/controllers/highlighting_controller.rb @@ -29,6 +29,7 @@ class HighlightingController < ApplicationController before_action :determine_freshness skip_before_action :check_if_login_required, only: [:styles] + no_authorization_required! only: [:styles] def styles response.content_type = Mime[:css] diff --git a/app/controllers/homescreen_controller.rb b/app/controllers/homescreen_controller.rb index c84ed013104a..a989230b62a7 100644 --- a/app/controllers/homescreen_controller.rb +++ b/app/controllers/homescreen_controller.rb @@ -28,6 +28,7 @@ class HomescreenController < ApplicationController skip_before_action :check_if_login_required, only: [:robots] + no_authorization_required! only: %i[index robots] layout "global" diff --git a/app/controllers/journals_controller.rb b/app/controllers/journals_controller.rb index cd408645845a..31e664f0e600 100644 --- a/app/controllers/journals_controller.rb +++ b/app/controllers/journals_controller.rb @@ -29,9 +29,12 @@ #++ class JournalsController < ApplicationController - before_action :find_optional_project, only: [:index] - before_action :find_journal, only: [:diff] - before_action :ensure_permitted, only: [:diff] + before_action :authorize_in_optional_project, only: [:index] + before_action :find_journal, + :ensure_permitted, + only: [:diff] + authorization_checked! only: %i[diff] + accept_key_auth :index menu_item :issues diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb index efe9fcb66f33..397afab23730 100644 --- a/app/controllers/messages_controller.rb +++ b/app/controllers/messages_controller.rb @@ -32,6 +32,8 @@ class MessagesController < ApplicationController model_object Message, scope: Forum before_action :find_object_and_scope before_action :authorize, except: %i[edit update destroy] + # Checked inside the method. + no_authorization_required! only: %i[edit update destroy] include AttachmentsHelper include PaginationHelper diff --git a/app/controllers/my/auto_login_tokens_controller.rb b/app/controllers/my/auto_login_tokens_controller.rb index 21de9f6f2214..f0222b9f8568 100644 --- a/app/controllers/my/auto_login_tokens_controller.rb +++ b/app/controllers/my/auto_login_tokens_controller.rb @@ -1,5 +1,8 @@ module My class AutoLoginTokensController < ::ApplicationController + before_action :require_login + no_authorization_required! only: %i(destroy) + before_action :find_token, only: %i(destroy) layout "my" diff --git a/app/controllers/my/sessions_controller.rb b/app/controllers/my/sessions_controller.rb index b243be219a6d..2c6094505d68 100644 --- a/app/controllers/my/sessions_controller.rb +++ b/app/controllers/my/sessions_controller.rb @@ -1,6 +1,8 @@ module My class SessionsController < ::ApplicationController before_action :require_login + no_authorization_required! only: %i(index show destroy) + self._model_object = ::Sessions::UserSession before_action :find_model_object, only: %i(show destroy) diff --git a/app/controllers/my_controller.rb b/app/controllers/my_controller.rb index 52937b948e4a..95bd80211321 100644 --- a/app/controllers/my_controller.rb +++ b/app/controllers/my_controller.rb @@ -39,6 +39,22 @@ class MyController < ApplicationController before_action :set_grouped_ical_tokens, only: %i[access_token] before_action :set_ical_token, only: %i[revoke_ical_token] + no_authorization_required! only: %i[account + update_account + settings + update_settings + password + change_password + access_token + delete_storage_token + notifications + reminders + generate_rss_key + revoke_rss_key + generate_api_key + revoke_api_key + revoke_ical_token] + menu_item :account, only: [:account] menu_item :settings, only: [:settings] menu_item :password, only: [:password] @@ -177,6 +193,8 @@ def revoke_ical_token redirect_to action: 'access_token' end + private + def default_breadcrumb I18n.t(:label_my_account) end @@ -185,8 +203,6 @@ def show_local_breadcrumb false end - private - def redirect_if_password_change_not_allowed_for(user) unless user.change_password_allowed? flash[:error] = I18n.t(:notice_can_t_change_password) diff --git a/app/controllers/news_controller.rb b/app/controllers/news_controller.rb index 92d31cf6c088..3455f2d1324f 100644 --- a/app/controllers/news_controller.rb +++ b/app/controllers/news_controller.rb @@ -36,7 +36,7 @@ class NewsController < ApplicationController before_action :find_project_from_association, except: %i[new create index] before_action :find_project, only: %i[new create] before_action :authorize, except: [:index] - before_action :find_optional_project, only: [:index] + before_action :authorize_in_optional_project, only: [:index] accept_key_auth :index def index diff --git a/app/controllers/oauth/auth_base_controller.rb b/app/controllers/oauth/auth_base_controller.rb index 1428e5230193..89a6b5f88fe2 100644 --- a/app/controllers/oauth/auth_base_controller.rb +++ b/app/controllers/oauth/auth_base_controller.rb @@ -37,6 +37,8 @@ class AuthBaseController < ::ApplicationController prepend_before_action :extend_content_security_policy skip_before_action :check_if_login_required + no_authorization_required! + layout "only_logo" def extend_content_security_policy diff --git a/app/controllers/oauth/grants_controller.rb b/app/controllers/oauth/grants_controller.rb index e38afe156b12..c4587b5e5e8f 100644 --- a/app/controllers/oauth/grants_controller.rb +++ b/app/controllers/oauth/grants_controller.rb @@ -29,6 +29,7 @@ module OAuth class GrantsController < ::ApplicationController before_action :require_login + authorization_checked! only: %i[index revoke_application] layout "my" menu_item :access_token @@ -57,6 +58,7 @@ def revoke_application def find_application ::Doorkeeper::Application + .authorized_for(current_user) .where(id: params[:application_id]) .select(:name, :id) .take diff --git a/app/controllers/oauth_clients_controller.rb b/app/controllers/oauth_clients_controller.rb index 4a9823bc4277..afe14e369856 100644 --- a/app/controllers/oauth_clients_controller.rb +++ b/app/controllers/oauth_clients_controller.rb @@ -38,6 +38,8 @@ class OAuthClientsController < ApplicationController before_action :set_code, only: [:callback] before_action :set_connection_manager, only: [:callback] + no_authorization_required! only: %i[callback ensure_connection] + after_action :clear_oauth_state_cookie, only: [:callback] # Provide the OAuth2 "callback" endpoint. diff --git a/app/controllers/onboarding_controller.rb b/app/controllers/onboarding_controller.rb index b63925e1b9b7..95bc94725a4e 100644 --- a/app/controllers/onboarding_controller.rb +++ b/app/controllers/onboarding_controller.rb @@ -27,6 +27,8 @@ #++ class OnboardingController < ApplicationController + no_authorization_required! only: %i[user_settings] + def user_settings @user = User.current diff --git a/app/controllers/placeholder_users_controller.rb b/app/controllers/placeholder_users_controller.rb index 8ec919515c30..daaf585fce5f 100644 --- a/app/controllers/placeholder_users_controller.rb +++ b/app/controllers/placeholder_users_controller.rb @@ -30,6 +30,7 @@ class PlaceholderUsersController < ApplicationController include EnterpriseTrialHelper layout "admin" before_action :authorize_global, except: %i[show] + no_authorization_required! only: %i[show] before_action :find_placeholder_user, only: %i[show edit diff --git a/app/controllers/projects/menus_controller.rb b/app/controllers/projects/menus_controller.rb index 57edb6124e8f..08c92d81fc3b 100644 --- a/app/controllers/projects/menus_controller.rb +++ b/app/controllers/projects/menus_controller.rb @@ -29,6 +29,7 @@ module Projects class MenusController < ApplicationController # No authorize as every user (or logged in user) # is allowed to see the menu. + no_authorization_required! only: :show def show projects_menu = Menus::Projects.new(controller_path: params[:controller_path], params:, current_user:) diff --git a/app/controllers/projects/queries_controller.rb b/app/controllers/projects/queries_controller.rb index bf9bbc36fd1c..27b7018364e7 100644 --- a/app/controllers/projects/queries_controller.rb +++ b/app/controllers/projects/queries_controller.rb @@ -30,6 +30,7 @@ class Projects::QueriesController < ApplicationController include Projects::QueryLoading # No need for a more specific authorization check. That is carried out in the contracts. + no_authorization_required! only: %i[show new create rename update publish unpublish destroy] before_action :require_login before_action :find_query, only: %i[show rename update destroy publish unpublish] before_action :build_query_or_deny_access, only: %i[new create] diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index a23acff93c7d..3d09898e072f 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -36,6 +36,8 @@ class ProjectsController < ApplicationController before_action :authorize_global, only: %i[new] before_action :require_admin, only: %i[destroy destroy_info] + no_authorization_required! only: %i[index] + include SortHelper include PaginationHelper include QueriesHelper diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index dbdf68110eb1..2b526534d47a 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -29,7 +29,7 @@ class SearchController < ApplicationController include Layout - before_action :find_optional_project, + before_action :authorize_in_optional_project, :prepare_tokens LIMIT = 10 diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 1a599d96d232..9f7ea9ea6efb 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -44,6 +44,9 @@ class UsersController < ApplicationController before_action :authorize_for_user, only: [:destroy] before_action :check_if_deletion_allowed, only: %i[deletion_info destroy] + no_authorization_required! only: %i[show] + authorization_checked! only: %i[destroy deletion_info] + before_action :set_current_activity_page, only: [:show] # Password confirmation helpers and actions diff --git a/app/controllers/watchers_controller.rb b/app/controllers/watchers_controller.rb index af71ecb1556e..9d367af4b515 100644 --- a/app/controllers/watchers_controller.rb +++ b/app/controllers/watchers_controller.rb @@ -27,16 +27,15 @@ #++ class WatchersController < ApplicationController - before_action :find_watched_by_object - before_action :find_project - before_action :require_login, :check_project_privacy, only: %i[watch unwatch] + before_action :find_watched_by_object, + :find_project, + :require_login, + :deny_access_unless_visible + + authorization_checked! only: %i[watch unwatch] def watch - if @watched.respond_to?(:visible?) && !@watched.visible?(User.current) - render_403 - else - set_watcher(User.current, true) - end + set_watcher(User.current, true) end def unwatch @@ -60,4 +59,8 @@ def set_watcher(user, watching) @watched.set_watcher(user, watching) redirect_back(fallback_location: home_url) end + + def deny_access_unless_visible + deny_access unless @watched.visible?(User.current) + end end diff --git a/app/controllers/work_packages/auto_completes_controller.rb b/app/controllers/work_packages/auto_completes_controller.rb index 58152a1e5ff0..f5533e281c7a 100644 --- a/app/controllers/work_packages/auto_completes_controller.rb +++ b/app/controllers/work_packages/auto_completes_controller.rb @@ -29,6 +29,9 @@ require "rack/utils" class WorkPackages::AutoCompletesController < ApplicationController + # Authorization is checked by the query. + no_authorization_required! only: :index + def index @work_packages = work_packages_matching_query_prop diff --git a/app/controllers/work_packages/progress_controller.rb b/app/controllers/work_packages/progress_controller.rb index d9e5cfa196a4..f10dc61cf1eb 100644 --- a/app/controllers/work_packages/progress_controller.rb +++ b/app/controllers/work_packages/progress_controller.rb @@ -37,6 +37,7 @@ class WorkPackages::ProgressController < ApplicationController layout false before_action :set_work_package before_action :extract_persisted_progress_attributes, only: %i[edit create update] + authorization_checked! only: %i[new edit create update] helper_method :modal_class diff --git a/app/controllers/work_packages_controller.rb b/app/controllers/work_packages_controller.rb index ab209aadfa2b..f66dcea7711b 100644 --- a/app/controllers/work_packages_controller.rb +++ b/app/controllers/work_packages_controller.rb @@ -36,9 +36,10 @@ class WorkPackagesController < ApplicationController before_action :authorize_on_work_package, :project, only: :show - before_action :find_optional_project, + before_action :authorize_in_optional_project, :check_allowed_export, :protect_from_unauthorized_export, only: :index + authorization_checked! only: %i[index show] before_action :load_and_validate_query, only: :index, unless: -> { request.format.html? } before_action :load_work_packages, only: :index, if: -> { request.format.atom? } diff --git a/modules/avatars/app/controllers/avatars/avatar_controller.rb b/modules/avatars/app/controllers/avatars/avatar_controller.rb index 39dc2c32acf3..a5a68b0f74e4 100644 --- a/modules/avatars/app/controllers/avatars/avatar_controller.rb +++ b/modules/avatars/app/controllers/avatars/avatar_controller.rb @@ -3,6 +3,8 @@ class AvatarController < ::ApplicationController before_action :ensure_enabled before_action :find_avatar + no_authorization_required! + def show send_file @avatar.diskfile, filename: filename_for_content_disposition(@avatar.filename), diff --git a/modules/avatars/app/controllers/avatars/my_avatar_controller.rb b/modules/avatars/app/controllers/avatars/my_avatar_controller.rb index 5acbbdeb17ab..9054b3c03a78 100644 --- a/modules/avatars/app/controllers/avatars/my_avatar_controller.rb +++ b/modules/avatars/app/controllers/avatars/my_avatar_controller.rb @@ -3,6 +3,8 @@ class MyAvatarController < BaseController before_action :require_login before_action :set_user + no_authorization_required! only: %i[show update destroy] + layout "my" menu_item :avatar diff --git a/modules/bim/app/controllers/bim/ifc_models/ifc_models_controller.rb b/modules/bim/app/controllers/bim/ifc_models/ifc_models_controller.rb index 00c6bdcca400..0e3ac8abe607 100644 --- a/modules/bim/app/controllers/bim/ifc_models/ifc_models_controller.rb +++ b/modules/bim/app/controllers/bim/ifc_models/ifc_models_controller.rb @@ -39,6 +39,7 @@ class IfcModelsController < BaseController before_action :authorize, except: %i[direct_upload_finished set_direct_upload_file_name] before_action :require_login, only: [:set_direct_upload_file_name] skip_before_action :verify_authenticity_token, only: [:set_direct_upload_file_name] # AJAX request in page, so skip authenticity token + no_authorization_required! only: %i[set_direct_upload_file_name direct_upload_finished] menu_item :ifc_models diff --git a/modules/boards/app/controllers/boards/boards_controller.rb b/modules/boards/app/controllers/boards/boards_controller.rb index 4d60fabb1085..07e9f85d6b83 100644 --- a/modules/boards/app/controllers/boards/boards_controller.rb +++ b/modules/boards/app/controllers/boards/boards_controller.rb @@ -2,10 +2,7 @@ module ::Boards class BoardsController < BaseController include Layout - before_action :find_optional_project - - before_action :authorize_global, if: -> { @project.nil? } - before_action :authorize, if: -> { @project.present? } + before_action :authorize_in_optional_project # The boards permission alone does not suffice # to view work packages diff --git a/modules/budgets/app/controllers/budgets_controller.rb b/modules/budgets/app/controllers/budgets_controller.rb index 852a1d5758ad..a6edf12954f9 100644 --- a/modules/budgets/app/controllers/budgets_controller.rb +++ b/modules/budgets/app/controllers/budgets_controller.rb @@ -32,16 +32,17 @@ class BudgetsController < ApplicationController before_action :find_budget, only: %i[show edit update copy destroy_info] before_action :find_budgets, only: :destroy before_action :check_and_update_belonging_work_packages, only: :destroy - before_action :find_project, only: %i[new create update_material_budget_item update_labor_budget_item] + before_action :find_project_by_project_id, only: %i[new create update_material_budget_item update_labor_budget_item] before_action :find_optional_project, only: :index before_action :authorize_global, only: :index before_action :authorize, except: [ - # unrestricted actions :index, + # unrestricted actions :update_material_budget_item, :update_labor_budget_item ] + no_authorization_required! only: %i[update_material_budget_item update_labor_budget_item] helper :sort include SortHelper diff --git a/modules/calendar/app/controllers/calendar/calendars_controller.rb b/modules/calendar/app/controllers/calendar/calendars_controller.rb index c85bd8311c68..2145a5b76e8c 100644 --- a/modules/calendar/app/controllers/calendar/calendars_controller.rb +++ b/modules/calendar/app/controllers/calendar/calendars_controller.rb @@ -28,7 +28,7 @@ module ::Calendar class CalendarsController < ApplicationController - before_action :find_optional_project + before_action :authorize_in_optional_project before_action :build_calendar_view, only: %i[new] before_action :authorize, except: %i[index new create] before_action :authorize_global, only: %i[index new create] diff --git a/modules/calendar/app/controllers/calendar/ical_controller.rb b/modules/calendar/app/controllers/calendar/ical_controller.rb index f3284d7c4f5c..ad2deaffad14 100644 --- a/modules/calendar/app/controllers/calendar/ical_controller.rb +++ b/modules/calendar/app/controllers/calendar/ical_controller.rb @@ -30,6 +30,7 @@ module ::Calendar class ICalController < ApplicationController # Authentication and authorization is handled within the service. skip_before_action :check_if_login_required + no_authorization_required! only: :show def show begin diff --git a/modules/costs/app/controllers/hourly_rates_controller.rb b/modules/costs/app/controllers/hourly_rates_controller.rb index f97c18a8f02f..b47f0cf22e6b 100644 --- a/modules/costs/app/controllers/hourly_rates_controller.rb +++ b/modules/costs/app/controllers/hourly_rates_controller.rb @@ -38,8 +38,9 @@ class HourlyRatesController < ApplicationController before_action :find_optional_project, only: %i[show edit update] before_action :find_project, only: [:set_rate] - # #show, #edit have their own authorization + # #show, #edit and #update have their own authorization before_action :authorize, except: %i[show edit update] + no_authorization_required! only: %i[show edit update] # TODO: this should be an index def show diff --git a/modules/gantt/app/controllers/gantt/gantt_controller.rb b/modules/gantt/app/controllers/gantt/gantt_controller.rb index 62424595cb77..69289d267474 100644 --- a/modules/gantt/app/controllers/gantt/gantt_controller.rb +++ b/modules/gantt/app/controllers/gantt/gantt_controller.rb @@ -6,7 +6,7 @@ class GanttController < ApplicationController accept_key_auth :index - before_action :find_optional_project, :protect_from_unauthorized_export, only: :index + before_action :authorize_in_optional_project, :protect_from_unauthorized_export, only: :index before_action :load_and_validate_query, only: :index, unless: -> { request.format.html? } diff --git a/modules/gantt/app/controllers/gantt/menus_controller.rb b/modules/gantt/app/controllers/gantt/menus_controller.rb index 094e01481515..3e6cae9bdd82 100644 --- a/modules/gantt/app/controllers/gantt/menus_controller.rb +++ b/modules/gantt/app/controllers/gantt/menus_controller.rb @@ -27,7 +27,7 @@ # ++ module Gantt class MenusController < ApplicationController - before_action :find_optional_project + before_action :authorize_in_optional_project def show @sidebar_menu_items = menu_items diff --git a/modules/meeting/app/controllers/meetings_controller.rb b/modules/meeting/app/controllers/meetings_controller.rb index 41588cf11dd1..07b9a2dbc7a3 100644 --- a/modules/meeting/app/controllers/meetings_controller.rb +++ b/modules/meeting/app/controllers/meetings_controller.rb @@ -28,7 +28,7 @@ class MeetingsController < ApplicationController around_action :set_time_zone - before_action :find_optional_project, only: %i[index new show create history] + before_action :authorize_in_optional_project, only: %i[index new show create history] before_action :verify_activities_module_activated, only: %i[history] before_action :determine_date_range, only: %i[history] before_action :determine_author, only: %i[history] diff --git a/modules/recaptcha/app/controllers/recaptcha/request_controller.rb b/modules/recaptcha/app/controllers/recaptcha/request_controller.rb index 2d48aa38032e..63f81b212f11 100644 --- a/modules/recaptcha/app/controllers/recaptcha/request_controller.rb +++ b/modules/recaptcha/app/controllers/recaptcha/request_controller.rb @@ -7,6 +7,7 @@ class RequestController < ApplicationController # User is not yet logged in, so skip login required check skip_before_action :check_if_login_required + no_authorization_required! only: %i[perform verify] # Skip if recaptcha was disabled before_action :skip_if_disabled diff --git a/modules/reporting/app/controllers/cost_reports_controller.rb b/modules/reporting/app/controllers/cost_reports_controller.rb index 8014ac1b6e56..d333cf6430f2 100644 --- a/modules/reporting/app/controllers/cost_reports_controller.rb +++ b/modules/reporting/app/controllers/cost_reports_controller.rb @@ -40,7 +40,7 @@ class CostReportsController < ApplicationController before_action :check_cache before_action :load_all - before_action :find_optional_project + before_action :authorize_in_optional_project before_action :find_optional_user include Layout diff --git a/modules/storages/app/controllers/storages/project_storages_controller.rb b/modules/storages/app/controllers/storages/project_storages_controller.rb index 8a63558450d8..530e79b8f184 100644 --- a/modules/storages/app/controllers/storages/project_storages_controller.rb +++ b/modules/storages/app/controllers/storages/project_storages_controller.rb @@ -36,6 +36,7 @@ class Storages::ProjectStoragesController < ApplicationController before_action :find_model_object before_action :find_project_by_project_id before_action :render_403, unless: -> { User.current.allowed_in_project?(:view_file_links, @project) } + no_authorization_required! only: %i[open] # rubocop:disable Metrics/AbcSize def open diff --git a/modules/team_planner/app/controllers/team_planner/team_planner_controller.rb b/modules/team_planner/app/controllers/team_planner/team_planner_controller.rb index aecacbec217b..c720fd2ba2ac 100644 --- a/modules/team_planner/app/controllers/team_planner/team_planner_controller.rb +++ b/modules/team_planner/app/controllers/team_planner/team_planner_controller.rb @@ -2,10 +2,8 @@ module ::TeamPlanner class TeamPlannerController < BaseController include EnterpriseTrialHelper include Layout - before_action :find_optional_project + before_action :authorize_in_optional_project before_action :build_plan_view, only: %i[new] - before_action :authorize, except: %i[overview new create upsale] - before_action :authorize_global, only: %i[overview new create] before_action :require_ee_token, except: %i[upsale] before_action :find_plan_view, only: %i[destroy] diff --git a/modules/two_factor_authentication/app/controllers/two_factor_authentication/authentication_controller.rb b/modules/two_factor_authentication/app/controllers/two_factor_authentication/authentication_controller.rb index a16a2a070608..fdd4dc400c73 100644 --- a/modules/two_factor_authentication/app/controllers/two_factor_authentication/authentication_controller.rb +++ b/modules/two_factor_authentication/app/controllers/two_factor_authentication/authentication_controller.rb @@ -11,6 +11,7 @@ class AuthenticationController < ApplicationController # User is not yet logged in, so skip login required check skip_before_action :check_if_login_required + no_authorization_required! # Avoid catch-all from core resulting in methods before_action :only_post, only: :confirm_otp diff --git a/modules/two_factor_authentication/app/controllers/two_factor_authentication/forced_registration/two_factor_devices_controller.rb b/modules/two_factor_authentication/app/controllers/two_factor_authentication/forced_registration/two_factor_devices_controller.rb index 384d95fec427..0a5f2363caea 100644 --- a/modules/two_factor_authentication/app/controllers/two_factor_authentication/forced_registration/two_factor_devices_controller.rb +++ b/modules/two_factor_authentication/app/controllers/two_factor_authentication/forced_registration/two_factor_devices_controller.rb @@ -6,6 +6,12 @@ class TwoFactorDevicesController < ::TwoFactorAuthentication::BaseController # Skip default login skip_before_action :check_if_login_required + no_authorization_required! only: %i[register + new + confirm + web_authn + make_default + destroy] before_action :find_device, only: [:confirm] diff --git a/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/backup_codes_controller.rb b/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/backup_codes_controller.rb index 9ed10ef1d1ed..a6eb12a0f84b 100644 --- a/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/backup_codes_controller.rb +++ b/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/backup_codes_controller.rb @@ -3,6 +3,7 @@ module My class BackupCodesController < ::ApplicationController # Ensure user is logged in before_action :require_login + no_authorization_required! only: %i[show create] # Password confirmation helpers and actions include PasswordConfirmation @@ -23,6 +24,8 @@ def show render end + private + def check_regenerate_done @backup_codes = flash[:_backup_codes] flash.delete :_backup_codes diff --git a/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/remember_cookie_controller.rb b/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/remember_cookie_controller.rb index 3f9d0d520557..5be5a66ee3ae 100644 --- a/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/remember_cookie_controller.rb +++ b/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/remember_cookie_controller.rb @@ -6,6 +6,7 @@ class RememberCookieController < ::ApplicationController # Ensure user is logged in before_action :require_login + no_authorization_required! layout "my" menu_item :two_factor_authentication diff --git a/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/two_factor_devices_controller.rb b/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/two_factor_devices_controller.rb index d8d2844cbf06..59f69f24c15d 100644 --- a/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/two_factor_devices_controller.rb +++ b/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/two_factor_devices_controller.rb @@ -3,8 +3,10 @@ module My class TwoFactorDevicesController < ::TwoFactorAuthentication::BaseController # Ensure user is logged in before_action :require_login - before_action :set_user_variables + # Authorization is not handled explictly but as the user on which changes can be done is only the current user + # (and that user needs to be logged in), no action harmful to other users can be done. + no_authorization_required! before_action :find_device, except: %i[new index register webauthn_challenge] diff --git a/modules/webhooks/app/controllers/webhooks/incoming/hooks_controller.rb b/modules/webhooks/app/controllers/webhooks/incoming/hooks_controller.rb index 208399b7d3fb..f1ef5786a891 100644 --- a/modules/webhooks/app/controllers/webhooks/incoming/hooks_controller.rb +++ b/modules/webhooks/app/controllers/webhooks/incoming/hooks_controller.rb @@ -35,6 +35,9 @@ class HooksController < ApplicationController # Disable CSRF detection since we openly welcome POSTs here! skip_before_action :verify_authenticity_token + # Authorization cannot be applied since authentication is skipped. + # It is then to be ensured when handling the hook. + no_authorization_required! only: [:handle_hook] # Wrap the JSON body as 'payload' param # making it available as params[:payload] diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb index 1445e4aa56d6..0d39fe54a3ff 100644 --- a/spec/controllers/application_controller_spec.rb +++ b/spec/controllers/application_controller_spec.rb @@ -33,6 +33,8 @@ # Fake controller to test calling an action controller do + no_authorization_required! + def index # just do anything that doesn't require an extra template redirect_to root_path @@ -152,6 +154,8 @@ def index controller do include OpenProjectErrorHelper + no_authorization_required! + def index op_handle_error "fail" From 9ad5b32e45c856550290deb0396a766c61a1a6b3 Mon Sep 17 00:00:00 2001 From: ulferts Date: Fri, 7 Jun 2024 16:56:41 +0200 Subject: [PATCH 046/325] fix typos --- app/controllers/application_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 41584ef4d6fa..99b472d83644 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -222,8 +222,8 @@ def reset_i18n_fallbacks end def set_localization - # 1. Use completely autheticated user - # 2. Use user with some authenticated stages not compelted. + # 1. Use completely authenticated user + # 2. Use user with some authenticated stages not completed. # In this case user is not considered logged in, but identified. # It covers localization for extra authentication stages(like :consent, for example) # 3. Use anonymous instance. From d3e81b257b578397c08303c0e7cd4747bc908043 Mon Sep 17 00:00:00 2001 From: ulferts Date: Fri, 7 Jun 2024 16:57:27 +0200 Subject: [PATCH 047/325] remove methods rendered superfluous by using default auth methods --- app/controllers/application_controller.rb | 17 ----------------- app/controllers/news_controller.rb | 9 --------- app/controllers/projects_controller.rb | 9 --------- app/controllers/search_controller.rb | 9 --------- .../app/controllers/budgets_controller.rb | 6 ------ .../costs/app/controllers/costlog_controller.rb | 16 ---------------- 6 files changed, 66 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 99b472d83644..a6d29d50bda2 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -458,23 +458,6 @@ def find_work_packages render_404 end - # Make sure that the user is a member of the project (or admin) if project is private - # used as a before_action for actions that do not require any particular permission - # on the project. - def check_project_privacy - if @project && @project.active? - if @project.public? || User.current.member_of?(@project) || User.current.admin? - true - else - User.current.logged? ? render_403 : require_login - end - else - @project = nil - render_404 - false - end - end - def back_url params[:back_url] || request.env["HTTP_REFERER"] end diff --git a/app/controllers/news_controller.rb b/app/controllers/news_controller.rb index 3455f2d1324f..a124aac47151 100644 --- a/app/controllers/news_controller.rb +++ b/app/controllers/news_controller.rb @@ -112,13 +112,4 @@ def find_project rescue ActiveRecord::RecordNotFound render_404 end - - def find_optional_project - return true unless params[:project_id] - - @project = Project.find(params[:project_id]) - authorize - rescue ActiveRecord::RecordNotFound - render_404 - end end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 3d09898e072f..04503237f791 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -104,15 +104,6 @@ def has_managed_project_folders?(project) project.project_storages.any?(&:project_folder_automatic?) end - def find_optional_project - return true unless params[:id] - - @project = Project.find(params[:id]) - authorize - rescue ActiveRecord::RecordNotFound - render_404 - end - def hide_project_in_layout @project = nil end diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index 2b526534d47a..a4b26fde274d 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -62,15 +62,6 @@ def prepare_tokens end end - def find_optional_project - return true unless params[:project_id] - - @project = Project.find(params[:project_id]) - check_project_privacy - rescue ActiveRecord::RecordNotFound - render_404 - end - def limit_results_first_page @pagination_previous_date = @results[0].event_datetime if offset && @results[0] diff --git a/modules/budgets/app/controllers/budgets_controller.rb b/modules/budgets/app/controllers/budgets_controller.rb index a6edf12954f9..2f2ee53bffc0 100644 --- a/modules/budgets/app/controllers/budgets_controller.rb +++ b/modules/budgets/app/controllers/budgets_controller.rb @@ -219,12 +219,6 @@ def find_budgets render_404 end - def find_project - @project = Project.find(params[:project_id]) - rescue ActiveRecord::RecordNotFound - render_404 - end - def find_optional_project @project = Project.find(params[:project_id]) if params[:project_id].present? rescue ActiveRecord::RecordNotFound diff --git a/modules/costs/app/controllers/costlog_controller.rb b/modules/costs/app/controllers/costlog_controller.rb index a1d5e792271d..f4c3bc6eba11 100644 --- a/modules/costs/app/controllers/costlog_controller.rb +++ b/modules/costs/app/controllers/costlog_controller.rb @@ -115,22 +115,6 @@ def find_project render_404 end - def find_optional_project - if params[:work_package_id].present? - @work_package = WorkPackage.find(params[:work_package_id]) - @project = @work_package.project - elsif params[:work_package_id].present? - @work_package = WorkPackage.find(params[:work_package_id]) - @project = @work_package.project - elsif params[:project_id].present? - @project = Project.find(params[:project_id]) - end - - if params[:cost_type_id].present? - @cost_type = CostType.find(params[:cost_type_id]) - end - end - def find_associated_objects user_id = cost_entry_params.delete(:user_id) @user = if @cost_entry.present? && @cost_entry.user_id == user_id From 0d78c3a2799b4217e1ddcdcefae5fa9667b3825a Mon Sep 17 00:00:00 2001 From: ulferts Date: Fri, 7 Jun 2024 17:01:30 +0200 Subject: [PATCH 048/325] move methods into private scope unless actions --- app/controllers/account_controller.rb | 92 ++++++++++++++------------- 1 file changed, 48 insertions(+), 44 deletions(-) diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb index ebb0b2959512..12e7243cb5d2 100644 --- a/app/controllers/account_controller.rb +++ b/app/controllers/account_controller.rb @@ -146,20 +146,6 @@ def register end end - def allow_registration? - allow = Setting::SelfRegistration.enabled? && !OpenProject::Configuration.disable_password_login? - - invited = session[:invitation_token].present? - get = request.get? && allow - post = (request.post? || request.patch?) && (session[:auth_source_registration] || allow) - - invited || get || post - end - - def allow_lost_password_recovery? - Setting.lost_password? && !OpenProject::Configuration.disable_password_login? - end - # Token based account activation def activate token = ::Token::Invitation.find_by_plaintext_value(params[:token]) @@ -177,6 +163,36 @@ def activate end end + # Process a password change form, used when the user is forced + # to change the password. + # When making changes here, also check MyController.change_password + def change_password + # Retrieve user_id from session + @user = User.find(params[:password_change_user_id]) + + change_password_flow(user: @user, params:, show_user_name: true) do + password_authentication(@user.login, params[:new_password]) + end + rescue ActiveRecord::RecordNotFound + Rails.logger.error "Failed to find user for change_password request: #{flash[:_password_change_user_id]}" + render_404 + end + + def auth_source_sso_failed + failure = session.delete :auth_source_sso_failure + user = auth_source_sso_failure_user(failure) + + if user.try(:new_record?) + return onthefly_creation_failed user, login: user.login, ldap_auth_source_id: user.ldap_auth_source_id + end + + show_sso_error_for(user, failure) + + render action: "login", back_url: failure[:back_url] + end + + private + def handle_expired_token(token) send_activation_email! token.user @@ -255,50 +271,32 @@ def activate_through_ldap(user) redirect_to signin_path(username: user.login) end - # Process a password change form, used when the user is forced - # to change the password. - # When making changes here, also check MyController.change_password - def change_password - # Retrieve user_id from session - @user = User.find(params[:password_change_user_id]) - - change_password_flow(user: @user, params:, show_user_name: true) do - password_authentication(@user.login, params[:new_password]) - end - rescue ActiveRecord::RecordNotFound - Rails.logger.error "Failed to find user for change_password request: #{flash[:_password_change_user_id]}" - render_404 - end - - def auth_source_sso_failed - failure = session.delete :auth_source_sso_failure - login = failure[:login] - user = find_user_from_auth_source(login) || build_user_from_auth_source(login) - - if user.try(:new_record?) - return onthefly_creation_failed user, login: user.login, ldap_auth_source_id: user.ldap_auth_source_id - end - - show_sso_error_for user + def allow_registration? + allow = Setting::SelfRegistration.enabled? && !OpenProject::Configuration.disable_password_login? - flash.now[:error] = I18n.t(:error_auth_source_sso_failed, value: failure[:login]) + - ": " + String(flash.now[:error]) + invited = session[:invitation_token].present? + get = request.get? && allow + post = (request.post? || request.patch?) && (session[:auth_source_registration] || allow) - render action: "login", back_url: failure[:back_url] + invited || get || post end - private + def allow_lost_password_recovery? + Setting.lost_password? && !OpenProject::Configuration.disable_password_login? + end def check_auth_source_sso_failure redirect_to home_url unless session[:auth_source_sso_failure].present? end - def show_sso_error_for(user) + def show_sso_error_for(user, failure) if user.nil? flash_and_log_invalid_credentials elsif not user.active? account_inactive user, flash_now: true end + + flash.now[:error] = "#{I18n.t(:error_auth_source_sso_failed, value: failure[:login])}: #{String(flash.now[:error])}" end def registration_through_invitation! @@ -536,4 +534,10 @@ def apply_csp_appends def check_internal_login_enabled render_404 unless omniauth_direct_login? end + + def auth_source_sso_failure_user(failure) + login = failure[:login] + + find_user_from_auth_source(login) || build_user_from_auth_source(login) + end end From 65b3ca217533ce0701c8592ac2a61296630cbb70 Mon Sep 17 00:00:00 2001 From: ulferts Date: Fri, 7 Jun 2024 17:02:56 +0200 Subject: [PATCH 049/325] remove authorize methods not used --- app/controllers/application_controller.rb | 66 ----------------------- 1 file changed, 66 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index a6d29d50bda2..605e6a9143f1 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -241,77 +241,15 @@ def deny_access(not_found: false) end end - def authorize_in_project(ctrl = params[:controller], action = params[:action]) - authorization_project = @project || @projects - allowed = User.current.allowed_in_project?({ controller: ctrl, action: }, authorization_project) - - unless allowed - if @project&.archived? - render_403 message: :notice_not_authorized_archived_project - else - deny_access - end - end - - allowed - end - - def authorize_globally(ctrl = params[:controller], action = params[:action]) - allowed = User.current.allowed_globally?({ controller: ctrl, action: }) - - deny_access unless allowed - - allowed - end - - def authorize_in_any_project(ctrl = params[:controller], action = params[:action]) - allowed = User.current.allowed_in_any_project?({ controller: ctrl, action: }) - - deny_access unless allowed - - allowed - end - - def authorize_in_model(ctrl = params[:controller], action = params[:action]) - model = instance_variable_get(:"@#{model_object.to_s.underscore}") - - allowed = User.current.allowed_in_entity?({ controller: ctrl, action: }, model, model_object) - - unless allowed - if model.respond_to?(:project) && model.project&.archived? - render_403 message: :notice_not_authorized_archived_project - else - deny_access - end - end - - allowed - end - - def authorize_in_any_model(ctrl = params[:controller], action = params[:action]) - allowed = if @project - User.current.allowed_in_any_entity?({ controller: ctrl, action: }, model_object, in_project: @project) - else - User.current.allowed_in_any_entity?({ controller: ctrl, action: }, model_object) - end - - deny_access unless allowed - - allowed - end - # Authorize the user for the requested controller action. # To be used in before_action hooks def authorize(ctrl = params[:controller], action = params[:action]) - # OpenProject::Deprecation.deprecate_method(ApplicationController, :authorize) do_authorize({ controller: ctrl, action: }, global: false) end # Authorize the user for the requested controller action outside a project # To be used in before_action hooks def authorize_global - # OpenProject::Deprecation.deprecate_method(ApplicationController, :authorize_global) - action = { controller: params[:controller], action: params[:action] } do_authorize(action, global: true) end @@ -322,10 +260,6 @@ def authorize_global # * a parameter-like Hash (eg. { controller: '/projects', action: 'edit' }) # * a permission Symbol (eg. :edit_project) def do_authorize(action, global: false) # rubocop:disable Metrics/PerceivedComplexity - # OpenProject::Deprecation.deprecate_method(ApplicationController, :do_authorize) - # context = @project || @projects - # old_authorized = User.current.allowed_to?(action, context, global:) - is_authorized = if global User.current.allowed_based_on_permission_context?(action) else From 8d3b7779417bd991879b71f5829fc5adc7bf54a2 Mon Sep 17 00:00:00 2001 From: ulferts Date: Fri, 7 Jun 2024 17:11:55 +0200 Subject: [PATCH 050/325] move authorization methods into module --- app/controllers/application_controller.rb | 46 --------------- .../concerns/accounts/authorization.rb | 58 +++++++++++++++++-- 2 files changed, 52 insertions(+), 52 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 605e6a9143f1..3310a9db8495 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -241,42 +241,6 @@ def deny_access(not_found: false) end end - # Authorize the user for the requested controller action. - # To be used in before_action hooks - def authorize(ctrl = params[:controller], action = params[:action]) - do_authorize({ controller: ctrl, action: }, global: false) - end - - # Authorize the user for the requested controller action outside a project - # To be used in before_action hooks - def authorize_global - action = { controller: params[:controller], action: params[:action] } - do_authorize(action, global: true) - end - - # Deny access if user is not allowed to do the specified action. - # - # Action can be: - # * a parameter-like Hash (eg. { controller: '/projects', action: 'edit' }) - # * a permission Symbol (eg. :edit_project) - def do_authorize(action, global: false) # rubocop:disable Metrics/PerceivedComplexity - is_authorized = if global - User.current.allowed_based_on_permission_context?(action) - else - User.current.allowed_based_on_permission_context?(action, project: @project || @projects, - entity: @work_package || @work_packages) - end - - unless is_authorized - if @project&.archived? - render_403 message: :notice_not_authorized_archived_project - else - deny_access - end - end - is_authorized - end - # Find project of id params[:id] # Note: find() is Project.friendly.find() def find_project @@ -293,16 +257,6 @@ def find_project_by_project_id render_404 end - # Find a project based on params[:project_id] - # TODO: some subclasses override this, see about merging their logic - def authorize_in_optional_project - @project = Project.find(params[:project_id]) if params[:project_id].present? - - do_authorize({ controller: params[:controller], action: params[:action] }, global: params[:project_id].blank?) - rescue ActiveRecord::RecordNotFound - render_404 - end - # Finds and sets @project based on @object.project def find_project_from_association render_404 if @object.blank? diff --git a/app/controllers/concerns/accounts/authorization.rb b/app/controllers/concerns/accounts/authorization.rb index cfed68a66b28..7c7ffddabb42 100644 --- a/app/controllers/concerns/accounts/authorization.rb +++ b/app/controllers/concerns/accounts/authorization.rb @@ -43,11 +43,7 @@ module Accounts::Authorization } end - def require_admin - return unless require_login - - render_403 unless current_user.admin? - end + private def authorization_check_required unless authorization_is_ensured?(params[:action]) @@ -66,7 +62,57 @@ def authorization_check_required end end - private + # Authorize the user for the requested controller action. + # To be used in before_action hooks + def authorize(ctrl = params[:controller], action = params[:action]) + do_authorize({ controller: ctrl, action: }, global: false) + end + + # Authorize the user for the requested controller action outside a project + # To be used in before_action hooks + def authorize_global + action = { controller: params[:controller], action: params[:action] } + do_authorize(action, global: true) + end + + # Find a project based on params[:project_id] + def authorize_in_optional_project + @project = Project.find(params[:project_id]) if params[:project_id].present? + + do_authorize({ controller: params[:controller], action: params[:action] }, global: params[:project_id].blank?) + rescue ActiveRecord::RecordNotFound + render_404 + end + + # Deny access if user is not allowed to do the specified action. + # + # Action can be: + # * a parameter-like Hash (eg. { controller: '/projects', action: 'edit' }) + # * a permission Symbol (eg. :edit_project) + def do_authorize(action, global: false) # rubocop:disable Metrics/PerceivedComplexity + is_authorized = if global + User.current.allowed_based_on_permission_context?(action) + else + User.current.allowed_based_on_permission_context?(action, + project: @project || @projects, + entity: @work_package || @work_packages) + end + + unless is_authorized + if @project&.archived? + render_403 message: :notice_not_authorized_archived_project + else + deny_access + end + end + is_authorized + end + + def require_admin + return unless require_login + + render_403 unless current_user.admin? + end def authorization_is_ensured?(action) return false if authorization_ensured.nil? From aed7bb49f1bd848c22623322325702105d36ce0c Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Sat, 8 Jun 2024 03:07:04 +0000 Subject: [PATCH 051/325] update locales from crowdin [ci skip] --- config/locales/crowdin/cs.yml | 54 +++++++++---------- config/locales/crowdin/de.yml | 26 ++++----- config/locales/crowdin/id.yml | 2 +- config/locales/crowdin/it.yml | 14 ++--- config/locales/crowdin/js-ca.yml | 4 +- config/locales/crowdin/js-id.yml | 2 +- config/locales/crowdin/js-ms.yml | 6 +-- config/locales/crowdin/js-no.yml | 2 +- config/locales/crowdin/js-ru.yml | 2 +- config/locales/crowdin/js-vi.yml | 2 +- config/locales/crowdin/ms.yml | 54 +++++++++---------- config/locales/crowdin/pl.yml | 2 +- config/locales/crowdin/ru.yml | 2 +- config/locales/crowdin/sl.yml | 4 +- config/locales/crowdin/tr.yml | 2 +- config/locales/crowdin/uk.yml | 2 +- config/locales/crowdin/zh-CN.seeders.yml | 4 +- config/locales/crowdin/zh-CN.yml | 10 ++-- config/locales/crowdin/zh-TW.yml | 6 +-- .../avatars/config/locales/crowdin/js-ms.yml | 2 +- .../backlogs/config/locales/crowdin/ms.yml | 12 ++--- .../backlogs/config/locales/crowdin/zh-TW.yml | 2 +- modules/bim/config/locales/crowdin/fr.yml | 2 +- .../bim/config/locales/crowdin/ms.seeders.yml | 4 +- modules/bim/config/locales/crowdin/ms.yml | 2 +- .../boards/config/locales/crowdin/js-ms.yml | 6 +-- modules/budgets/config/locales/crowdin/cs.yml | 2 +- .../config/locales/crowdin/js-ms.yml | 2 +- .../config/locales/crowdin/zh-CN.yml | 2 +- .../config/locales/crowdin/zh-TW.yml | 2 +- modules/meeting/config/locales/crowdin/cs.yml | 4 +- .../meeting/config/locales/crowdin/zh-TW.yml | 2 +- .../config/locales/crowdin/zh-TW.yml | 2 +- .../config/locales/crowdin/ru.yml | 2 +- .../config/locales/crowdin/uk.yml | 2 +- .../config/locales/crowdin/zh-CN.yml | 2 +- 36 files changed, 126 insertions(+), 126 deletions(-) diff --git a/config/locales/crowdin/cs.yml b/config/locales/crowdin/cs.yml index f2c7d3743abb..3f6777b3a89c 100644 --- a/config/locales/crowdin/cs.yml +++ b/config/locales/crowdin/cs.yml @@ -447,7 +447,7 @@ cs: irreversible: "Tato akce je nevratná" confirmation: "Zadejte název zástupného uživatele %{name} pro potvrzení odstranění." upsale: - title: Placeholder uživatel + title: placeholder uživatel description: > Placeholder uživatelé jsou způsob, jak přiřadit pracovní balíčky uživatelům, kteří nejsou součástí vašeho projektu. Mohou být užiteční v řadě scénářů; například, pokud potřebujete sledovat úkoly u zdroje, který ještě nejsou pojmenovány nebo dostupné, nebo pokud nechcete této osobě umožnit přístup k OpenProject ale stále chcete sledovat úkoly, které jim byly přiděleny. prioritiies: @@ -662,7 +662,7 @@ cs: false: "archivováno" identifier: "Identifikátor" latest_activity_at: "Poslední aktivita" - parent: "Nadřazený projekt" + parent: "Podprojekt" public_value: title: "Viditelnost" true: "veřejný" @@ -759,7 +759,7 @@ cs: true: "zahrnuje nepracovní dny" notify: "Oznámit" #used in custom actions parent: "Nadřazený" - parent_issue: "Nadřazený" + parent_issue: "Rodič" parent_work_package: "Nadřazený" priority: "Priorita" progress: "% Dokončeno" @@ -897,7 +897,7 @@ cs: blank: "je povinné. Zvolte prosím název." not_unique: " už bylo použito. Prosím vyberte jiný název." notifications: - at_least_one_channel: "Pro odesílání notifikací musí být specifikován alespoň jeden kanál" + at_least_one_channel: "Alespoň jeden kanál pro odesílání oznámení musí být specifikován." attributes: read_ian: read_on_creation: "nelze nastavit na pravdivé při vytváření oznámení " @@ -1134,11 +1134,11 @@ cs: member: "Člen" news: "Novinky" notification: - one: "Notifikace" - few: "Notifikací" - many: "Notifikací" - other: "Notifikace" - placeholder_user: "Placeholder uživatel" + one: "Oznámení" + few: "Oznámení" + many: "Oznámení" + other: "Oznámení" + placeholder_user: "placeholder uživatel" project: "Projekt" query: "Vlastní dotaz" role: @@ -1779,7 +1779,7 @@ cs: instructions_after_error: "Zkuste se znovu přihlásit kliknutím na %{signin}. Pokud chyba přetrvává, požádejte správce o pomoc." menus: admin: - mail_notification: "E-mailové notifikace" + mail_notification: "E-mailová upozornění" mails_and_notifications: "E-maily a oznámení" aggregation: "Agregace" api_and_webhooks: "API & Webhooky" @@ -1826,7 +1826,7 @@ cs: failed: "Došlo k chybě a token nemohl být odstraněn. Opakujte akci později." unknown_storage: "Neznámé úložiště" notifications: - send_notifications: "Pro tuto akci odeslat notifikaci" + send_notifications: "Odeslat oznámení pro tuto akci" work_packages: subject: created: "Pracovní balíček byl vytvořen." @@ -2210,9 +2210,9 @@ cs: label_permissions: "Práva" label_permissions_report: "Přehled oprávnění" label_personalize_page: "Přizpůsobit tuto stránku" - label_placeholder_user: "Placeholder uživatel" + label_placeholder_user: "placeholder uživatel" label_placeholder_user_new: "" - label_placeholder_user_plural: "Placeholder uživatelé" + label_placeholder_user_plural: "placeholder uživatelé" label_planning: "Plánování" label_please_login: "Přihlaste se prosím" label_plugins: "Pluginy" @@ -2233,7 +2233,7 @@ cs: label_project_attribute_plural: "Atributy projektu" label_project_attribute_manage_link: "Správa atributů produktu" label_project_count: "Celkový počet projektů" - label_project_copy_notifications: "Během kopírování projektu odeslat notifikace e-mailem" + label_project_copy_notifications: "Během kopie projektu odeslat oznámení e-mailem" label_project_latest: "Nejnovější projekty" label_project_default_type: "Povolit prázdný typ" label_project_hierarchy: "Hierarchie projektu" @@ -2371,7 +2371,7 @@ cs: label_users_settings: "Uživatelská nastavení" label_version_new: "Nová verze" label_version_plural: "Verze" - label_version_sharing_descendants: "S podprojekty" + label_version_sharing_descendants: "S Podprojekty" label_version_sharing_hierarchy: "S hierarchií projektu" label_version_sharing_none: "Není sdíleno" label_version_sharing_system: "Se všemi projekty" @@ -2475,28 +2475,28 @@ cs: digests: including_mention_singular: "včetně zmínky" including_mention_plural: "včetně %{number_mentioned} zmínění" - unread_notification_singular: "1 nepřečtená notifikace" - unread_notification_plural: "%{number_unread} nepřečtených notifikací" + unread_notification_singular: "1 nepřečtené oznámení" + unread_notification_plural: "%{number_unread} nepřečtených oznámení" you_have: "Máte" logo_alt_text: "Logo" mention: subject: "%{user_name} vás zmínil v #%{id} - %{subject}" notification: - center: "Centrum notifikací" + center: "Centrum oznámení" see_in_center: "Zobrazit komentář v oznamovacím centru" settings: "Změnit nastavení e-mailu" salutation: "Ahoj %{user}!" salutation_full_name: "Jméno a příjmení" work_packages: created_at: "Vytvořeno v %{timestamp} uživatelem %{user} " - login_to_see_all: "Přihlaste se pro zobrazení všech notifikací." + login_to_see_all: "Přihlaste se pro zobrazení všech oznámení." mentioned: "Byli jste zmíněni v komentáři" mentioned_by: "%{user} vás zmínil v komentáři" more_to_see: - one: "Existuje ještě 1 pracovní balíček s notifikací." - few: "Existuje ještě %{count} pracovních balíčků s notifikacema." - many: "Existuje ještě %{count} pracovních balíčků s notifikacema." - other: "Existuje ještě %{count} pracovních balíčků s notifikacema." + one: "Existuje ještě 1 pracovní balíček s oznámeními." + few: "Existuje ještě %{count} pracovních balíčků s oznámeními." + many: "Existuje ještě %{count} pracovních balíčků s oznámeními." + other: "Existuje ještě %{count} pracovních balíčků s oznámeními." open_in_browser: "Otevřít v prohlížeči" reason: watched: "Sledováno" @@ -2505,7 +2505,7 @@ cs: mentioned: "Zmíněné" shared: "Sdílené" subscribed: "vše" - prefix: "Obdrženo z důvodu nastavení notifikací: %{reason}" + prefix: "Obdrženo z důvodu nastavení oznámení: %{reason}" date_alert_start_date: "Upozornění na datum" date_alert_due_date: "Upozornění na datum" see_all: "Zobrazit vše" @@ -2777,7 +2777,7 @@ cs: permission_move_work_packages: "Přesun pracovních balíčků" permission_protect_wiki_pages: "Ochrana stránky wiki" permission_rename_wiki_pages: "Přejmenovat stránky wiki" - permission_save_queries: "Uložit zobrazení" + permission_save_queries: "Uložit pohled" permission_search_project: "Hledat projekt" permission_select_custom_fields: "Vybrat vlastní pole" permission_select_project_custom_fields: "Select project attributes" @@ -3153,7 +3153,7 @@ cs: enable_subscriptions_text_html: Umožňuje uživatelům s nezbytnými oprávněními přihlásit se do OpenProject kalendářů a získat přístup k informacím o pracovním balíčku prostřednictvím externího klienta kalendáře. Poznámka: Před povolením si prosím přečtěte iCalendar předplatné. language_name_being_default: "%{language_name} (výchozí)" notifications: - events_explanation: "Určuje, pro kterou událost je odeslán e-mail. Pracovní balíčky jsou z tohoto seznamu vyloučeny, protože notifikace pro ně mohou být nastavena speciálně pro každého uživatele." + events_explanation: "Určuje, pro kterou událost je odeslán e-mail. Pracovní balíčky jsou z tohoto seznamu vyloučeny, protože oznámení pro ně mohou být nastavena speciálně pro každého uživatele." delay_minutes_explanation: "Odesílání e-mailu může být pozdrženo, aby bylo uživatelům s nakonfigurovaným v oznámení aplikace před odesláním pošty potvrzeno oznámení. Uživatelé, kteří si přečtou oznámení v aplikaci, nedostanou e-mail pro již přečtené oznámení." other: "Ostatní" passwords: "Hesla" @@ -3238,7 +3238,7 @@ cs: text_destroy_with_associated: "Existují další objekty, které jsou přiřazeny k pracovním balíčkům a které mají být odstraněny. Tyto objekty jsou následující typy:" text_destroy_what_to_do: "Co chcete udělat?" text_diff_truncated: "... Toto rozlišení bylo zkráceno, protože přesahuje maximální velikost, kterou lze zobrazit." - text_email_delivery_not_configured: "Doručení e-mailu není nakonfigurováno a notifikace jsou zakázány.\nNakonfigurujte váš SMTP server pro jejich povolení." + text_email_delivery_not_configured: "Doručení e-mailu není nakonfigurováno a oznámení jsou zakázána.\nNakonfigurujte váš SMTP server pro jejich povolení." text_enumeration_category_reassign_to: "Přiřadit je k této hodnotě:" text_enumeration_destroy_question: "%{count} objektů je přiřazeno k této hodnotě." text_file_repository_writable: "Do adresáře příloh lze zapisovat" diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index 513b640b78d0..fafc40925c65 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -48,7 +48,7 @@ de: main-menu-border-color: "Rahmenfarbe des Hauptmenüs" custom_colors: "Benutzerdefinierte Farben" customize: "Passen Sie Ihre OpenProject Installation mit Ihrem eigenen Logo und eigenen Farben an." - enterprise_notice: "Dieses kleine Add-on steht den Abonnenten der Enterprise-Edition ganz exklusiv als kleines Dankeschön für deren finanzielle Unterstützung zur Verfügung." + enterprise_notice: "Diese kleine Erweiterung steht den Abonnenten der Enterprise edition ganz exklusiv als kleines Dankeschön für deren finanzielle Unterstützung zur Verfügung." enterprise_more_info: "Hinweis: Das verwendete Logo wird öffentlich zugänglich sein." manage_colors: "Farbauswahloptionen bearbeiten" instructions: @@ -61,15 +61,15 @@ de: main-menu-bg-color: "Hintergrundfarbe des Menüs in der linken Seitenleiste." theme_warning: Das Ändern des Themes wird Ihr benutzerdefiniertes Design überschreiben. Alle Änderungen werden dann verloren gehen. Sind Sie sicher, dass Sie fortfahren möchten? enterprise: - upgrade_to_ee: "Auf Enterprise-Edition upgraden" - add_token: "Enterprise-Edition Support Token hochladen" + upgrade_to_ee: "Auf Enterprise edition upgraden" + add_token: "Enterprise edition Support Token hochladen" delete_token_modal: - text: "Sind Sie sicher, dass Sie das aktuelle Enterprise Edition-Token entfernen möchten?" + text: "Sind Sie sicher, dass Sie das aktuelle Enterprise edition token entfernen möchten?" title: "Token löschen" replace_token: "Aktuellen Enterprise edition Support Token ersetzen" order: "Enterprise on-premises bestellen" - paste: "Enterprise-Edition Support Token hier einfügen" - required_for_feature: "Dieses Add-on ist nur mit einem aktiven Enterprise-Edition Support-Token verfügbar." + paste: "Enterprise edition Support Token hier einfügen" + required_for_feature: "Dieses Add-on ist nur mit einem aktiven Enterprise edition Support-Token verfügbar." enterprise_link: "Klicken Sie hier für weitere Informationen." start_trial: "Kostenlose Testversion starten" book_now: "Jetzt buchen" @@ -1548,7 +1548,7 @@ de: error_cookie_missing: "Das OpenProject Cookie fehlt. Bitte stellen Sie sicher, dass Cookies aktiviert sind, da diese Applikation ohne aktivierte Cookies nicht korrekt funktioniert." error_custom_option_not_found: "Option ist nicht vorhanden." error_enterprise_activation_user_limit: "Ihr Konto konnte nicht aktiviert werden (Nutzerlimit erreicht). Bitte kontaktieren Sie Ihren Administrator um Zugriff zu erhalten." - error_enterprise_token_invalid_domain: "Die Enterprise-Edition ist nicht aktiv. Die aktuelle Domain (%{actual}) entspricht nicht dem erwarteten Hostnamen (%{expected})." + error_enterprise_token_invalid_domain: "Die Enterprise edition ist nicht aktiv. Die aktuelle Domain (%{actual}) entspricht nicht dem erwarteten Hostnamen (%{expected})." error_failed_to_delete_entry: "Fehler beim Löschen dieses Eintrags." error_in_dependent: "Fehler beim Versuch, abhängiges Objekt zu ändern: %{dependent_class} #%{related_id} - %{related_subject}: %{error}" error_in_new_dependent: "Fehler beim Versuch, abhängiges Objekt zu erstellen: %{dependent_class} - %{related_subject}: %{error}" @@ -1650,10 +1650,10 @@ de: blocks: community: "OpenProject Community" upsale: - title: "Auf Enterprise-Edition upgraden" + title: "Auf Enterprise edition upgraden" more_info: "Weitere Informationen" links: - upgrade_enterprise_edition: "Auf Enterprise-Edition upgraden" + upgrade_enterprise_edition: "Auf Enterprise edition upgraden" postgres_migration: "Migration Ihrer Installation zu PostgreSQL" user_guides: "Benutzerhandbuch" faq: "Häufig gestellte Fragen" @@ -1941,7 +1941,7 @@ de: label_enumerations: "Aufzählungen" label_enterprise: "Enterprise" label_enterprise_active_users: "%{current}/%{limit} gebuchte aktive Nutzer" - label_enterprise_edition: "Enterprise Edition" + label_enterprise_edition: "Enterprise edition" label_enterprise_support: "Enterprise Support" label_enterprise_addon: "Enterprise Add-on" label_environment: "Umgebung" @@ -2868,8 +2868,8 @@ de: update_timeout: "Speichere die Informationen bzgl. des genutzten Festplattenspeichers eines Projektarchivs für N Minuten.\nErhöhen Sie diesen Wert zur Verbesserung der Performance, da die Erfassung des genutzten Festplattenspeichers Ressourcen-intensiv ist." oauth_application_details: "Der Client Geheimcode wird nach dem Schließen dieses Fensters nicht mehr zugänglich sein. Bitte kopieren Sie diese Werte in die Nextcloud OpenProject Integrationseinstellungen:" oauth_application_details_link_text: "Zu den Einstellungen gehen" - setup_documentation_details: "Wenn Sie Hilfe bei der Konfiguration eines neuen Dateispeichers benötigen, konsultieren Sie bitte die Dokumentation: " - setup_documentation_details_link_text: "Dateispeicher einrichten" + setup_documentation_details: "Wenn Sie Hilfe bei der Konfiguration eines neuen Datei-Speichers benötigen, konsultieren Sie bitte die Dokumentation: " + setup_documentation_details_link_text: "Datei-Speicher einrichten" show_warning_details: "Um diesen Dateispeicher nutzen zu können, müssen Sie das Modul und den spezifischen Speicher in den Projekteinstellungen jedes gewünschten Projekts aktivieren." subversion: existing_title: "Vorhandenes Subversion Projektarchiv" @@ -3329,7 +3329,7 @@ de: warning_user_limit_reached_admin: > Das Hinzufügen zusätzlicher Benutzer überschreitet das aktuelle Benutzerlimit. Bitte aktualisieren Sie Ihr Abonnement um sicherzustellen, dass externe Benutzer auf diese Instanz zugreifen können. warning_user_limit_reached_instructions: > - Du hast dein Nutzerlimit erreicht (%{current}/%{max} active users). Bitte kontaktiere sales@openproject.com um deinen Enterprise Edition Plan upzugraden und weitere Nutzer hinzuzufügen. + Du hast dein Nutzerlimit erreicht (%{current}/%{max} active users). Bitte kontaktiere sales@openproject.com um deinen Enterprise edition Plan upzugraden und weitere Nutzer hinzuzufügen. warning_protocol_mismatch_html: > warning_bar: diff --git a/config/locales/crowdin/id.yml b/config/locales/crowdin/id.yml index 5e70e53c260a..9b3a3d8f3543 100644 --- a/config/locales/crowdin/id.yml +++ b/config/locales/crowdin/id.yml @@ -1932,7 +1932,7 @@ id: label_file_plural: "File" label_filter_add: "Tambah Filter" label_filter: "Filter" - label_filter_plural: "Penyaring" + label_filter_plural: "Filter" label_filters_toggle: "Tampilkan/Sembunyikan penyaringan" label_float: "Float" label_folder: "Folder" diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml index b5477e26a781..e13896b676fe 100644 --- a/config/locales/crowdin/it.yml +++ b/config/locales/crowdin/it.yml @@ -64,11 +64,11 @@ it: upgrade_to_ee: "Aggiorna a Enterprise edition" add_token: "Carica un token di assistenza per Enterprise edition" delete_token_modal: - text: "Vuoi davvero rimuovere il token Enterprise Edition attualmente utilizzato?" + text: "Vuoi davvero rimuovere il token Enterprise edition attualmente utilizzato?" title: "Elimina token" replace_token: "Sostituisci il token di assistenza attuale" order: "Ordina l'edizione Enterprise on-premises" - paste: "Incolla il tuo token di assistenza per Enterprise Edition" + paste: "Incolla il tuo token di assistenza per Enterprise edition" required_for_feature: "Questa aggiunta è disponibile solo con un token di assistenza Enterprise Edition attivo." enterprise_link: "Per ulteriori informazioni, clicca qui." start_trial: "Inizia la prova gratuita" @@ -781,7 +781,7 @@ it: confirmation: "non coincide con %{attribute}." could_not_be_copied: "%{dependency} non può essere (completamente) copiato." does_not_exist: "non esiste." - error_enterprise_only: "%{action} è disponibile solo in OpenProject Enterprise Edition" + error_enterprise_only: "%{action} è disponibile solo in OpenProject Enterprise edition" error_unauthorized: "potrebbe non essere accessibile." error_readonly: "è in sola lettura, pertanto non è stato possibile modificarlo." error_conflict: "L'informazione è stata aggiornata da almeno un altro utente nel frattempo." @@ -1550,7 +1550,7 @@ it: error_cookie_missing: "Il cookie di OpenProject è mancante. Prego, verifica che i cookie siano attivati, questa applicazione non funziona correttamente senza." error_custom_option_not_found: "L'opzione non esiste." error_enterprise_activation_user_limit: "Il tuo account potrebbe non essere attivo (raggiunto il limite utente). Si prega di contattare l'amministratore per ottenere l'accesso." - error_enterprise_token_invalid_domain: "L'Enterprise Edition non è attiva. Il dominio del token Enterprise (%{actual}) non corrisponde al nome host del sistema (%{expected})." + error_enterprise_token_invalid_domain: "L'Enterprise edition non è attiva. Il dominio del token Enterprise (%{actual}) non corrisponde al nome host del sistema (%{expected})." error_failed_to_delete_entry: "Cancellazione voce non riuscita." error_in_dependent: "Errore nel tentativo di modificare l'oggetto dipendente: %{dependent_class} #%{related_id} - %{related_subject}: %{error}" error_in_new_dependent: "Errore nel tentativo di creare un oggetto dipendente: %{dependent_class} - %{related_subject}: %{error}" @@ -1652,10 +1652,10 @@ it: blocks: community: "Comunità di OpenProject" upsale: - title: "Aggiorna ad Enterprise Edition" + title: "Aggiorna ad Enterprise edition" more_info: "Altre informazioni" links: - upgrade_enterprise_edition: "Aggiorna ad Enterprise Edition" + upgrade_enterprise_edition: "Aggiorna ad Enterprise edition" postgres_migration: "Migrazione dell'installazione su PostgreSQL" user_guides: "Guide utente" faq: "FAQ" @@ -1943,7 +1943,7 @@ it: label_enumerations: "Enumerazioni" label_enterprise: "Enterprise" label_enterprise_active_users: "%{current}/%{limit} utenti attivi riservati" - label_enterprise_edition: "Enterprise Edition" + label_enterprise_edition: "Enterprise edition" label_enterprise_support: "Supporto per Imprese" label_enterprise_addon: "Componente aggiuntivo Enterprise" label_environment: "Ambiente" diff --git a/config/locales/crowdin/js-ca.yml b/config/locales/crowdin/js-ca.yml index ac149730d13d..08fe1aa5995b 100644 --- a/config/locales/crowdin/js-ca.yml +++ b/config/locales/crowdin/js-ca.yml @@ -102,7 +102,7 @@ ca: button_save: "Desa" button_settings: "Configuració" button_uncheck_all: "Desmarca-ho tot" - button_update: "Actualitzar" + button_update: "Actualitza" button_export-pdf: "Descarregar PDF" button_export-atom: "Descarregar Atom" button_create: "Crear" @@ -776,7 +776,7 @@ ca: label: "Pausa els correu electrònic recordatori temporalment" first_day: "Primer dia" last_day: "Últim dia" - text_are_you_sure: "N'estas segur?" + text_are_you_sure: "N'esteu segur?" text_data_lost: "Totes les dades entrades es perdran." text_user_wrote: "%{value} va escriure:" types: diff --git a/config/locales/crowdin/js-id.yml b/config/locales/crowdin/js-id.yml index 41cfb8fd0906..7d81b5a34434 100644 --- a/config/locales/crowdin/js-id.yml +++ b/config/locales/crowdin/js-id.yml @@ -102,7 +102,7 @@ id: button_save: "Simpan" button_settings: "Pengaturan" button_uncheck_all: "Uncek semua" - button_update: "Perbarui" + button_update: "Update" button_export-pdf: "Download PDF" button_export-atom: "Download Atom" button_create: "Buat baru" diff --git a/config/locales/crowdin/js-ms.yml b/config/locales/crowdin/js-ms.yml index 68b2ec817008..7d3c9a115761 100644 --- a/config/locales/crowdin/js-ms.yml +++ b/config/locales/crowdin/js-ms.yml @@ -102,7 +102,7 @@ ms: button_save: "Simpan" button_settings: "Tetapan" button_uncheck_all: "Nyahtandakan semua" - button_update: "Kemaskini" + button_update: "Kemas kini" button_export-pdf: "Muat turun PDF" button_export-atom: "Muat Turun Atom" button_create: "Cipta" @@ -276,9 +276,9 @@ ms: Adakah anda pasti anda ingin teruskan? work_packages_settings: warning_progress_calculation_mode_change_from_status_to_field_html: >- - Changing progress calculation mode from status-based to work-based will make % Complete a non-editable field whose value is derived from Work and Remaining work. Existing values for % Complete are preserved. If values for Work and Remaining work were not present, they will be required in order to change % Complete. + Mengubah mod pengiraan perkembangan daripada berdasarkan-status kepada berdasarkan-kerja akan menjadikan % Selesai ruang yang tidak boleh diedit yang nilainya diperoleh daripada Kerja dan Kerja yang berbaki. Nilai yang sedia ada bagi % Selesai dikekalkan. Jika nilai Kerja dan Kerja yang berbaki tiada, nilai tersebut akan diperlukan untuk mengubah % Selesai. warning_progress_calculation_mode_change_from_field_to_status_html: >- - Changing progress calculation mode from work-based to status-based will result in all existing % Complete values to be lost and replaced with values associated with each status. Existing values for Remaining work may also be recalculated to reflect this change. This action is not reversible. + Mengubah mod pengiraan perkembangan daripada berasaskan-kerja kepada berasaskan-status akan menjadikan semua nilai % Selesai yang sedia ada hilang dan digantikan dengan nilai yang berkaitan dengan setiap status. Nilai sedia ada bagi Kerja yang berbaki juga akan dikira semula untuk menggambarkan perubahan ini. Tindakan ini tidak boleh dipulihkan. custom_actions: date: specific: "pada" diff --git a/config/locales/crowdin/js-no.yml b/config/locales/crowdin/js-no.yml index ba50f58057cd..40b6ee3607c5 100644 --- a/config/locales/crowdin/js-no.yml +++ b/config/locales/crowdin/js-no.yml @@ -102,7 +102,7 @@ button_save: "Lagre" button_settings: "Innstillinger" button_uncheck_all: "Avmerk alle" - button_update: "Oppdater" + button_update: "Oppdatèr" button_export-pdf: "Last ned PDF" button_export-atom: "Last ned Atom" button_create: "Opprett" diff --git a/config/locales/crowdin/js-ru.yml b/config/locales/crowdin/js-ru.yml index f45f1bf2641c..0e6c5b88673f 100644 --- a/config/locales/crowdin/js-ru.yml +++ b/config/locales/crowdin/js-ru.yml @@ -102,7 +102,7 @@ ru: button_save: "Сохранить" button_settings: "Настройки" button_uncheck_all: "Снять все отметки" - button_update: "Обновить" + button_update: "Обновление" button_export-pdf: "Скачать PDF" button_export-atom: "Скачать Atom" button_create: "Создать" diff --git a/config/locales/crowdin/js-vi.yml b/config/locales/crowdin/js-vi.yml index 0b92f572c55f..e876c63f7e01 100644 --- a/config/locales/crowdin/js-vi.yml +++ b/config/locales/crowdin/js-vi.yml @@ -102,7 +102,7 @@ vi: button_save: "Lưu" button_settings: "Cài đặt" button_uncheck_all: "Bỏ chọn tất cả" - button_update: "Cập nhật" + button_update: "Cập Nhật" button_export-pdf: "Tải PDF" button_export-atom: "Tải về Atom" button_create: "Tạo mới" diff --git a/config/locales/crowdin/ms.yml b/config/locales/crowdin/ms.yml index 74fd5830d96e..1b158857db6a 100644 --- a/config/locales/crowdin/ms.yml +++ b/config/locales/crowdin/ms.yml @@ -300,11 +300,11 @@ ms: heading: Diperlukan dalam semua projek description: Atribut projek ini telah diaktifkan dalam semua projek sejak pilihan "Diperlukan dalam semua projek" telah ditandakan. Ia tidak boleh dinyahaktifkan untuk projek individu. new_project_mapping_form: - add_projects: Add projects - include_sub_projects: Include sub-projects + add_projects: Tambah projek + include_sub_projects: Sertakan sub-projek project_mapping_filter: - label: Search project - placeholder: Filter by text + label: Cari projek + placeholder: Menyaring secara teks types: no_results_title_text: Tiada jenis yang tersedia buat masa ini. form: @@ -966,13 +966,13 @@ ms: working_days_are_missing: "Sekurang-kurangnya sehari dalam seminggu perlu ditentukan sebagai hari bekerja." previous_working_day_changes_unprocessed: "Perubahan terdahulu pada konfigurasi hari bekerja belum dilaksanakan lagi." hours_per_day_are_missing: "Bilangan jam dalam sehari perlu ditentukan." - days_per_week_are_missing: "The number of days per week must be defined." - days_per_month_are_missing: "The number of days per month must be defined." - durations_are_not_positive_numbers: "The durations must be positive numbers." - hours_per_day_is_out_of_bounds: "Hours per day can't be more than 24" - days_per_week_is_out_of_bounds: "Days per week can't be more than 7" - days_per_month_is_out_of_bounds: "Days per month can't be more than 31" - days_per_week_and_days_per_month_are_inconsistent: "The number of days per week and the number of days per month must be consistent." + days_per_week_are_missing: "Bilangan hari setiap minggu mestilah ditakrifkan. " + days_per_month_are_missing: "Bilangan hari sebulan mestilah ditakrifkan." + durations_are_not_positive_numbers: "Jangka masa mestilah nombor positif." + hours_per_day_is_out_of_bounds: "Jam sehari tidak boleh melebihi 24" + days_per_week_is_out_of_bounds: "Hari seminggu tidak boleh melebihi 7" + days_per_month_is_out_of_bounds: "Hari sebulan tidak boleh melebihi 31" + days_per_week_and_days_per_month_are_inconsistent: "Bilangan hari seminggu dan bilangan hari sebulan mestilah konsisten." time_entry: attributes: hours: @@ -1030,7 +1030,7 @@ ms: only_same_project_categories_allowed: "Kategori pakej kerja mesti dalam projek yang sama dengan pakej kerja." does_not_exist: "Kategori yang ditentukan tidak wujud." estimated_hours: - not_a_number: "is not a valid duration." + not_a_number: "bukan jangka masa yang sah." cant_be_inferior_to_remaining_work: "Tidak boleh lebih rendah daripada kerja yang Berbaki." must_be_set_when_remaining_work_is_set: "Diperlukan apabila kerja yang Berbaki ditetapkan." only_values_greater_or_equal_zeroes_allowed: "Perlu >= 0." @@ -1583,11 +1583,11 @@ ms: image: omitted: "Imej tidak dieksport." macro: - error: "Macro error, %{message}" - attribute_not_found: "attribute not found: %{attribute}" - model_not_found: "invalid attribute model: %{model}" - resource_not_found: "resource not found: %{resource}" - rich_text_unsupported: "Rich text embedding currently not supported in export" + error: "Ralat makro,%{message}" + attribute_not_found: "atribut tidak ditemui: %{attribute}" + model_not_found: "model atribut tidak sah: %{model}" + resource_not_found: "sumber tidak ditemui: %{resource}" + rich_text_unsupported: "Penyematan teks kaya tidak disokong bagi eksport buat masa ini" units: hours: j days: h @@ -1658,9 +1658,9 @@ ms: working: "%{date} kini hari bekerja" non_working: "%{date} kini bukan hari bekerja" progress_mode_changed_to_status_based: Mod pengiraan perkembangan ditetapkan kepada berasaskan status - status_excluded_from_totals_set_to_false_message: now included in hierarchy totals - status_excluded_from_totals_set_to_true_message: now excluded from hierarchy totals - status_percent_complete_changed: "% complete changed from %{old_value}% to %{new_value}%" + status_excluded_from_totals_set_to_false_message: kini termasuk dalam jumlah hierarki + status_excluded_from_totals_set_to_true_message: kini dikeluarkan daripada jumlah hierarki + status_percent_complete_changed: "% selesai ditukar daripada %{old_value}% kepada %{new_value}%" system_update: file_links_journal: > Mulai sekarang, aktiviti berkaitan dengan pautan fail (fail-fail yang disimpan di storan luaran) akan muncul dalam tab Aktiviti. Yang berikut mewakili aktiviti berkenaan pautan yang sudah sedia ada: @@ -2317,7 +2317,7 @@ ms: label_workflow: "Aliran kerja" label_workflow_plural: "Aliran kerja" label_workflow_summary: "Ringkasan" - label_working_days_and_hours: "Working days and hours" + label_working_days_and_hours: "Hari dan jam bekerja" label_x_closed_work_packages_abbr: one: "1 ditutup" other: "%{count} ditutup" @@ -2913,9 +2913,9 @@ ms: setting_cross_project_work_package_relations: "Benarkan hubungan pakej kerja rentas projek" setting_first_week_of_year: "Minggu pertama dalam tahun mengandungi " setting_date_format: "Tarikh" - setting_days_per_month: "Days per month" + setting_days_per_month: "Hari sebulan" setting_days_per_month_explanation: >- - This will define what is considered a "month" when displaying duration in a more natural way (for example, if a month is 20 days, 60 days would be 3 months. + Ini akan takrifkan apa yang dianggap sebagai "bulan" apabila memaparkan jangka masa menggunakan cara yang lebih semula jadi (contonya, jika sebulan ialah 20 hari, 60 hari ialah 3 bulan). setting_default_language: "Bahasa default" setting_default_projects_modules: "Modul yang diaktifkan secara default untuk projek baharu" setting_default_projects_public: "Projek baharu adalah awam secara default" @@ -2931,12 +2931,12 @@ ms: setting_feeds_limit: "Had kandungan feed " setting_file_max_size_displayed: "Saiz maksimum fail teks ditampilkan sebaris " setting_host_name: "Nama hos" - setting_hours_per_day: "Hours per day" + setting_hours_per_day: "Jam sehari" setting_hours_per_day_explanation: >- - This will define what is considered a "day" when displaying duration in a more natural way (for example, if a day is 8 hours, 32 hours would be 4 days). - setting_days_per_week: "Days per week" + Ini akan takrifkan apa yang dianggap sebagai "hari" apabila memaparkan jangka masa menggunakan cara yang lebih semula jadi (contohnya, jika sehari ialah 8 jam, 32 jam ialah 4 hari). + setting_days_per_week: "Hari seminggu" setting_days_per_week_explanation: >- - This will define what is considered a "week" when displaying duration in a more natural way (for example, if a week is 5 days, 15 days would be 3 weeks). + Ini akan takrifkan apa yang dianggap sebagai "minggu" apabila memaparkan jangka masa menggunakan cara yang lebih semula jadi (contohnya, jika seminggu ialah 5 hari, 15 hari ialah 3 minggu) setting_invitation_expiration_days: "Pengaktifan e-mel tamat tempoh selepas" setting_work_package_done_ratio: "Pengiraan perkembangan" setting_work_package_done_ratio_field: "Berasaskan kerja" diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml index 80dfb04d0fb7..5308988243fe 100644 --- a/config/locales/crowdin/pl.yml +++ b/config/locales/crowdin/pl.yml @@ -795,7 +795,7 @@ pl: confirmation: "nie pasuje do %{attribute}." could_not_be_copied: "Nie można było (w pełni) skopiować %{dependency}." does_not_exist: "nie istnieje." - error_enterprise_only: "%{action} jest dostępna tylko w OpenProject Enterprise Edition" + error_enterprise_only: "%{action} jest dostępna tylko w OpenProject Enterprise edition" error_unauthorized: "— nie można uzyskac dostępu." error_readonly: "— podjęto próbę zapisu, ale nie jest zapisywalny." error_conflict: "Information has been updated by at least one other user in the meantime." diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index 5cb06592a678..c741c6bfbeac 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -1052,7 +1052,7 @@ ru: only_same_project_categories_allowed: "Категория пакета работ должна быть в рамках того же проекта, что и пакет работ." does_not_exist: "Указанная категория не существует." estimated_hours: - not_a_number: "is not a valid duration." + not_a_number: "не является допустимой продолжительностью." cant_be_inferior_to_remaining_work: "Не может быть меньше, чем Оставшаяся работа." must_be_set_when_remaining_work_is_set: "Требуется, если установлен параметр Оставшаяся работа." only_values_greater_or_equal_zeroes_allowed: "Должно быть >= 0." diff --git a/config/locales/crowdin/sl.yml b/config/locales/crowdin/sl.yml index ef876ee8f065..613248f0cbfd 100644 --- a/config/locales/crowdin/sl.yml +++ b/config/locales/crowdin/sl.yml @@ -1454,8 +1454,8 @@ sl: - "avgust" - "september" - "oktober" - - "november" - - "december" + - "November" + - "December" order: - :leto - :mesec diff --git a/config/locales/crowdin/tr.yml b/config/locales/crowdin/tr.yml index cc54c92e4fe2..f7b003d83ead 100644 --- a/config/locales/crowdin/tr.yml +++ b/config/locales/crowdin/tr.yml @@ -1185,7 +1185,7 @@ tr: base: "Genel Hata:" blocks_ids: "Engellenen iş paketlerinin ID'leri" category: "Kategori" - comment: "Yorumlar" + comment: "Yorum" comments: "Yorum" content: "İçerik" color: "Renk" diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml index ef44889ef013..af9a1b6b67a0 100644 --- a/config/locales/crowdin/uk.yml +++ b/config/locales/crowdin/uk.yml @@ -2070,7 +2070,7 @@ uk: label_index_by_title: "Індекс за назвою" label_information: "Інформація" label_information_plural: "Інформація" - label_installation_guides: "Інструкції із встановлення" + label_installation_guides: "Інструкції зі встановлення" label_integer: "Ціле число" label_internal: "Власне" label_introduction_video: "Введення відео" diff --git a/config/locales/crowdin/zh-CN.seeders.yml b/config/locales/crowdin/zh-CN.seeders.yml index 8c753fa24088..320eebdec815 100644 --- a/config/locales/crowdin/zh-CN.seeders.yml +++ b/config/locales/crowdin/zh-CN.seeders.yml @@ -151,7 +151,7 @@ zh-CN: demo-project: name: 演示项目 status_explanation: 所有任务都按计划进行。相关人员均知晓各自任务。系统已完全建立。 - description: 这是对此演示 Scrum 项目目标的简短摘要。 + description: 这是对此演示项目目标的简短摘要。 news: item_0: title: 欢迎来到您的演示项目 @@ -269,7 +269,7 @@ zh-CN: scrum-project: name: Scrum 项目 status_explanation: 所有任务都按计划进行。相关人员均知晓各自任务。系统已完全建立。 - description: 这是对此演示 Scrum 项目目标的简短摘要。 + description: 这是对此演示Scrum项目目标的简短摘要。 news: item_0: title: 欢迎来到您的 Scrum 演示项目 diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index 394aa4bf7ed1..90229a93923d 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -67,7 +67,7 @@ zh-CN: text: "您确定要删除当前使用的企业版令牌吗?" title: "删除令牌" replace_token: "替换您当前的支持令牌" - order: "订购本地部署版的 Enterprise edition" + order: "订购本地部署的 Enterprise edition" paste: "粘贴您企业版的支持令牌" required_for_feature: "此功能仅限具激活的企业版支持令牌的订阅者使用。" enterprise_link: "如需了解详细信息,请单击此处。" @@ -2184,7 +2184,7 @@ zh-CN: label_revision_id: "修订版本 %{value}" label_revision_plural: "修订" label_roadmap: "路线图" - label_roadmap_edit: "编辑路线图%{name}" + label_roadmap_edit: "编辑路线图 %{name}" label_roadmap_due_in: "%{value} 到期" label_roadmap_no_work_packages: "该版本没有工作包。" label_roadmap_overdue: "%{value} 超时" @@ -2825,7 +2825,7 @@ zh-CN: managed: "在 OpenProject 中创建新的存储库" storage: not_available: "磁盘存储开销不可用于此存储库。" - update_timeout: "在 N 分钟内保留存储库最后所需的磁盘空间信息。由于计算存储库所需的磁盘空间可能增加系统开销,增加该值可以减少性能影响。" + update_timeout: "在 N 分钟内保留存储库最后所需磁盘空间的信息。由于计算存储库所需的磁盘空间可能增加系统开销,增加该值可以减少性能影响。" oauth_application_details: "关闭此窗口后,将无法再次访问客户端密钥值。请将这些值复制到 Nextcloud OpenProject 集成设置中:" oauth_application_details_link_text: "转到设置页面" setup_documentation_details: "如果您在配置新文件存储方面需要帮助,请查看文档:" @@ -2976,7 +2976,7 @@ zh-CN: setting_session_ttl_hint: "当设置的值低于5时,其作用类似于禁用。" setting_session_ttl_enabled: "会话过期" setting_start_of_week: "一周起始日" - setting_sys_api_enabled: "启用存储库管理网页服务" + setting_sys_api_enabled: "启用版本库管理 web 服务" setting_sys_api_description: "存储库管理网页服务提供了集成的,用户授权的存储库访问。" setting_time_format: "时间" setting_accessibility_mode_for_anonymous: "为匿名用户启用辅助功能模式" @@ -3288,7 +3288,7 @@ zh-CN: warning_user_limit_reached_admin: > 添加额外的用户将超出当前限制。请升级您的计划,以确保外部用户能够访问此实例。 warning_user_limit_reached_instructions: > - 您已达到用户限制(%{current}/%{max} 活跃用户)。请联系 sales@openproject.com 升级您的企业版计划以添加额外用户。 + 您达到了用户限制(%{current}/%{max}活跃用户)。 请联系sales@openproject.com以升级您的Enterprise edition计划并添加其他用户。 warning_protocol_mismatch_html: > warning_bar: diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml index a137af3f4a97..d5d477140de2 100644 --- a/config/locales/crowdin/zh-TW.yml +++ b/config/locales/crowdin/zh-TW.yml @@ -1938,7 +1938,7 @@ zh-TW: label_file_plural: "檔案" label_filter_add: "新增條件" label_filter: "篩選條件" - label_filter_plural: "篩選條件" + label_filter_plural: "篩選器" label_filters_toggle: "顯示/隱藏篩選條件" label_float: "浮點數" label_folder: "資料夾" @@ -1962,7 +1962,7 @@ zh-TW: label_history: "歷史" label_hierarchy_leaf: "頁面結構頁" label_home: "Home" - label_subject_or_id: "名稱或 id" + label_subject_or_id: "主旨或 id" label_calendar_subscriptions: "訂閱行事曆" label_identifier: "識別碼" label_in: "在" @@ -2001,7 +2001,7 @@ zh-TW: label_latest_revision_plural: "最新版本" label_ldap_authentication: "LDAP 認證" label_learn_more: "了解更多" - label_less_or_equal: "之後" + label_less_or_equal: "<=" label_less_than_ago: "幾天內" label_link_url: "Link (URL)" label_list: "清單" diff --git a/modules/avatars/config/locales/crowdin/js-ms.yml b/modules/avatars/config/locales/crowdin/js-ms.yml index 88aac2b59ccd..2952e3124618 100644 --- a/modules/avatars/config/locales/crowdin/js-ms.yml +++ b/modules/avatars/config/locales/crowdin/js-ms.yml @@ -2,7 +2,7 @@ ms: js: label_preview: 'Previu' - button_update: 'Kemaskini' + button_update: 'Kemas kini' avatars: label_choose_avatar: "Pilih Avatar dari fail" uploading_avatar: "Memuat naik avatar anda." diff --git a/modules/backlogs/config/locales/crowdin/ms.yml b/modules/backlogs/config/locales/crowdin/ms.yml index 3a1c3c3285b1..d4b83cad035d 100644 --- a/modules/backlogs/config/locales/crowdin/ms.yml +++ b/modules/backlogs/config/locales/crowdin/ms.yml @@ -64,8 +64,8 @@ ms: properties: "Ciri-ciri" rebuild: "Bina semula" rebuild_positions: "Bina semula kedudukan" - remaining_hours: "Baki kerja" - remaining_hours_ideal: "Baki kerja (ideal)" + remaining_hours: "Kerja yang berbaki" + remaining_hours_ideal: "Kerja yang berbaki (ideal)" show_burndown_chart: "Carta Burndown" story: "Cerita" story_points: "Titik Cerita" @@ -82,9 +82,9 @@ ms: backlogs_product_backlog_is_empty: "Tunggakan produk kosong" backlogs_product_backlog_unsized: "Bahagian atas tunggakan produk mempunyai cerita tanpa saiz" backlogs_sizing_inconsistent: "Saiz cerita berbeza mengikut anggaran" - backlogs_sprint_notes_missing: "Pecutan ditutup tanpa nota restrospektif atau semakan" + backlogs_sprint_notes_missing: "Pecutan ditutup tanpa nota restrospektif/semakan" backlogs_sprint_unestimated: "Pecutan aktif atau ditutup bersama cerita yang tiada anggaran" - backlogs_sprint_unsized: "Projek mempunyai cerita-cerita berkenaan pecutan aktif atau baru ditutup yang tidak bersaiz" + backlogs_sprint_unsized: "Projek mempunyai cerita-cerita berkenaan pecutan aktif atau yang baru ditutup yang tidak bersaiz" backlogs_sprints: "Pecutan" backlogs_story: "Cerita" backlogs_story_type: "Jenis cerita" @@ -112,7 +112,7 @@ ms: label_burndown: "Burndown" label_column_in_backlog: "Kolum dalam tunggakan" label_hours: "jam" - label_work_package_hierarchy: "Hierarki Pakej kerja" + label_work_package_hierarchy: "Hierarki pakej kerja" label_master_backlog: "Tunggakan Utama" label_not_prioritized: "tidak diutamakan" label_points: "mata" @@ -147,7 +147,7 @@ ms: rb_label_copy_tasks_none: "Tiada" rb_label_copy_tasks_open: "Buka" rb_label_link_to_original: "Sertakan pautan ke cerita asal" - remaining_hours: "baki kerja" + remaining_hours: "kerja yang berbaki" required_burn_rate_hours: "kadar burn yang diperlukan (jam)" required_burn_rate_points: "kadar burn yang diperlukan (mata)" todo_work_package_description: "%{summary}: %{url}\n%{description}" diff --git a/modules/backlogs/config/locales/crowdin/zh-TW.yml b/modules/backlogs/config/locales/crowdin/zh-TW.yml index d89c5113ef2e..a80e037699c9 100644 --- a/modules/backlogs/config/locales/crowdin/zh-TW.yml +++ b/modules/backlogs/config/locales/crowdin/zh-TW.yml @@ -21,7 +21,7 @@ #++ zh-TW: plugin_openproject_backlogs: - name: "OpenProject待辦事項" + name: "OpenProject代辦事項" description: "This module adds features enabling agile teams to work with OpenProject in Scrum projects." activerecord: attributes: diff --git a/modules/bim/config/locales/crowdin/fr.yml b/modules/bim/config/locales/crowdin/fr.yml index 9e4ab945797c..1be78163d4bc 100644 --- a/modules/bim/config/locales/crowdin/fr.yml +++ b/modules/bim/config/locales/crowdin/fr.yml @@ -58,7 +58,7 @@ fr: perform_description: "Voulez-vous importer ou mettre à jour les problèmes repris ci-dessus ?" replace_with_system_user: 'Les remplacer par l''utilisateur "Système"' import_as_system_user: 'Les importer comme utilisateur "Système".' - what_to_do: "Que voulez-vous faire ?" + what_to_do: "Que voulez-vous faire?" work_package_has_newer_changes: "Obsolète ! Ce sujet n'a pas été mis à jour, car les derniers changements sur le serveur étaient plus récents que la \"ModifiedDate\" du sujet importé. Toutefois, les commentaires sur le sujet ont été importés." bcf_file_not_found: "Impossible de localiser le fichier BCF. Veuillez recommencer le processus de téléversement." export: diff --git a/modules/bim/config/locales/crowdin/ms.seeders.yml b/modules/bim/config/locales/crowdin/ms.seeders.yml index 0e5ecb33376c..5af028d04491 100644 --- a/modules/bim/config/locales/crowdin/ms.seeders.yml +++ b/modules/bim/config/locales/crowdin/ms.seeders.yml @@ -47,12 +47,12 @@ ms: name: Konflik global_queries: item_0: - name: 'Jadual yang telah disematkan: Kanak-kanak' + name: 'Jadual tersemat: Anak-anak' type_configuration: item_0: form_configuration: item_0: - group_name: Kanak-kanak + group_name: Anak-anak groups: item_0: name: Arkitek diff --git a/modules/bim/config/locales/crowdin/ms.yml b/modules/bim/config/locales/crowdin/ms.yml index 37a17178c476..dff87b50b925 100644 --- a/modules/bim/config/locales/crowdin/ms.yml +++ b/modules/bim/config/locales/crowdin/ms.yml @@ -24,7 +24,7 @@ ms: xml_file: 'Fail BCF XML' import_title: 'Import' export: 'Eksport' - import_update_comment: '(Dikemas kini di dalam import BCF)' + import_update_comment: '(Dikemas kini dalam import BCF)' import_failed: 'Tidak boleh import fail BCF: %{error}' import_failed_unsupported_bcf_version: 'Fail BCF gagal untuk dibaca: Versi BCF ini tidak disokong. Sila pastikan versi ini adalah sekurang-kurangnya %{minimal_version} atau lebih tinggi.' import_successful: 'Import %{count} isu BCF' diff --git a/modules/boards/config/locales/crowdin/js-ms.yml b/modules/boards/config/locales/crowdin/js-ms.yml index c4228e444bf7..aab49afba5fa 100644 --- a/modules/boards/config/locales/crowdin/js-ms.yml +++ b/modules/boards/config/locales/crowdin/js-ms.yml @@ -12,15 +12,15 @@ ms: lists: delete: 'Padam senarai' version: - is_locked: 'Versi ini dikunci. Tiada item yang boleh ditambah kedalam versi ini.' - is_closed: 'Versi ini ditutup. Tiada item yang boleh ditambah kedalam versi ini.' + is_locked: 'Versi ini dikunci. Tiada item yang boleh ditambah ke dalam versi ini.' + is_closed: 'Versi ini ditutup. Tiada item yang boleh ditambah ke dalam versi ini.' close_version: 'Versi tertutup' open_version: 'Versi terbuka' lock_version: 'Versi terkunci' unlock_version: 'Versi dibuka' edit_version: 'Versi edit' show_version: 'Papar versi' - locked: 'Dikunci' + locked: 'Terkunci' closed: 'Tertutup' new_board: 'Board baharu' add_list: 'Tambah senarai ke board' diff --git a/modules/budgets/config/locales/crowdin/cs.yml b/modules/budgets/config/locales/crowdin/cs.yml index 040db0f85b37..100d7ef33903 100644 --- a/modules/budgets/config/locales/crowdin/cs.yml +++ b/modules/budgets/config/locales/crowdin/cs.yml @@ -27,7 +27,7 @@ cs: budget: author: "Autor" available: "Dostupné" - budget: "Plánované" + budget: "Rozpočet" budget_ratio: "Stráveno (poměr)" description: "Popis" spent: "Strávený čas" diff --git a/modules/job_status/config/locales/crowdin/js-ms.yml b/modules/job_status/config/locales/crowdin/js-ms.yml index bd9a17950282..b43a2e070be5 100644 --- a/modules/job_status/config/locales/crowdin/js-ms.yml +++ b/modules/job_status/config/locales/crowdin/js-ms.yml @@ -10,7 +10,7 @@ ms: errors: 'Beberapa ralat telah berlaku' generic_messages: not_found: 'Kerja ini tidak dapat ditemui.' - in_queue: 'Kerja ini telah dibaris gilirkan dan akan diproses sebentar lagi.' + in_queue: 'Kerja ini sedang menunggu giliran dan akan diproses sebentar lagi.' in_process: 'Kerja ini sedang diproses.' error: 'Kerja ini gagal disiapkan.' cancelled: 'Kerja ini telah dibatalkan disebabkan oleh sebuah ralat.' diff --git a/modules/ldap_groups/config/locales/crowdin/zh-CN.yml b/modules/ldap_groups/config/locales/crowdin/zh-CN.yml index d551c0a9e91e..4d0259eed6ce 100644 --- a/modules/ldap_groups/config/locales/crowdin/zh-CN.yml +++ b/modules/ldap_groups/config/locales/crowdin/zh-CN.yml @@ -1,7 +1,7 @@ zh-CN: plugin_openproject_ldap_groups: name: "OpenProject LDAP 组" - description: "LDAP组成员同步。" + description: "LDAP 组成员同步。" activerecord: attributes: ldap_groups/synchronized_group: diff --git a/modules/ldap_groups/config/locales/crowdin/zh-TW.yml b/modules/ldap_groups/config/locales/crowdin/zh-TW.yml index c32bdadf911f..6f0cb1bf00fc 100644 --- a/modules/ldap_groups/config/locales/crowdin/zh-TW.yml +++ b/modules/ldap_groups/config/locales/crowdin/zh-TW.yml @@ -9,7 +9,7 @@ zh-TW: ldap_auth_source: 'LDAP 連線' sync_users: '同步使用者' ldap_groups/synchronized_filter: - filter_string: 'LDAP篩選條件' + filter_string: '簡約登入目錄制約(LDAP)篩選' ldap_auth_source: 'LDAP 連線' group_name_attribute: "群組名字屬性" sync_users: '同步使用者' diff --git a/modules/meeting/config/locales/crowdin/cs.yml b/modules/meeting/config/locales/crowdin/cs.yml index 9b479793a486..865f2a0cb50d 100644 --- a/modules/meeting/config/locales/crowdin/cs.yml +++ b/modules/meeting/config/locales/crowdin/cs.yml @@ -138,7 +138,7 @@ cs: types: classic: "Klasické" classic_text: "Uspořádat schůzku do formátů textového programu a protokolu." - structured: "Dynamický" + structured: "Dynamická" structured_text: "Uspořádat schůzku jako seznam bodů pořadu jednání, případně je propojit s pracovním balíčkem." structured_text_copy: "Kopírování schůzky v současné době nezkopíruje související body pořadu jednání, jen podrobnosti" copied: "Zkopírováno ze schůzky #%{id}" @@ -151,7 +151,7 @@ cs: notice_timezone_missing: Není nastaveno žádné časové pásmo a předpokládá se %{zone} . Chcete-li vybrat časové pásmo, klikněte prosím zde. permission_create_meetings: "Vytvořit schůzku\n" permission_edit_meetings: "Upravit schůzku" - permission_delete_meetings: "Odstranit schůzky" + permission_delete_meetings: "Smazat schůzku" permission_view_meetings: "Zobrazit schůzky" permission_create_meeting_agendas: "Vytvořit agendy schůzek" permission_create_meeting_agendas_explanation: "Umožňuje upravovat obsah programu klasické schůzky." diff --git a/modules/meeting/config/locales/crowdin/zh-TW.yml b/modules/meeting/config/locales/crowdin/zh-TW.yml index 4c03387ffbc6..fa238a3ac855 100644 --- a/modules/meeting/config/locales/crowdin/zh-TW.yml +++ b/modules/meeting/config/locales/crowdin/zh-TW.yml @@ -154,7 +154,7 @@ zh-TW: permission_create_meeting_agendas_explanation: "允許編輯傳統會議的議程。" permission_manage_agendas: "管理議程" permission_manage_agendas_explanation: "允許編輯動態會議的議程項目。" - permission_close_meeting_agendas: "結束會議大綱" + permission_close_meeting_agendas: "定案會議大綱" permission_send_meeting_agendas_notification: "傳送會議大綱審閱通知" permission_create_meeting_minutes: "管理會議記錄" permission_send_meeting_minutes_notification: "傳送會議記錄審閱通知" diff --git a/modules/reporting/config/locales/crowdin/zh-TW.yml b/modules/reporting/config/locales/crowdin/zh-TW.yml index 370d34a31c5f..49d48a9ab8fd 100644 --- a/modules/reporting/config/locales/crowdin/zh-TW.yml +++ b/modules/reporting/config/locales/crowdin/zh-TW.yml @@ -51,7 +51,7 @@ zh-TW: label_money: "現金價值" label_month_reporting: "月" label_new_report: "新建成本報表" - label_open: "開啟" + label_open: "進行中" label_operator: "操作員" label_private_report_plural: "私密成本報告" label_progress_bar_explanation: "產生報告中..." diff --git a/modules/two_factor_authentication/config/locales/crowdin/ru.yml b/modules/two_factor_authentication/config/locales/crowdin/ru.yml index 3239661bdeae..6bb673a4ff41 100644 --- a/modules/two_factor_authentication/config/locales/crowdin/ru.yml +++ b/modules/two_factor_authentication/config/locales/crowdin/ru.yml @@ -174,7 +174,7 @@ ru: label_expiration_hint: "%{date} или при выходе из системы" label_actions: "Действия" label_confirmed: "Подтвержден" - button_continue: "Продолжить" + button_continue: "Далее" button_make_default: "Задать по умолчанию" label_unverified_phone: "Сотовый телефон еще не подтвержден" notice_phone_number_format: "Введите номер в следующем формате: +XX XXXXXXXX." diff --git a/modules/two_factor_authentication/config/locales/crowdin/uk.yml b/modules/two_factor_authentication/config/locales/crowdin/uk.yml index e1e0d01331c8..128e5436d546 100644 --- a/modules/two_factor_authentication/config/locales/crowdin/uk.yml +++ b/modules/two_factor_authentication/config/locales/crowdin/uk.yml @@ -114,7 +114,7 @@ uk: failed_to_delete: "Не вдалося видалити пристрій 2FA." is_default_cannot_delete: "Пристрій позначено як типовий і його не можна видалити через активну політику безпеки. Перед видаленням позначте інший пристрій як стандартний." not_existing: "Для вашого облікового запису не зареєстровано жодного пристрою 2FA." - 2fa_from_input: Введіть код, отриманий на пристрій %{device_name}, щоб підтвердити свою особу. + 2fa_from_input: Введіть код, що надійшов на пристрій %{device_name}, щоб підтвердити свою особу. 2fa_from_webauthn: Укажіть пристрій WebAuthn %{device_name}. Якщо це USB-пристрій, переконайтеся, що його підключено, і торкніться його. Потім натисніть кнопку входу. webauthn: title: "WebAuthn" diff --git a/modules/xls_export/config/locales/crowdin/zh-CN.yml b/modules/xls_export/config/locales/crowdin/zh-CN.yml index 59230e603ecf..31c8d3cdd710 100644 --- a/modules/xls_export/config/locales/crowdin/zh-CN.yml +++ b/modules/xls_export/config/locales/crowdin/zh-CN.yml @@ -13,4 +13,4 @@ zh-CN: xls_with_relations: "带关系的 XLS" xls_export: child_of: 此项的子项 - parent_of: 此项的父级 + parent_of: 此项的父项 From 0be9927742c80d1d920a3e62cf058a6f0a46d1fd Mon Sep 17 00:00:00 2001 From: Eric-Guo Date: Sat, 8 Jun 2024 07:39:51 +0800 Subject: [PATCH 052/325] Bump sprockets-rails --- Gemfile | 2 +- Gemfile.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 11fc578e9120..e20dc3b08db1 100644 --- a/Gemfile +++ b/Gemfile @@ -182,7 +182,7 @@ gem "i18n-js", "~> 4.2.3" gem "rails-i18n", "~> 7.0.0" gem "sprockets", "~> 3.7.2" # lock sprockets below 4.0 -gem "sprockets-rails", "~> 3.4.2" +gem "sprockets-rails", "~> 3.5.1" gem "puma", "~> 6.4" gem "puma-plugin-statsd", "~> 2.0" diff --git a/Gemfile.lock b/Gemfile.lock index 015eda43ca1c..71b80a2c0e6c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1057,9 +1057,9 @@ GEM base64 concurrent-ruby (~> 1.0) rack (> 1, < 3) - sprockets-rails (3.4.2) - actionpack (>= 5.2) - activesupport (>= 5.2) + sprockets-rails (3.5.1) + actionpack (>= 6.1) + activesupport (>= 6.1) sprockets (>= 3.0.0) ssrf_filter (1.0.8) stackprof (0.2.26) @@ -1335,7 +1335,7 @@ DEPENDENCIES spring-commands-rspec spring-commands-rubocop sprockets (~> 3.7.2) - sprockets-rails (~> 3.4.2) + sprockets-rails (~> 3.5.1) stackprof store_attribute (~> 1.0) stringex (~> 2.8.5) From 3f3a5e333d4153efbe689c0edfa44c2dcb950971 Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Mon, 10 Jun 2024 03:05:16 +0000 Subject: [PATCH 053/325] update locales from crowdin [ci skip] --- config/locales/crowdin/ms.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/locales/crowdin/ms.yml b/config/locales/crowdin/ms.yml index 745a4d971144..92f3d822aec5 100644 --- a/config/locales/crowdin/ms.yml +++ b/config/locales/crowdin/ms.yml @@ -1036,7 +1036,7 @@ ms: only_values_greater_or_equal_zeroes_allowed: "Perlu >= 0." format: "%{message}" remaining_hours: - not_a_number: "is not a valid duration." + not_a_number: "bukan jangka masa yang sah." cant_exceed_work: "Tidak boleh lebih tinggi daripada Kerja." must_be_set_when_work_is_set: "Diperlukan apabila Kerja ditetapkan." format: "%{message}" From 8d895ecca7a2d3673c33a122081a75814ece04a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 05:28:37 +0000 Subject: [PATCH 054/325] Bump @ngx-formly/core from 6.3.3 to 6.3.4 in /frontend Bumps [@ngx-formly/core](https://github.com/ngx-formly/ngx-formly) from 6.3.3 to 6.3.4. - [Release notes](https://github.com/ngx-formly/ngx-formly/releases) - [Changelog](https://github.com/ngx-formly/ngx-formly/blob/main/CHANGELOG.md) - [Commits](https://github.com/ngx-formly/ngx-formly/compare/v6.3.3...v6.3.4) --- updated-dependencies: - dependency-name: "@ngx-formly/core" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index f28af01b8e45..86252d4e476a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -4079,9 +4079,9 @@ } }, "node_modules/@ngx-formly/core": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/@ngx-formly/core/-/core-6.3.3.tgz", - "integrity": "sha512-Dlbxzxrq5J9oNghwJnljtt/rvIeyfqwPQcCkLfsIc04yyztHl8M5cfkQtqqj2VjyEOqQb/XGjt0eQhAXz3xnNg==", + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/@ngx-formly/core/-/core-6.3.4.tgz", + "integrity": "sha512-xpO0FB50gpQI4uDrz6nYNolMvMIOdgP19diflcvAAtDy15I4BS+tzLKOCkM9HmAwmKQ59z3FUyzaODFEu+cuEg==", "dependencies": { "tslib": "^2.0.0" }, @@ -25376,9 +25376,9 @@ "integrity": "sha512-CjSVVa/9fzMpEDQP01SC4colKCbZwj7vUq0H2bivp8jVsmd21x9Fu0gDBH0Y9NdfAIm4eGZvmiZKMII3vIOaYQ==" }, "@ngx-formly/core": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/@ngx-formly/core/-/core-6.3.3.tgz", - "integrity": "sha512-Dlbxzxrq5J9oNghwJnljtt/rvIeyfqwPQcCkLfsIc04yyztHl8M5cfkQtqqj2VjyEOqQb/XGjt0eQhAXz3xnNg==", + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/@ngx-formly/core/-/core-6.3.4.tgz", + "integrity": "sha512-xpO0FB50gpQI4uDrz6nYNolMvMIOdgP19diflcvAAtDy15I4BS+tzLKOCkM9HmAwmKQ59z3FUyzaODFEu+cuEg==", "requires": { "tslib": "^2.0.0" } From 53d2581256ef95ad666284184eeae7ce072fbd85 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 05:29:02 +0000 Subject: [PATCH 055/325] Bump @types/lodash from 4.17.4 to 4.17.5 in /frontend Bumps [@types/lodash](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/lodash) from 4.17.4 to 4.17.5. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/lodash) --- updated-dependencies: - dependency-name: "@types/lodash" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index f28af01b8e45..0c9cd0478752 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -5577,9 +5577,9 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==", + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw==", "dev": true }, "node_modules/@types/mime": { @@ -26455,9 +26455,9 @@ "dev": true }, "@types/lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==", + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw==", "dev": true }, "@types/mime": { From 9afa6e370fffdf0a728070bb366c371a5b0cabd1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 05:29:22 +0000 Subject: [PATCH 056/325] Bump browserslist from 4.23.0 to 4.23.1 in /frontend Bumps [browserslist](https://github.com/browserslist/browserslist) from 4.23.0 to 4.23.1. - [Release notes](https://github.com/browserslist/browserslist/releases) - [Changelog](https://github.com/browserslist/browserslist/blob/main/CHANGELOG.md) - [Commits](https://github.com/browserslist/browserslist/compare/4.23.0...4.23.1) --- updated-dependencies: - dependency-name: browserslist dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 92 +++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index f28af01b8e45..d5e5b6a537c2 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8166,9 +8166,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", "funding": [ { "type": "opencollective", @@ -8184,10 +8184,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "update-browserslist-db": "^1.0.16" }, "bin": { "browserslist": "cli.js" @@ -8394,9 +8394,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001599", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz", - "integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==", + "version": "1.0.30001632", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001632.tgz", + "integrity": "sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg==", "funding": [ { "type": "opencollective", @@ -9920,9 +9920,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.673", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.673.tgz", - "integrity": "sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==" + "version": "1.4.796", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.796.tgz", + "integrity": "sha512-NglN/xprcM+SHD2XCli4oC6bWe6kHoytcyLKCWXmRL854F0qhPhaYgUswUsglnPxYaNQIg2uMY4BvaomIf3kLA==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -10442,9 +10442,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -17429,9 +17429,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -21348,9 +21348,9 @@ "dev": true }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "funding": [ { "type": "opencollective", @@ -21366,8 +21366,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -28370,14 +28370,14 @@ } }, "browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", "requires": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "update-browserslist-db": "^1.0.16" } }, "bser": { @@ -28521,9 +28521,9 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "caniuse-lite": { - "version": "1.0.30001599", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz", - "integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==" + "version": "1.0.30001632", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001632.tgz", + "integrity": "sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg==" }, "capture-exit": { "version": "2.0.0", @@ -29642,9 +29642,9 @@ } }, "electron-to-chromium": { - "version": "1.4.673", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.673.tgz", - "integrity": "sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==" + "version": "1.4.796", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.796.tgz", + "integrity": "sha512-NglN/xprcM+SHD2XCli4oC6bWe6kHoytcyLKCWXmRL854F0qhPhaYgUswUsglnPxYaNQIg2uMY4BvaomIf3kLA==" }, "emoji-regex": { "version": "9.2.2", @@ -30076,9 +30076,9 @@ "integrity": "sha512-6v/WJubRsjxBbQdz6izgvx7LsVFvVaGmSdwrFHmEzoVgfXL89hkKPoQHsnVI2ngOkcBUQT9kmAM1hVL1k/Av4A==" }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==" }, "escape-html": { "version": "1.0.3", @@ -35311,9 +35311,9 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "picomatch": { "version": "2.3.1", @@ -38222,12 +38222,12 @@ } }, "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" } }, "uri-js": { From 475e7575c4b3911122643c209bad722462226631 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 05:39:46 +0000 Subject: [PATCH 057/325] Bump rubocop-rspec from 2.30.0 to 2.31.0 Bumps [rubocop-rspec](https://github.com/rubocop/rubocop-rspec) from 2.30.0 to 2.31.0. - [Release notes](https://github.com/rubocop/rubocop-rspec/releases) - [Changelog](https://github.com/rubocop/rubocop-rspec/blob/master/CHANGELOG.md) - [Commits](https://github.com/rubocop/rubocop-rspec/compare/v2.30.0...v2.31.0) --- updated-dependencies: - dependency-name: rubocop-rspec dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 015eda43ca1c..d130af32e666 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -790,7 +790,7 @@ GEM paper_trail (15.1.0) activerecord (>= 6.1) request_store (~> 1.4) - parallel (1.24.0) + parallel (1.25.1) parallel_tests (4.7.1) parallel parser (3.3.2.0) @@ -940,8 +940,8 @@ GEM actionpack (>= 5.2) railties (>= 5.2) retriable (3.1.2) - rexml (3.2.8) - strscan (>= 3.0.9) + rexml (3.2.9) + strscan rinku (2.0.6) roar (1.2.0) representable (~> 3.1) @@ -983,9 +983,9 @@ GEM unicode-display_width (>= 2.4.0, < 3.0) rubocop-ast (1.31.3) parser (>= 3.3.1.0) - rubocop-capybara (2.20.0) + rubocop-capybara (2.21.0) rubocop (~> 1.41) - rubocop-factory_bot (2.25.1) + rubocop-factory_bot (2.26.0) rubocop (~> 1.41) rubocop-inflector (0.2.1) activesupport @@ -999,12 +999,12 @@ GEM rack (>= 1.1) rubocop (>= 1.33.0, < 2.0) rubocop-ast (>= 1.31.1, < 2.0) - rubocop-rspec (2.30.0) + rubocop-rspec (2.31.0) rubocop (~> 1.40) rubocop-capybara (~> 2.17) rubocop-factory_bot (~> 2.22) rubocop-rspec_rails (~> 2.28) - rubocop-rspec_rails (2.28.3) + rubocop-rspec_rails (2.29.0) rubocop (~> 1.40) ruby-duration (3.2.3) activesupport (>= 3.0.0) From e30fb6ae168977ad9b91f04e182d7719507064c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 05:41:36 +0000 Subject: [PATCH 058/325] Bump oj from 3.16.3 to 3.16.4 Bumps [oj](https://github.com/ohler55/oj) from 3.16.3 to 3.16.4. - [Release notes](https://github.com/ohler55/oj/releases) - [Changelog](https://github.com/ohler55/oj/blob/develop/CHANGELOG.md) - [Commits](https://github.com/ohler55/oj/compare/v3.16.3...v3.16.4) --- updated-dependencies: - dependency-name: oj dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 015eda43ca1c..03d288b52303 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -750,7 +750,7 @@ GEM mini_portile2 (~> 2.8.2) racc (~> 1.4) numerizer (0.2.0) - oj (3.16.3) + oj (3.16.4) bigdecimal (>= 3.0) okcomputer (1.18.5) omniauth-saml (1.10.3) From 2301825926bef64fc650081d23723684da7806c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 05:43:02 +0000 Subject: [PATCH 059/325] Bump recaptcha from 5.16.0 to 5.17.0 Bumps [recaptcha](https://github.com/ambethia/recaptcha) from 5.16.0 to 5.17.0. - [Changelog](https://github.com/ambethia/recaptcha/blob/master/CHANGELOG.md) - [Commits](https://github.com/ambethia/recaptcha/compare/v5.16.0...v5.17.0) --- updated-dependencies: - dependency-name: recaptcha dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 015eda43ca1c..f57da8db2139 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -921,7 +921,7 @@ GEM rbtree3 (0.7.1) rdoc (6.7.0) psych (>= 4.0.0) - recaptcha (5.16.0) + recaptcha (5.17.0) redcarpet (3.6.0) redis (5.2.0) redis-client (>= 0.22.0) From cdf55bb9d11fe5b1f3b93dfa1ab676917daed81c Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Mon, 10 Jun 2024 10:35:46 +0200 Subject: [PATCH 060/325] fix colors in baseline modal --- .../components/wp-baseline/baseline/baseline.component.sass | 6 +++--- .../src/app/spot/styles/sass/components/form-field.sass | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/app/features/work-packages/components/wp-baseline/baseline/baseline.component.sass b/frontend/src/app/features/work-packages/components/wp-baseline/baseline/baseline.component.sass index 275c7cddbb78..4936b9e44008 100644 --- a/frontend/src/app/features/work-packages/components/wp-baseline/baseline/baseline.component.sass +++ b/frontend/src/app/features/work-packages/components/wp-baseline/baseline/baseline.component.sass @@ -8,7 +8,7 @@ flex-direction: column width: 280px margin: $spot-spacing-1 $spot-spacing-1 0 $spot-spacing-1 - color: $spot-color-basic-gray-2 + color: var(--fgColor-muted) &:has(+ .op-baseline--body_ranged) width: auto @@ -47,8 +47,8 @@ display: flex align-items: flex-end justify-content: center - background-color: $spot-color-basic-gray-6 - border: 1px solid $spot-color-basic-gray-4 + background-color: var(--bgColor-neutral-muted) + border: 1px solid var(--borderColor-default) border-left: none !important padding: $spot-spacing-0_5 $spot-spacing-0_25 line-height: 1rem diff --git a/frontend/src/app/spot/styles/sass/components/form-field.sass b/frontend/src/app/spot/styles/sass/components/form-field.sass index e02cedffae08..75ad7d483dbe 100644 --- a/frontend/src/app/spot/styles/sass/components/form-field.sass +++ b/frontend/src/app/spot/styles/sass/components/form-field.sass @@ -46,7 +46,7 @@ @include spot-caption font-style: italic margin-bottom: $spot-spacing-0_25 - color: $spot-color-basic-gray-2 + color: var(--fgColor-muted) &--errors display: flex From 4d5319f4d398d06a19e2ea6d44693c8501f76bbd Mon Sep 17 00:00:00 2001 From: Markus Kahl Date: Mon, 10 Jun 2024 10:56:03 +0100 Subject: [PATCH 061/325] fix enabling deploy status job, symbol required --- .../lib/open_project/github_integration/engine.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/github_integration/lib/open_project/github_integration/engine.rb b/modules/github_integration/lib/open_project/github_integration/engine.rb index 5d8b35169056..dade0ae8dc25 100644 --- a/modules/github_integration/lib/open_project/github_integration/engine.rb +++ b/modules/github_integration/lib/open_project/github_integration/engine.rb @@ -134,7 +134,7 @@ class Engine < ::Rails::Engine # the cron job. So if you want this feature, enable it # at start-time. if OpenProject::FeatureDecisions.deploy_targets_active? - jobs["Cron::CheckDeployStatusJob"] = { + jobs[:"Cron::CheckDeployStatusJob"] = { cron: "15,45 * * * *", # runs every half hour class: ::Cron::CheckDeployStatusJob.name } From b89535a87a43f648f3b1dd61c64514fa670e5621 Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Mon, 10 Jun 2024 12:43:30 +0200 Subject: [PATCH 062/325] fix color of tile title --- frontend/src/global_styles/content/_tiles.sass | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/global_styles/content/_tiles.sass b/frontend/src/global_styles/content/_tiles.sass index 74215ad03eee..dd53f9188d19 100644 --- a/frontend/src/global_styles/content/_tiles.sass +++ b/frontend/src/global_styles/content/_tiles.sass @@ -71,7 +71,7 @@ &--title padding-top: 0 padding-bottom: 5px - color: var(--accent-color--major1) + color: var(--accent-color) display: block text-align: left font-weight: var(--base-text-weight-bold) From d61811deb4a6efc186a7088b973fc51df40c0ffa Mon Sep 17 00:00:00 2001 From: Henriette Darge Date: Fri, 7 Jun 2024 08:10:00 +0200 Subject: [PATCH 063/325] Remove the icon generator script because the used library is not working for months already and we want to enforce the switch to the Ociticons --- frontend/package-lock.json | 1150 +------------------ frontend/package.json | 2 - frontend/src/app/spot/icon-font/README.md | 17 +- frontend/src/app/spot/icon-font/generate.js | 51 - nix/shell.nix | 4 +- 5 files changed, 23 insertions(+), 1201 deletions(-) delete mode 100644 frontend/src/app/spot/icon-font/generate.js diff --git a/frontend/package-lock.json b/frontend/package-lock.json index ff71d7fd99b7..6ba9170313de 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -54,7 +54,6 @@ "@uirouter/angular": "^13.0.0", "@uirouter/core": "^6.1.0", "@uirouter/rx": "^1.0.0", - "@vusion/webfonts-generator": "^0.8.0", "@w11k/ngx-componentdestroyed": "^5.0.2", "@xeokit/xeokit-bim-viewer": "2.5.1-beta-28", "autoprefixer": "^10.4.19", @@ -5328,14 +5327,6 @@ "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", "dev": true }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "engines": { - "node": ">= 10" - } - }, "node_modules/@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", @@ -6406,172 +6397,6 @@ "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" } }, - "node_modules/@vusion/webfonts-generator": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@vusion/webfonts-generator/-/webfonts-generator-0.8.0.tgz", - "integrity": "sha512-1q17CF6umBEjlAtO37TzRw3aOCCAyFX+T4HPG70BmM6qx8s6H4/LQOa8eHFZq/oiMuMyd0FehKgUt/pqYlIMWA==", - "dependencies": { - "handlebars": "^4.0.11", - "mkdirp": "^1.0.4", - "q": "^1.1.2", - "svg2ttf": "^6.0.3", - "svgicons2svgfont": "^10.0.4", - "ttf2eot": "^3.0.0", - "ttf2woff": "^3.0.0", - "ttf2woff2": "^4.0.4", - "underscore": "^1.9.1", - "url-join": "^4.0.0" - } - }, - "node_modules/@vusion/webfonts-generator/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/@vusion/webfonts-generator/node_modules/bufferstreams": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-3.0.0.tgz", - "integrity": "sha512-Qg0ggJUWJq90vtg4lDsGN9CDWvzBMQxhiEkSOD/sJfYt6BLect3eV1/S6K7SCSKJ34n60rf6U5eUPmQENVE4UA==", - "dependencies": { - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/@vusion/webfonts-generator/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@vusion/webfonts-generator/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vusion/webfonts-generator/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@vusion/webfonts-generator/node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "node_modules/@vusion/webfonts-generator/node_modules/svg-pathdata": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", - "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@vusion/webfonts-generator/node_modules/svg2ttf": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/svg2ttf/-/svg2ttf-6.0.3.tgz", - "integrity": "sha512-CgqMyZrbOPpc+WqH7aga4JWkDPso23EgypLsbQ6gN3uoPWwwiLjXvzgrwGADBExvCRJrWFzAeK1bSoSpE7ixSQ==", - "dependencies": { - "@xmldom/xmldom": "^0.7.2", - "argparse": "^2.0.1", - "cubic2quad": "^1.2.1", - "lodash": "^4.17.10", - "microbuffer": "^1.0.0", - "svgpath": "^2.1.5" - }, - "bin": { - "svg2ttf": "svg2ttf.js" - } - }, - "node_modules/@vusion/webfonts-generator/node_modules/svgicons2svgfont": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/svgicons2svgfont/-/svgicons2svgfont-10.0.6.tgz", - "integrity": "sha512-fUgQEVg3XwTbOHvlXahHGqCet5Wvfo1bV4DCvbSRvjsOCPCRunYbG4dUJCPegps37BMph3eOrfoobhH5AWuC6A==", - "dependencies": { - "commander": "^7.2.0", - "geometry-interfaces": "^1.1.4", - "glob": "^7.1.6", - "neatequal": "^1.0.0", - "readable-stream": "^3.4.0", - "sax": "^1.2.4", - "svg-pathdata": "^6.0.0" - }, - "bin": { - "svgicons2svgfont": "bin/svgicons2svgfont.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@vusion/webfonts-generator/node_modules/ttf2eot": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ttf2eot/-/ttf2eot-3.1.0.tgz", - "integrity": "sha512-aHTbcYosNHVqb2Qtt9Xfta77ae/5y0VfdwNLUS6sGBeGr22cX2JDMo/i5h3uuOf+FAD3akYOr17+fYd5NK8aXw==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "ttf2eot": "ttf2eot.js" - } - }, - "node_modules/@vusion/webfonts-generator/node_modules/ttf2woff": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ttf2woff/-/ttf2woff-3.0.0.tgz", - "integrity": "sha512-OvmFcj70PhmAsVQKfC15XoKH55cRWuaRzvr2fpTNhTNer6JBpG8n6vOhRrIgxMjcikyYt88xqYXMMVapJ4Rjvg==", - "dependencies": { - "argparse": "^2.0.1", - "pako": "^1.0.0" - }, - "bin": { - "ttf2woff": "ttf2woff.js" - } - }, - "node_modules/@vusion/webfonts-generator/node_modules/ttf2woff2": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/ttf2woff2/-/ttf2woff2-4.0.5.tgz", - "integrity": "sha512-zpoU0NopfjoyVqkFeQ722SyKk/n607mm5OHxuDS/wCCSy82B8H3hHXrezftA2KMbKqfJIjie2lsJHdvPnBGbsw==", - "hasInstallScript": true, - "dependencies": { - "bindings": "^1.5.0", - "bufferstreams": "^3.0.0", - "nan": "^2.14.2", - "node-gyp": "^9.0.0" - }, - "bin": { - "ttf2woff2": "bin/ttf2woff2.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@vusion/webfonts-generator/node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" - }, "node_modules/@w11k/ngx-componentdestroyed": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@w11k/ngx-componentdestroyed/-/ngx-componentdestroyed-5.0.2.tgz", @@ -6735,14 +6560,6 @@ "html2canvas": "^1.4.1" } }, - "node_modules/@xmldom/xmldom": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", - "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -6789,11 +6606,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -6867,28 +6679,6 @@ "node": ">=8.9.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -7379,23 +7169,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -8048,14 +7821,6 @@ "node": ">=8" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -8266,79 +8031,6 @@ "node": ">= 0.8" } }, - "node_modules/cacache": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.3.tgz", - "integrity": "sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacache/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==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -8647,14 +8339,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" - } - }, "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -8849,11 +8533,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -9379,11 +9058,6 @@ "node": ">=4" } }, - "node_modules/cubic2quad": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cubic2quad/-/cubic2quad-1.2.1.tgz", - "integrity": "sha512-wT5Y7mO8abrV16gnssKdmIhIbA9wSkeMzhh27jAguKrV82i24wER0vL5TGhUJ9dbJNDcigoRZ0IAHFEEEI4THQ==" - }, "node_modules/custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -9656,11 +9330,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -11575,11 +11244,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -11982,24 +11646,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -12008,11 +11654,6 @@ "node": ">=6.9.0" } }, - "node_modules/geometry-interfaces": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/geometry-interfaces/-/geometry-interfaces-1.1.4.tgz", - "integrity": "sha512-qD6OdkT6NcES9l4Xx3auTpwraQruU7dARbQPVO71MKvkGYw5/z/oIiGymuFXrRaEQa5Y67EIojUpaLeGEa5hGA==" - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -12313,6 +11954,7 @@ "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -12563,6 +12205,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -12632,11 +12275,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, "node_modules/has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -12943,19 +12581,6 @@ "node": ">=8.0.0" } }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/http-proxy-middleware": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", @@ -13074,18 +12699,6 @@ "node": ">=8" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -13094,14 +12707,6 @@ "node": ">=10.17.0" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dependencies": { - "ms": "^2.0.0" - } - }, "node_modules/i18n-js": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/i18n-js/-/i18n-js-4.4.3.tgz", @@ -15297,39 +14902,6 @@ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, - "node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "engines": { - "node": ">=12" - } - }, "node_modules/make-plural": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.3.0.tgz", @@ -15463,11 +15035,6 @@ "node": ">= 0.6" } }, - "node_modules/microbuffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/microbuffer/-/microbuffer-1.0.0.tgz", - "integrity": "sha512-O/SUXauVN4x6RaEJFqSPcXNtLFL+QzJHKZlyDVYFwcDDRVca3Fa/37QXXC+4zAGGa4YhHrHxKXuuHvLDIQECtA==" - }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -15598,33 +15165,6 @@ "node": ">=8" } }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/minipass-fetch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", @@ -15869,11 +15409,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" - }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -15957,14 +15492,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/neatequal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/neatequal/-/neatequal-1.0.0.tgz", - "integrity": "sha512-sVt5awO4a4w24QmAthdrCPiVRW3naB8FGLdyadin01BH+6BzNPEBwGrpwCczQvPlULS6uXTItTe1PJ5P0kYm7A==", - "dependencies": { - "varstream": "^0.3.2" - } - }, "node_modules/needle": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", @@ -16096,30 +15623,6 @@ "node": ">= 6.13.0" } }, - "node_modules/node-gyp": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, "node_modules/node-gyp-build": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", @@ -16131,25 +15634,6 @@ "node-gyp-build-test": "build-test.js" } }, - "node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -16167,20 +15651,6 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, - "node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/normalize-package-data": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", @@ -16430,20 +15900,6 @@ "node": ">=8" } }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -17865,15 +17321,6 @@ "node": ">=6" } }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, "node_modules/qjobs": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", @@ -18740,7 +18187,8 @@ "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "optional": true }, "node_modules/scheduler": { "version": "0.23.2", @@ -19003,11 +18451,6 @@ "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, "node_modules/set-function-length": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", @@ -19375,19 +18818,6 @@ "npm": ">= 3.0.0" } }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -20093,14 +19523,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svgpath": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/svgpath/-/svgpath-2.6.0.tgz", - "integrity": "sha512-OIWR6bKzXvdXYyO4DK/UWa1VA1JeKq8E+0ug2DG98Y/vOmMpfZNj+TIG988HjfYSqtcy/hFOtZq/n/j5GSESNg==", - "funding": { - "url": "https://github.com/fontello/svg2ttf?sponsor=1" - } - }, "node_modules/symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", @@ -21156,6 +20578,7 @@ "version": "3.17.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -21179,11 +20602,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" - }, "node_modules/undici": { "version": "6.11.1", "resolved": "https://registry.npmjs.org/undici/-/undici-6.11.1.tgz", @@ -21464,42 +20882,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/varstream": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/varstream/-/varstream-0.3.2.tgz", - "integrity": "sha512-OpR3Usr9dGZZbDttlTxdviGdxiURI0prX68+DuaN/JfIDbK9ZOmREKM6PgmelsejMnhgjXmEEEgf+E4NbsSqMg==", - "dependencies": { - "readable-stream": "^1.0.33" - }, - "bin": { - "json2varstream": "cli/json2varstream.js", - "varstream2json": "cli/varstream2json.js" - }, - "engines": { - "node": ">=0.10.*" - } - }, - "node_modules/varstream/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/varstream/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/varstream/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -22535,14 +21917,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -22551,7 +21925,8 @@ "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true }, "node_modules/wordwrapjs": { "version": "4.0.1", @@ -26219,11 +25594,6 @@ "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", "dev": true }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" - }, "@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", @@ -27005,131 +26375,6 @@ "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz", "integrity": "sha512-wO4Dk/rm8u7RNhOf95ZzcEmC9rYOncYgvq4z3duaJrCgjN8BxAnDVyndanfcJZ0O6XZzHz6Q0hTimxTg8Y9g/A==" }, - "@vusion/webfonts-generator": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@vusion/webfonts-generator/-/webfonts-generator-0.8.0.tgz", - "integrity": "sha512-1q17CF6umBEjlAtO37TzRw3aOCCAyFX+T4HPG70BmM6qx8s6H4/LQOa8eHFZq/oiMuMyd0FehKgUt/pqYlIMWA==", - "requires": { - "handlebars": "^4.0.11", - "mkdirp": "^1.0.4", - "q": "^1.1.2", - "svg2ttf": "^6.0.3", - "svgicons2svgfont": "^10.0.4", - "ttf2eot": "^3.0.0", - "ttf2woff": "^3.0.0", - "ttf2woff2": "^4.0.4", - "underscore": "^1.9.1", - "url-join": "^4.0.0" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "bufferstreams": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bufferstreams/-/bufferstreams-3.0.0.tgz", - "integrity": "sha512-Qg0ggJUWJq90vtg4lDsGN9CDWvzBMQxhiEkSOD/sJfYt6BLect3eV1/S6K7SCSKJ34n60rf6U5eUPmQENVE4UA==", - "requires": { - "readable-stream": "^3.4.0" - } - }, - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "svg-pathdata": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", - "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==" - }, - "svg2ttf": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/svg2ttf/-/svg2ttf-6.0.3.tgz", - "integrity": "sha512-CgqMyZrbOPpc+WqH7aga4JWkDPso23EgypLsbQ6gN3uoPWwwiLjXvzgrwGADBExvCRJrWFzAeK1bSoSpE7ixSQ==", - "requires": { - "@xmldom/xmldom": "^0.7.2", - "argparse": "^2.0.1", - "cubic2quad": "^1.2.1", - "lodash": "^4.17.10", - "microbuffer": "^1.0.0", - "svgpath": "^2.1.5" - } - }, - "svgicons2svgfont": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/svgicons2svgfont/-/svgicons2svgfont-10.0.6.tgz", - "integrity": "sha512-fUgQEVg3XwTbOHvlXahHGqCet5Wvfo1bV4DCvbSRvjsOCPCRunYbG4dUJCPegps37BMph3eOrfoobhH5AWuC6A==", - "requires": { - "commander": "^7.2.0", - "geometry-interfaces": "^1.1.4", - "glob": "^7.1.6", - "neatequal": "^1.0.0", - "readable-stream": "^3.4.0", - "sax": "^1.2.4", - "svg-pathdata": "^6.0.0" - } - }, - "ttf2eot": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ttf2eot/-/ttf2eot-3.1.0.tgz", - "integrity": "sha512-aHTbcYosNHVqb2Qtt9Xfta77ae/5y0VfdwNLUS6sGBeGr22cX2JDMo/i5h3uuOf+FAD3akYOr17+fYd5NK8aXw==", - "requires": { - "argparse": "^2.0.1" - } - }, - "ttf2woff": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ttf2woff/-/ttf2woff-3.0.0.tgz", - "integrity": "sha512-OvmFcj70PhmAsVQKfC15XoKH55cRWuaRzvr2fpTNhTNer6JBpG8n6vOhRrIgxMjcikyYt88xqYXMMVapJ4Rjvg==", - "requires": { - "argparse": "^2.0.1", - "pako": "^1.0.0" - } - }, - "ttf2woff2": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/ttf2woff2/-/ttf2woff2-4.0.5.tgz", - "integrity": "sha512-zpoU0NopfjoyVqkFeQ722SyKk/n607mm5OHxuDS/wCCSy82B8H3hHXrezftA2KMbKqfJIjie2lsJHdvPnBGbsw==", - "requires": { - "bindings": "^1.5.0", - "bufferstreams": "^3.0.0", - "nan": "^2.14.2", - "node-gyp": "^9.0.0" - } - }, - "url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" - } - } - }, "@w11k/ngx-componentdestroyed": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@w11k/ngx-componentdestroyed/-/ngx-componentdestroyed-5.0.2.tgz", @@ -27289,11 +26534,6 @@ "html2canvas": "^1.4.1" } }, - "@xmldom/xmldom": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.7.13.tgz", - "integrity": "sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==" - }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -27336,11 +26576,6 @@ } } }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -27392,22 +26627,6 @@ } } }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "requires": { - "humanize-ms": "^1.2.1" - } - }, "aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -27772,20 +26991,6 @@ } } }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -28264,14 +27469,6 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -28427,60 +27624,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" }, - "cacache": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.3.tgz", - "integrity": "sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==", - "requires": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" - }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -28697,11 +27840,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, "colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", @@ -28871,11 +28009,6 @@ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==" }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -29230,11 +28363,6 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, - "cubic2quad": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cubic2quad/-/cubic2quad-1.2.1.tgz", - "integrity": "sha512-wT5Y7mO8abrV16gnssKdmIhIbA9wSkeMzhh27jAguKrV82i24wER0vL5TGhUJ9dbJNDcigoRZ0IAHFEEEI4THQ==" - }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -29436,11 +28564,6 @@ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -30962,11 +30085,6 @@ "flat-cache": "^3.0.4" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, "filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -31260,31 +30378,11 @@ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, - "gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, - "geometry-interfaces": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/geometry-interfaces/-/geometry-interfaces-1.1.4.tgz", - "integrity": "sha512-qD6OdkT6NcES9l4Xx3auTpwraQruU7dARbQPVO71MKvkGYw5/z/oIiGymuFXrRaEQa5Y67EIojUpaLeGEa5hGA==" - }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -31504,6 +30602,7 @@ "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, "requires": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -31515,7 +30614,8 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -31753,11 +30853,6 @@ "has-symbols": "^1.0.3" } }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -32002,16 +31097,6 @@ "requires-port": "^1.0.0" } }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, "http-proxy-middleware": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", @@ -32087,28 +31172,11 @@ } } }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "requires": { - "ms": "^2.0.0" - } - }, "i18n-js": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/i18n-js/-/i18n-js-4.4.3.tgz", @@ -33710,35 +32778,6 @@ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, - "make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" - } - } - }, "make-plural": { "version": "7.3.0", "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.3.0.tgz", @@ -33849,11 +32888,6 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, - "microbuffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/microbuffer/-/microbuffer-1.0.0.tgz", - "integrity": "sha512-O/SUXauVN4x6RaEJFqSPcXNtLFL+QzJHKZlyDVYFwcDDRVca3Fa/37QXXC+4zAGGa4YhHrHxKXuuHvLDIQECtA==" - }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -33939,29 +32973,6 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } - }, "minipass-fetch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", @@ -34162,11 +33173,6 @@ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==" }, - "nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" - }, "nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -34228,14 +33234,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "neatequal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/neatequal/-/neatequal-1.0.0.tgz", - "integrity": "sha512-sVt5awO4a4w24QmAthdrCPiVRW3naB8FGLdyadin01BH+6BzNPEBwGrpwCczQvPlULS6uXTItTe1PJ5P0kYm7A==", - "requires": { - "varstream": "^0.3.2" - } - }, "needle": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", @@ -34326,39 +33324,6 @@ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" }, - "node-gyp": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", - "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", - "requires": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^11.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, "node-gyp-build": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", @@ -34382,14 +33347,6 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, - "nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "requires": { - "abbrev": "^1.0.0" - } - }, "normalize-package-data": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", @@ -34575,17 +33532,6 @@ "path-key": "^3.0.0" } }, - "npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } - }, "nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -35606,11 +34552,6 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" - }, "qjobs": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", @@ -36222,7 +35163,8 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "optional": true }, "scheduler": { "version": "0.23.2", @@ -36442,11 +35384,6 @@ "send": "0.18.0" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, "set-function-length": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", @@ -36731,16 +35668,6 @@ "smart-buffer": "^4.2.0" } }, - "socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - } - }, "source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -37272,11 +36199,6 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, - "svgpath": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/svgpath/-/svgpath-2.6.0.tgz", - "integrity": "sha512-OIWR6bKzXvdXYyO4DK/UWa1VA1JeKq8E+0ug2DG98Y/vOmMpfZNj+TIG988HjfYSqtcy/hFOtZq/n/j5GSESNg==" - }, "symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", @@ -38080,6 +37002,7 @@ "version": "3.17.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, "optional": true }, "unbox-primitive": { @@ -38094,11 +37017,6 @@ "which-boxed-primitive": "^1.0.2" } }, - "underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" - }, "undici": { "version": "6.11.1", "resolved": "https://registry.npmjs.org/undici/-/undici-6.11.1.tgz", @@ -38305,37 +37223,6 @@ "builtins": "^5.0.0" } }, - "varstream": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/varstream/-/varstream-0.3.2.tgz", - "integrity": "sha512-OpR3Usr9dGZZbDttlTxdviGdxiURI0prX68+DuaN/JfIDbK9ZOmREKM6PgmelsejMnhgjXmEEEgf+E4NbsSqMg==", - "requires": { - "readable-stream": "^1.0.33" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - } - } - }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -38916,14 +37803,6 @@ "has-tostringtag": "^1.0.2" } }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", @@ -38932,7 +37811,8 @@ "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true }, "wordwrapjs": { "version": "4.0.1", diff --git a/frontend/package.json b/frontend/package.json index eaad830ac79d..40417cd475a1 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -105,7 +105,6 @@ "@uirouter/angular": "^13.0.0", "@uirouter/core": "^6.1.0", "@uirouter/rx": "^1.0.0", - "@vusion/webfonts-generator": "^0.8.0", "@w11k/ngx-componentdestroyed": "^5.0.2", "@xeokit/xeokit-bim-viewer": "2.5.1-beta-28", "autoprefixer": "^10.4.19", @@ -166,7 +165,6 @@ "build": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng build --configuration production --named-chunks --source-map", "build:watch": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng build --watch --named-chunks", "tokens:generate": "theo src/app/spot/styles/tokens/tokens.yml --transform web --format sass,json --dest src/app/spot/styles/tokens/dist", - "icon-font:generate": "node ./src/app/spot/icon-font/generate.js ./src/app/spot/icon-font", "serve": "node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng serve --host 0.0.0.0 --public-host http://${PROXY_HOSTNAME:-localhost}:4200", "serve:test": "node --max_old_space_size=8192 ./node_modules/@angular/cli/bin/ng serve --host 0.0.0.0 --disable-host-check --public-host http://frontend-test:4200", "test": "ng test --watch=false", diff --git a/frontend/src/app/spot/icon-font/README.md b/frontend/src/app/spot/icon-font/README.md index 6edf1555cc78..1ca2186b8ae0 100644 --- a/frontend/src/app/spot/icon-font/README.md +++ b/frontend/src/app/spot/icon-font/README.md @@ -1,6 +1,6 @@ -# OpenProject icon font +# OpenProject icon font (Deprecated) -**All icons and resulting fonts This directory is licensed under the Creative Commons Attribution 3.0 Unported License**. +**All icons and resulting fonts. This directory is licensed under the Creative Commons Attribution 3.0 Unported License**. Copyright (C) 2013 the OpenProject Foundation (OPF) This work is based on the following sources @@ -10,19 +10,16 @@ User Interface Design framework http://www.webalys.com/design-interface-applicat Creative Commons Attribution 3.0 Unported License This license can also be found at this permalink: http://creativecommons.org/licenses/by/3.0/ +## Deprecation warning + +We no longer recommend to use these icons as we decided to switch to the [Octicons](https://github.com/opf/openproject-octicons) provided by the [Primer Design System](https://primer.style/foundations/icons/). + ## Structure This directory is the source for the generated icon font in the Rails `frontend/src/global_styles/fonts` directory. -Since it seldomly changes, it is only rebuilt manually and on demand. ## Rebuilding -To rebuild the font (e.g., after changing icons in the source `src/` directory -under this README), use the npm task `icon-font:generate`. - -``` -$ cd frontend -$ npm run icon-font:generate -``` +We will no longer add icons to that font. diff --git a/frontend/src/app/spot/icon-font/generate.js b/frontend/src/app/spot/icon-font/generate.js deleted file mode 100644 index 4096638042bd..000000000000 --- a/frontend/src/app/spot/icon-font/generate.js +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env node - -const webfontsGenerator = require('@vusion/webfonts-generator'); -const path = require('path'); -const glob = require("glob") - -const TEMPLATE_DIR = path.resolve(process.argv[2]); -const CSS_FONT_URL = "../../../../../frontend/src/assets/fonts/openproject_icon/"; -const FONT_DESTINATION = path.resolve(__dirname, '..', '..', '..', '..', '..', 'frontend', 'src', 'assets', 'fonts', 'openproject_icon'); - -const files = glob.sync(path.join(TEMPLATE_DIR, 'src/*.svg')); -const filesBoxed = glob.sync(path.join(TEMPLATE_DIR, 'icons/*.svg')); - -webfontsGenerator({ - files: filesBoxed, - "fontName": "openproject-spot-icon-font", - "cssFontsUrl": "../../../../../frontend/src/assets/fonts/openproject_spot_icon/", - "dest": path.resolve(__dirname, '..', '..', '..', '..', '..', 'frontend', 'src', 'assets', 'fonts', 'openproject_spot_icon'), - "cssDest": path.join( - path.resolve(__dirname, '..', 'styles', 'sass', 'common'), - 'icon.sass', - ), - "cssTemplate": path.join(TEMPLATE_DIR, "icon.template.sass"), - "types": ['woff2', 'woff'], -}, function(error) { - if (error) { - console.log('Failed to build icon font. ', error); - } -}); - -webfontsGenerator({ - files, - "fontName": "openproject-icon-font", - "cssFontsUrl": CSS_FONT_URL, - "dest": FONT_DESTINATION, - "cssDest": path.join( - path.resolve(__dirname, '..', '..', '..', '..', '..', 'frontend', 'src', 'global_styles', 'fonts'), - '_openproject_icon_definitions.sass', - ), - "cssTemplate": path.join(TEMPLATE_DIR, "openproject-icon-font.template.sass"), - "classPrefix": "icon-", - "baseSelector": ".icon", - "html": true, - "types": ['woff2', 'woff'], - "fixedWidth": true, - "descent": 100 -}, function(error) { - if (error) { - console.log('Failed to build icon font. ', error); - } -}); diff --git a/nix/shell.nix b/nix/shell.nix index 26882d8b3227..fd099ddf44ca 100644 --- a/nix/shell.nix +++ b/nix/shell.nix @@ -1,7 +1,7 @@ { pkgs ? import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/8ca77a63599ed951d6a2d244c1d62092776a3fe1.tar.gz") {} }: with pkgs; -let +let op-get-test-failures = writeShellScriptBin "op-get-test-failures" '' exec ${curl}/bin/curl "$$1" | grep 'rspec \.\/' | cut -f3 -d' ' | paste -s -d ' ' ''; @@ -25,11 +25,9 @@ in gems op-get-test-failures - nodePackages.webfonts-generator ]; CHROME_BINARY = "${google-chrome}/bin/google-chrome"; OPENPROJECT_TESTING_NO_HEADLESS = "1"; OPENPROJECT_TESTING_AUTO_DEVTOOLS = "1"; } - From 19d66a9c0fa911fac3280860e6f60c53a164fd31 Mon Sep 17 00:00:00 2001 From: Eric Schubert Date: Mon, 10 Jun 2024 14:29:02 +0200 Subject: [PATCH 064/325] [#55193] change permission name - manage_storages_in_projects to manage_files_in_projects - change usage through app - projects->deactivate_work_package_attachments is now only available through manage_files_in_projects --- app/contracts/projects/update_contract.rb | 7 +++++++ app/controllers/projects_controller.rb | 7 +++++-- config/initializers/permissions.rb | 1 - .../storages/last_project_folders/delete_contract.rb | 2 +- .../project_storages/concerns/manage_storages_guarded.rb | 2 +- .../storages/project_storages/delete_contract.rb | 2 +- modules/storages/app/models/storages/storage.rb | 2 +- modules/storages/config/locales/en.yml | 2 +- modules/storages/lib/open_project/storages/engine.rb | 5 +++-- .../contracts/storages/file_links/delete_contract_spec.rb | 4 ++-- .../storages/project_storages/delete_contract_spec.rb | 8 ++++---- .../storages/project_storages/shared_contract_examples.rb | 5 ++--- .../delete_project_storage_and_file_links_spec.rb | 2 +- modules/storages/spec/features/hide_attachments_spec.rb | 2 +- .../storages/spec/features/manage_project_storage_spec.rb | 2 +- .../storages/project_settings/oauth_access_grant_spec.rb | 2 +- .../spec/features/view_project_storage_members_spec.rb | 4 ++-- .../spec/permissions/manage_storage_in_project_spec.rb | 2 +- .../spec/requests/api/v3/storages/storages_api_spec.rb | 4 ++-- .../project_settings/oauth_access_grant_flow_spec.rb | 2 +- modules/storages/spec/seeders/seeder_spec.rb | 2 +- .../storages/project_storages/delete_service_spec.rb | 2 +- spec/features/projects/copy_spec.rb | 2 +- spec/services/projects/copy_service_integration_spec.rb | 2 +- 24 files changed, 42 insertions(+), 33 deletions(-) diff --git a/app/contracts/projects/update_contract.rb b/app/contracts/projects/update_contract.rb index 471a55e86fb8..0e32fc699fab 100644 --- a/app/contracts/projects/update_contract.rb +++ b/app/contracts/projects/update_contract.rb @@ -31,6 +31,9 @@ class UpdateContract < BaseContract private def manage_permission + # Changes on attachment settings are only bound to the manage_files_in_project permission + return :manage_files_in_project if work_package_attachment_settings_changed? + if changed_by_user == ["active"] :archive_project else @@ -39,5 +42,9 @@ def manage_permission :edit_project end end + + def work_package_attachment_settings_changed? + model.settings_change.any? { |setting| setting.key?("deactivate_work_package_attachments") } + end end end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index a23acff93c7d..1a0c763ef454 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -92,8 +92,11 @@ def destroy_info end def deactivate_work_package_attachments - @project.deactivate_work_package_attachments = params[:value] != "1" - @project.save + call = Projects::UpdateService + .new(user: current_user, model: @project) + .call(deactivate_work_package_attachments: params[:value] != "1") + + render_403 if call.failure? end private diff --git a/config/initializers/permissions.rb b/config/initializers/permissions.rb index c92ee82c1f11..ec50d0425e42 100644 --- a/config/initializers/permissions.rb +++ b/config/initializers/permissions.rb @@ -95,7 +95,6 @@ { "projects/settings/general": %i[show], "projects/settings/storage": %i[show], - projects: %i[deactivate_work_package_attachments], "projects/templated": %i[create destroy], "projects/identifier": %i[show update] }, diff --git a/modules/storages/app/contracts/storages/last_project_folders/delete_contract.rb b/modules/storages/app/contracts/storages/last_project_folders/delete_contract.rb index 4c4841ee2a58..d53e7808a9a8 100644 --- a/modules/storages/app/contracts/storages/last_project_folders/delete_contract.rb +++ b/modules/storages/app/contracts/storages/last_project_folders/delete_contract.rb @@ -28,6 +28,6 @@ module Storages::LastProjectFolders class DeleteContract < ::DeleteContract - delete_permission(:manage_storages_in_project) + delete_permission(:manage_files_in_project) end end diff --git a/modules/storages/app/contracts/storages/project_storages/concerns/manage_storages_guarded.rb b/modules/storages/app/contracts/storages/project_storages/concerns/manage_storages_guarded.rb index 34a87b602790..ee1d62be94fc 100644 --- a/modules/storages/app/contracts/storages/project_storages/concerns/manage_storages_guarded.rb +++ b/modules/storages/app/contracts/storages/project_storages/concerns/manage_storages_guarded.rb @@ -42,7 +42,7 @@ module ManageStoragesGuarded # Check that the current has the permission on the project. # model variable is available because the concern is executed inside a contract. def validate_user_allowed_to_manage - unless user.allowed_in_project?(:manage_storages_in_project, model.project) + unless user.allowed_in_project?(:manage_files_in_project, model.project) errors.add :base, :error_unauthorized end end diff --git a/modules/storages/app/contracts/storages/project_storages/delete_contract.rb b/modules/storages/app/contracts/storages/project_storages/delete_contract.rb index 717fdf4656ab..b107bbe95122 100644 --- a/modules/storages/app/contracts/storages/project_storages/delete_contract.rb +++ b/modules/storages/app/contracts/storages/project_storages/delete_contract.rb @@ -28,6 +28,6 @@ module Storages::ProjectStorages class DeleteContract < ::DeleteContract - delete_permission(:manage_storages_in_project) + delete_permission(:manage_files_in_project) end end diff --git a/modules/storages/app/models/storages/storage.rb b/modules/storages/app/models/storages/storage.rb index 47d2f4c80494..2e4a06eeda75 100644 --- a/modules/storages/app/models/storages/storage.rb +++ b/modules/storages/app/models/storages/storage.rb @@ -66,7 +66,7 @@ class Storage < ApplicationRecord validates_uniqueness_of :name scope :visible, ->(user = User.current) do - if user.allowed_in_any_project?(:manage_storages_in_project) + if user.allowed_in_any_project?(:manage_files_in_project) all else where( diff --git a/modules/storages/config/locales/en.yml b/modules/storages/config/locales/en.yml index 55633291aed1..8e0acddddc4b 100644 --- a/modules/storages/config/locales/en.yml +++ b/modules/storages/config/locales/en.yml @@ -47,7 +47,7 @@ en: permission_delete_files_explanation: This permission is only available for Nextcloud storages permission_header_for_project_module_storages: Automatically managed project folders permission_manage_file_links: Manage file links - permission_manage_storages_in_project: Manage file storages in project + permission_manage_files_in_project: Manage files 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 diff --git a/modules/storages/lib/open_project/storages/engine.rb b/modules/storages/lib/open_project/storages/engine.rb index 489da74187af..da618a599ecb 100644 --- a/modules/storages/lib/open_project/storages/engine.rb +++ b/modules/storages/lib/open_project/storages/engine.rb @@ -128,7 +128,7 @@ def self.permissions # Permissions documentation: https://www.openproject.org/docs/development/concepts/permissions/#definition-of-permissions # Independent of storages module (Disabling storages module does not revoke enabled permissions). project_module nil, order: 100 do - permission :manage_storages_in_project, + permission :manage_files_in_project, { "storages/admin/project_storages": %i[external_file_storages attachments members @@ -141,6 +141,7 @@ def self.permissions destroy destroy_info set_permissions], + projects: %i[deactivate_work_package_attachments], "storages/project_settings/project_storage_members": %i[index] }, permissible_on: :project, dependencies: %i[] @@ -187,7 +188,7 @@ def self.permissions menu :project_menu, :settings_project_storages, { controller: "/storages/admin/project_storages", action: "external_file_storages" }, - if: lambda { |project| User.current.allowed_in_project?(:manage_storages_in_project, project) }, + if: lambda { |project| User.current.allowed_in_project?(:manage_files_in_project, project) }, caption: :project_module_storages, parent: :settings diff --git a/modules/storages/spec/contracts/storages/file_links/delete_contract_spec.rb b/modules/storages/spec/contracts/storages/file_links/delete_contract_spec.rb index 744ea35af08b..722cfec32100 100644 --- a/modules/storages/spec/contracts/storages/file_links/delete_contract_spec.rb +++ b/modules/storages/spec/contracts/storages/file_links/delete_contract_spec.rb @@ -45,11 +45,11 @@ end # Default test setup should be valid ("happy test setup"). - # This tests works with manage_storages_in_project permissions for current_user. + # This tests works with manage_files_in_project permissions for current_user. it_behaves_like "contract is valid" # Now we remove the permissions from the user by creating a role without special perms. - context "without manage_storages_in_project permission for project" do + context "without manage_files_in_project permission for project" do let(:role) { create(:project_role) } it_behaves_like "contract is invalid" diff --git a/modules/storages/spec/contracts/storages/project_storages/delete_contract_spec.rb b/modules/storages/spec/contracts/storages/project_storages/delete_contract_spec.rb index 612b6ffe51c0..30ed6e875568 100644 --- a/modules/storages/spec/contracts/storages/project_storages/delete_contract_spec.rb +++ b/modules/storages/spec/contracts/storages/project_storages/delete_contract_spec.rb @@ -34,19 +34,19 @@ include_context "ModelContract shared context" let(:current_user) { create(:user) } - let(:role) { create(:project_role, permissions: [:manage_storages_in_project]) } + let(:role) { create(:project_role, permissions: [:manage_files_in_project]) } let(:project) { create(:project, members: { current_user => role }) } let(:project_storage) { create(:project_storage, project:) } let(:contract) { described_class.new(project_storage, current_user) } # Default test setup should be valid ("happy test setup"). # The example below was included above from "ModelContract shared context". - # This tests works with manage_storages_in_project permissions for current_user. + # This tests works with manage_files_in_project permissions for current_user. it_behaves_like "contract is valid" # Now we remove the permissions from the user by creating a role without special perms. - context "without manage_storages_in_project permission for project" do - # existing_role is a role _without_ the :manage_storages_in_project permission + context "without manage_files_in_project permission for project" do + # existing_role is a role _without_ the :manage_files_in_project permission let(:role) { create(:project_role) } it_behaves_like "contract is invalid" diff --git a/modules/storages/spec/contracts/storages/project_storages/shared_contract_examples.rb b/modules/storages/spec/contracts/storages/project_storages/shared_contract_examples.rb index df44a81e358c..e2bb1fc480d5 100644 --- a/modules/storages/spec/contracts/storages/project_storages/shared_contract_examples.rb +++ b/modules/storages/spec/contracts/storages/project_storages/shared_contract_examples.rb @@ -38,8 +38,7 @@ include_context "ModelContract shared context" let(:current_user) { create(:user) } - # The user needs "edit_project" to see the project's settings page - let(:role) { create(:project_role, permissions: %i[manage_storages_in_project edit_project]) } + let(:role) { create(:project_role, permissions: %i[manage_files_in_project]) } # Create a project managed by current user and with Storages enabled. let(:project) do create(:project, @@ -50,7 +49,7 @@ let(:storage_creator) { current_user } # This is not 100% precise, as the required permission is not :admin - # but :manage_storages_in_project, but let's still include this. + # but :manage_files_in_project, but let's still include this. it_behaves_like "contract is valid for active admins and invalid for regular users" describe "validations" do diff --git a/modules/storages/spec/features/delete_project_storage_and_file_links_spec.rb b/modules/storages/spec/features/delete_project_storage_and_file_links_spec.rb index 10536d280c61..ff0e9b2af7ff 100644 --- a/modules/storages/spec/features/delete_project_storage_and_file_links_spec.rb +++ b/modules/storages/spec/features/delete_project_storage_and_file_links_spec.rb @@ -35,7 +35,7 @@ # objects. RSpec.describe "Delete ProjectStorage with FileLinks", :js, :with_cuprite, :webmock do let(:user) { create(:user) } - let(:role) { create(:project_role, permissions: [:manage_storages_in_project]) } + let(:role) { create(:project_role, permissions: [:manage_files_in_project]) } let(:project) do create(:project, name: "Project 1", diff --git a/modules/storages/spec/features/hide_attachments_spec.rb b/modules/storages/spec/features/hide_attachments_spec.rb index 44a219d2a444..1f1ac0b4d302 100644 --- a/modules/storages/spec/features/hide_attachments_spec.rb +++ b/modules/storages/spec/features/hide_attachments_spec.rb @@ -34,7 +34,7 @@ RSpec.describe "Hide attachments", :js, :with_cuprite do let(:permissions) do %i(add_work_packages - manage_storages_in_project + manage_files_in_project edit_project view_work_packages edit_work_packages diff --git a/modules/storages/spec/features/manage_project_storage_spec.rb b/modules/storages/spec/features/manage_project_storage_spec.rb index 05fe84704969..758055dd9f03 100644 --- a/modules/storages/spec/features/manage_project_storage_spec.rb +++ b/modules/storages/spec/features/manage_project_storage_spec.rb @@ -47,7 +47,7 @@ # to provide the user with the edit_project permission in the role. let(:role) do create(:project_role, - permissions: %i[manage_storages_in_project + permissions: %i[manage_files_in_project select_project_modules edit_project]) end diff --git a/modules/storages/spec/features/storages/project_settings/oauth_access_grant_spec.rb b/modules/storages/spec/features/storages/project_settings/oauth_access_grant_spec.rb index 2c07294ab8f0..a1af0089e163 100644 --- a/modules/storages/spec/features/storages/project_settings/oauth_access_grant_spec.rb +++ b/modules/storages/spec/features/storages/project_settings/oauth_access_grant_spec.rb @@ -37,7 +37,7 @@ shared_let(:user) { create(:user, preferences: { time_zone: "Etc/UTC" }) } shared_let(:role) do - create(:project_role, permissions: %i[manage_storages_in_project + create(:project_role, permissions: %i[manage_files_in_project oauth_access_grant select_project_modules edit_project]) diff --git a/modules/storages/spec/features/view_project_storage_members_spec.rb b/modules/storages/spec/features/view_project_storage_members_spec.rb index 62cf7b190511..ebc2fecbeed2 100644 --- a/modules/storages/spec/features/view_project_storage_members_spec.rb +++ b/modules/storages/spec/features/view_project_storage_members_spec.rb @@ -105,8 +105,8 @@ end def create_project_with_storage_and_members - role_can_read_files = create(:project_role, permissions: %i[manage_storages_in_project read_files]) - role_cannot_read_files = create(:project_role, permissions: %i[manage_storages_in_project]) + role_can_read_files = create(:project_role, permissions: %i[manage_files_in_project read_files]) + role_cannot_read_files = create(:project_role, permissions: %i[manage_files_in_project]) create(:project, members: { user => role_can_read_files, diff --git a/modules/storages/spec/permissions/manage_storage_in_project_spec.rb b/modules/storages/spec/permissions/manage_storage_in_project_spec.rb index 659be862fbf9..19bc031c5828 100644 --- a/modules/storages/spec/permissions/manage_storage_in_project_spec.rb +++ b/modules/storages/spec/permissions/manage_storage_in_project_spec.rb @@ -36,7 +36,7 @@ include PermissionSpecs controller_actions.each do |action| - check_permission_required_for("#{described_class.controller_path}##{action}", :manage_storages_in_project) + check_permission_required_for("#{described_class.controller_path}##{action}", :manage_files_in_project) end end # rubocop:enable RSpec/EmptyExampleGroup diff --git a/modules/storages/spec/requests/api/v3/storages/storages_api_spec.rb b/modules/storages/spec/requests/api/v3/storages/storages_api_spec.rb index fccff3ac72d3..911174b764bd 100644 --- a/modules/storages/spec/requests/api/v3/storages/storages_api_spec.rb +++ b/modules/storages/spec/requests/api/v3/storages/storages_api_spec.rb @@ -210,8 +210,8 @@ end end - context "if user has :manage_storages_in_project permission in any project" do - let(:permissions) { %i(manage_storages_in_project) } + context "if user has :manage_files_in_project permission in any project" do + let(:permissions) { %i(manage_files_in_project) } it_behaves_like "successful storage response" end diff --git a/modules/storages/spec/requests/storages/project_settings/oauth_access_grant_flow_spec.rb b/modules/storages/spec/requests/storages/project_settings/oauth_access_grant_flow_spec.rb index 5578f632ee48..f925e9a49a11 100644 --- a/modules/storages/spec/requests/storages/project_settings/oauth_access_grant_flow_spec.rb +++ b/modules/storages/spec/requests/storages/project_settings/oauth_access_grant_flow_spec.rb @@ -33,7 +33,7 @@ shared_let(:user) { create(:user, preferences: { time_zone: "Etc/UTC" }) } shared_let(:role) do - create(:project_role, permissions: %i[manage_storages_in_project + create(:project_role, permissions: %i[manage_files_in_project oauth_access_grant select_project_modules edit_project]) diff --git a/modules/storages/spec/seeders/seeder_spec.rb b/modules/storages/spec/seeders/seeder_spec.rb index 4c9f0f225a00..b18a2b1b3390 100644 --- a/modules/storages/spec/seeders/seeder_spec.rb +++ b/modules/storages/spec/seeders/seeder_spec.rb @@ -37,6 +37,6 @@ expect(RolePermission.where(permission: :view_file_links).count).to eq 7 expect(RolePermission.where(permission: :manage_file_links).count).to eq 2 - expect(RolePermission.where(permission: :manage_storages_in_project).count).to eq 1 + expect(RolePermission.where(permission: :manage_files_in_project).count).to eq 1 end end diff --git a/modules/storages/spec/services/storages/project_storages/delete_service_spec.rb b/modules/storages/spec/services/storages/project_storages/delete_service_spec.rb index 6bbef03cc24d..ab4a59b5c86f 100644 --- a/modules/storages/spec/services/storages/project_storages/delete_service_spec.rb +++ b/modules/storages/spec/services/storages/project_storages/delete_service_spec.rb @@ -76,7 +76,7 @@ context "with records written to DB" do let(:user) { create(:user) } - let(:role) { create(:project_role, permissions: [:manage_storages_in_project]) } + let(:role) { create(:project_role, permissions: [:manage_files_in_project]) } let(:project) { create(:project, members: { user => role }) } let(:other_project) { create(:project) } let(:storage) { create(:nextcloud_storage) } diff --git a/spec/features/projects/copy_spec.rb b/spec/features/projects/copy_spec.rb index 9cc3f34fcc24..fcb488a02bb2 100644 --- a/spec/features/projects/copy_spec.rb +++ b/spec/features/projects/copy_spec.rb @@ -93,7 +93,7 @@ manage_types view_work_packages select_custom_fields - manage_storages_in_project + manage_files_in_project manage_file_links work_package_assigned) end diff --git a/spec/services/projects/copy_service_integration_spec.rb b/spec/services/projects/copy_service_integration_spec.rb index ff0f5fc06a14..6e3e43935cff 100644 --- a/spec/services/projects/copy_service_integration_spec.rb +++ b/spec/services/projects/copy_service_integration_spec.rb @@ -75,7 +75,7 @@ permissions: %i[copy_projects view_work_packages work_package_assigned - manage_storages_in_project + manage_files_in_project manage_file_links]) end shared_let(:new_project_role) { create(:project_role, permissions: %i[]) } From c09aa6e3e1ab5181a50f92f1a24ef6dda09a1a68 Mon Sep 17 00:00:00 2001 From: Eric Schubert Date: Mon, 10 Jun 2024 15:14:08 +0200 Subject: [PATCH 065/325] [#55193] added migration to rename existing roles and permissions --- app/controllers/projects_controller.rb | 6 +++++- ...10130953_rename_manage_storages_in_project_permission.rb | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 modules/storages/db/migrate/20240610130953_rename_manage_storages_in_project_permission.rb diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 1a0c763ef454..3e1040fed4aa 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -96,7 +96,11 @@ def deactivate_work_package_attachments .new(user: current_user, model: @project) .call(deactivate_work_package_attachments: params[:value] != "1") - render_403 if call.failure? + if call.failure? + return render_403 if call.errors.map(&:type).include?(:error_unauthorized) + + render_error({ message: call.errors.full_messages.join("\n") }) + end end private diff --git a/modules/storages/db/migrate/20240610130953_rename_manage_storages_in_project_permission.rb b/modules/storages/db/migrate/20240610130953_rename_manage_storages_in_project_permission.rb new file mode 100644 index 000000000000..6648a96ead06 --- /dev/null +++ b/modules/storages/db/migrate/20240610130953_rename_manage_storages_in_project_permission.rb @@ -0,0 +1,5 @@ +class RenameManageStoragesInProjectPermission < ActiveRecord::Migration[7.1] + def change + RolePermission.where(permission: "manage_storages_in_project").update_all(permission: "manage_files_in_project") + end +end From 922b4d60ee256dc22c400a9613bc8a9d12429289 Mon Sep 17 00:00:00 2001 From: Eric Schubert Date: Mon, 10 Jun 2024 15:59:28 +0200 Subject: [PATCH 066/325] [#55193] fixed precondition to avoid nil reference error --- app/contracts/projects/update_contract.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/contracts/projects/update_contract.rb b/app/contracts/projects/update_contract.rb index 0e32fc699fab..06ea67a9c37f 100644 --- a/app/contracts/projects/update_contract.rb +++ b/app/contracts/projects/update_contract.rb @@ -44,7 +44,9 @@ def manage_permission end def work_package_attachment_settings_changed? - model.settings_change.any? { |setting| setting.key?("deactivate_work_package_attachments") } + model.settings_changed? && model.settings_change.any? do |setting| + setting.key?("deactivate_work_package_attachments") + end end end end From 7ba1c9a522427179f6a68d2c6c2f32f7d47d678a Mon Sep 17 00:00:00 2001 From: ulferts Date: Mon, 10 Jun 2024 17:17:41 +0200 Subject: [PATCH 067/325] extend functionality to prepend_before_action and append_before_action --- .../concerns/accounts/authorization.rb | 24 +++++++++++++++---- .../concerns/authorization_spec.rb | 20 ++++++++++++++++ 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/app/controllers/concerns/accounts/authorization.rb b/app/controllers/concerns/accounts/authorization.rb index 7c7ffddabb42..e4d12dcb353d 100644 --- a/app/controllers/concerns/accounts/authorization.rb +++ b/app/controllers/concerns/accounts/authorization.rb @@ -124,14 +124,30 @@ def authorization_is_ensured?(action) class_methods do # Overriding before_action of rails to check if any authorization method is by now defined. def before_action(*names, &) - if METHODS_ENFORCING_AUTHORIZATION.intersect?(names) - no_authorization_required!(only: names.last.is_a?(Hash) ? Array(names.last[:only]) : [], - except: names.last.is_a?(Hash) ? Array(names.last[:except]) : []) - end + set_authorization_checked_if_covered(*names) + + super + end + + def prepend_before_action(*names, &) + set_authorization_checked_if_covered(*names) + + super + end + + def append_before_action(*names, &) + set_authorization_checked_if_covered(*names) super end + def set_authorization_checked_if_covered(*names) + return unless METHODS_ENFORCING_AUTHORIZATION.intersect?(names) + + authorization_checked!(only: names.last.is_a?(Hash) ? Array(names.last[:only]) : [], + except: names.last.is_a?(Hash) ? Array(names.last[:except]) : []) + end + def no_authorization_required!(only: [], except: []) only = Array(only) except = Array(except) diff --git a/spec/controllers/concerns/authorization_spec.rb b/spec/controllers/concerns/authorization_spec.rb index 97ce57187a9e..61c110c90f49 100644 --- a/spec/controllers/concerns/authorization_spec.rb +++ b/spec/controllers/concerns/authorization_spec.rb @@ -120,6 +120,26 @@ def other_before_action; end it_behaves_like "succeeds" end + context "with authorization checked via prepend_before_action" do + controller do + prepend_before_action :authorize + + include controller_setup + end + + it_behaves_like "succeeds" + end + + context "with authorization checked via append_before_action" do + controller do + append_before_action :authorize + + include controller_setup + end + + it_behaves_like "succeeds" + end + context "with another before action specified" do controller do before_action :other_before_action From 05f45731504eb6b1480ce6cfc6a83c615cc0eb15 Mon Sep 17 00:00:00 2001 From: ulferts Date: Mon, 10 Jun 2024 17:18:06 +0200 Subject: [PATCH 068/325] rely on constant in error message --- app/controllers/concerns/accounts/authorization.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/controllers/concerns/accounts/authorization.rb b/app/controllers/concerns/accounts/authorization.rb index e4d12dcb353d..afb6f4d6e3d5 100644 --- a/app/controllers/concerns/accounts/authorization.rb +++ b/app/controllers/concerns/accounts/authorization.rb @@ -51,8 +51,9 @@ def authorization_check_required raise <<-MESSAGE Authorization check required for #{params[:action]} in #{self.class.name}. - Use any method of 'authorize', 'authorize_global', 'authorize_in_optional_project' - or 'require_admin' to ensure authorization. If authorization is checked by any other means, + Use any method of + #{METHODS_ENFORCING_AUTHORIZATION.join(', ')} + to ensure authorization. If authorization is checked by any other means, affirm the same by calling 'authorization_checked!' in the controller. If the authorization does not need to be checked for this action, affirm the same by calling 'no_authorization_required!' MESSAGE From 563229dc3efa6cd26095846b7b7a08ad0c5c8dbb Mon Sep 17 00:00:00 2001 From: ulferts Date: Mon, 10 Jun 2024 17:19:55 +0200 Subject: [PATCH 069/325] rename method for clarity --- app/controllers/activities_controller.rb | 2 +- app/controllers/concerns/accounts/authorization.rb | 4 ++-- app/controllers/journals_controller.rb | 2 +- app/controllers/news_controller.rb | 2 +- app/controllers/search_controller.rb | 2 +- app/controllers/work_packages_controller.rb | 2 +- modules/boards/app/controllers/boards/boards_controller.rb | 2 +- .../app/controllers/calendar/calendars_controller.rb | 2 +- modules/gantt/app/controllers/gantt/gantt_controller.rb | 2 +- modules/gantt/app/controllers/gantt/menus_controller.rb | 2 +- modules/meeting/app/controllers/meetings_controller.rb | 2 +- .../reporting/app/controllers/cost_reports_controller.rb | 2 +- .../app/controllers/team_planner/team_planner_controller.rb | 2 +- spec/controllers/concerns/authorization_spec.rb | 6 +++--- 14 files changed, 17 insertions(+), 17 deletions(-) diff --git a/app/controllers/activities_controller.rb b/app/controllers/activities_controller.rb index 8093becbaf1e..1c66dec3058f 100644 --- a/app/controllers/activities_controller.rb +++ b/app/controllers/activities_controller.rb @@ -30,7 +30,7 @@ class ActivitiesController < ApplicationController include Layout menu_item :activity - before_action :authorize_in_optional_project, + before_action :load_and_authorize_in_optional_project, :verify_activities_module_activated, :determine_subprojects, :determine_author, diff --git a/app/controllers/concerns/accounts/authorization.rb b/app/controllers/concerns/accounts/authorization.rb index afb6f4d6e3d5..fd5620b6f762 100644 --- a/app/controllers/concerns/accounts/authorization.rb +++ b/app/controllers/concerns/accounts/authorization.rb @@ -31,7 +31,7 @@ module Accounts::Authorization extend ActiveSupport::Concern - METHODS_ENFORCING_AUTHORIZATION = %i[require_admin authorize authorize_global authorize_in_optional_project].freeze + METHODS_ENFORCING_AUTHORIZATION = %i[require_admin authorize authorize_global load_and_authorize_in_optional_project].freeze included do class_attribute :authorization_ensured, @@ -77,7 +77,7 @@ def authorize_global end # Find a project based on params[:project_id] - def authorize_in_optional_project + def load_and_authorize_in_optional_project @project = Project.find(params[:project_id]) if params[:project_id].present? do_authorize({ controller: params[:controller], action: params[:action] }, global: params[:project_id].blank?) diff --git a/app/controllers/journals_controller.rb b/app/controllers/journals_controller.rb index 31e664f0e600..5fbf7e6766fd 100644 --- a/app/controllers/journals_controller.rb +++ b/app/controllers/journals_controller.rb @@ -29,7 +29,7 @@ #++ class JournalsController < ApplicationController - before_action :authorize_in_optional_project, only: [:index] + before_action :load_and_authorize_in_optional_project, only: [:index] before_action :find_journal, :ensure_permitted, only: [:diff] diff --git a/app/controllers/news_controller.rb b/app/controllers/news_controller.rb index a124aac47151..27e9d57ef12e 100644 --- a/app/controllers/news_controller.rb +++ b/app/controllers/news_controller.rb @@ -36,7 +36,7 @@ class NewsController < ApplicationController before_action :find_project_from_association, except: %i[new create index] before_action :find_project, only: %i[new create] before_action :authorize, except: [:index] - before_action :authorize_in_optional_project, only: [:index] + before_action :load_and_authorize_in_optional_project, only: [:index] accept_key_auth :index def index diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb index a4b26fde274d..e29eeb94e44c 100644 --- a/app/controllers/search_controller.rb +++ b/app/controllers/search_controller.rb @@ -29,7 +29,7 @@ class SearchController < ApplicationController include Layout - before_action :authorize_in_optional_project, + before_action :load_and_authorize_in_optional_project, :prepare_tokens LIMIT = 10 diff --git a/app/controllers/work_packages_controller.rb b/app/controllers/work_packages_controller.rb index f66dcea7711b..d67001318a2b 100644 --- a/app/controllers/work_packages_controller.rb +++ b/app/controllers/work_packages_controller.rb @@ -36,7 +36,7 @@ class WorkPackagesController < ApplicationController before_action :authorize_on_work_package, :project, only: :show - before_action :authorize_in_optional_project, + before_action :load_and_authorize_in_optional_project, :check_allowed_export, :protect_from_unauthorized_export, only: :index authorization_checked! only: %i[index show] diff --git a/modules/boards/app/controllers/boards/boards_controller.rb b/modules/boards/app/controllers/boards/boards_controller.rb index 07e9f85d6b83..165b522196d5 100644 --- a/modules/boards/app/controllers/boards/boards_controller.rb +++ b/modules/boards/app/controllers/boards/boards_controller.rb @@ -2,7 +2,7 @@ module ::Boards class BoardsController < BaseController include Layout - before_action :authorize_in_optional_project + before_action :load_and_authorize_in_optional_project # The boards permission alone does not suffice # to view work packages diff --git a/modules/calendar/app/controllers/calendar/calendars_controller.rb b/modules/calendar/app/controllers/calendar/calendars_controller.rb index 2145a5b76e8c..9e6a2aa07580 100644 --- a/modules/calendar/app/controllers/calendar/calendars_controller.rb +++ b/modules/calendar/app/controllers/calendar/calendars_controller.rb @@ -28,7 +28,7 @@ module ::Calendar class CalendarsController < ApplicationController - before_action :authorize_in_optional_project + before_action :load_and_authorize_in_optional_project before_action :build_calendar_view, only: %i[new] before_action :authorize, except: %i[index new create] before_action :authorize_global, only: %i[index new create] diff --git a/modules/gantt/app/controllers/gantt/gantt_controller.rb b/modules/gantt/app/controllers/gantt/gantt_controller.rb index 69289d267474..3b75bcfbc59b 100644 --- a/modules/gantt/app/controllers/gantt/gantt_controller.rb +++ b/modules/gantt/app/controllers/gantt/gantt_controller.rb @@ -6,7 +6,7 @@ class GanttController < ApplicationController accept_key_auth :index - before_action :authorize_in_optional_project, :protect_from_unauthorized_export, only: :index + before_action :load_and_authorize_in_optional_project, :protect_from_unauthorized_export, only: :index before_action :load_and_validate_query, only: :index, unless: -> { request.format.html? } diff --git a/modules/gantt/app/controllers/gantt/menus_controller.rb b/modules/gantt/app/controllers/gantt/menus_controller.rb index 3e6cae9bdd82..0708b6a95ca1 100644 --- a/modules/gantt/app/controllers/gantt/menus_controller.rb +++ b/modules/gantt/app/controllers/gantt/menus_controller.rb @@ -27,7 +27,7 @@ # ++ module Gantt class MenusController < ApplicationController - before_action :authorize_in_optional_project + before_action :load_and_authorize_in_optional_project def show @sidebar_menu_items = menu_items diff --git a/modules/meeting/app/controllers/meetings_controller.rb b/modules/meeting/app/controllers/meetings_controller.rb index 07b9a2dbc7a3..733f49470292 100644 --- a/modules/meeting/app/controllers/meetings_controller.rb +++ b/modules/meeting/app/controllers/meetings_controller.rb @@ -28,7 +28,7 @@ class MeetingsController < ApplicationController around_action :set_time_zone - before_action :authorize_in_optional_project, only: %i[index new show create history] + before_action :load_and_authorize_in_optional_project, only: %i[index new show create history] before_action :verify_activities_module_activated, only: %i[history] before_action :determine_date_range, only: %i[history] before_action :determine_author, only: %i[history] diff --git a/modules/reporting/app/controllers/cost_reports_controller.rb b/modules/reporting/app/controllers/cost_reports_controller.rb index d333cf6430f2..81880f56d245 100644 --- a/modules/reporting/app/controllers/cost_reports_controller.rb +++ b/modules/reporting/app/controllers/cost_reports_controller.rb @@ -40,7 +40,7 @@ class CostReportsController < ApplicationController before_action :check_cache before_action :load_all - before_action :authorize_in_optional_project + before_action :load_and_authorize_in_optional_project before_action :find_optional_user include Layout diff --git a/modules/team_planner/app/controllers/team_planner/team_planner_controller.rb b/modules/team_planner/app/controllers/team_planner/team_planner_controller.rb index c720fd2ba2ac..a2e08ebef42a 100644 --- a/modules/team_planner/app/controllers/team_planner/team_planner_controller.rb +++ b/modules/team_planner/app/controllers/team_planner/team_planner_controller.rb @@ -2,7 +2,7 @@ module ::TeamPlanner class TeamPlannerController < BaseController include EnterpriseTrialHelper include Layout - before_action :authorize_in_optional_project + before_action :load_and_authorize_in_optional_project before_action :build_plan_view, only: %i[new] before_action :require_ee_token, except: %i[upsale] before_action :find_plan_view, only: %i[destroy] diff --git a/spec/controllers/concerns/authorization_spec.rb b/spec/controllers/concerns/authorization_spec.rb index 61c110c90f49..45296d7eaf84 100644 --- a/spec/controllers/concerns/authorization_spec.rb +++ b/spec/controllers/concerns/authorization_spec.rb @@ -46,7 +46,7 @@ def authorize_global; end def authorize; end - def authorize_in_optional_project; end + def load_and_authorize_in_optional_project; end def other_before_action; end end @@ -110,9 +110,9 @@ def other_before_action; end it_behaves_like "succeeds" end - context "with authorization checked with authorize_in_optional_project" do + context "with authorization checked with load_and_authorize_in_optional_project" do controller do - before_action :authorize_in_optional_project + before_action :load_and_authorize_in_optional_project include controller_setup end From 683bb65dbdd99f49b40bed7b4a6a5697a7d1b0bd Mon Sep 17 00:00:00 2001 From: ulferts Date: Mon, 10 Jun 2024 17:26:17 +0200 Subject: [PATCH 070/325] remove parameters from methods used as before actions --- app/controllers/concerns/accounts/authorization.rb | 7 +++---- spec/support/permission_specs.rb | 8 ++++++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/controllers/concerns/accounts/authorization.rb b/app/controllers/concerns/accounts/authorization.rb index fd5620b6f762..8000d6ac7665 100644 --- a/app/controllers/concerns/accounts/authorization.rb +++ b/app/controllers/concerns/accounts/authorization.rb @@ -65,15 +65,14 @@ def authorization_check_required # Authorize the user for the requested controller action. # To be used in before_action hooks - def authorize(ctrl = params[:controller], action = params[:action]) - do_authorize({ controller: ctrl, action: }, global: false) + def authorize + do_authorize({ controller: params[:controller], action: params[:action] }, global: false) end # Authorize the user for the requested controller action outside a project # To be used in before_action hooks def authorize_global - action = { controller: params[:controller], action: params[:action] } - do_authorize(action, global: true) + do_authorize({ controller: params[:controller], action: params[:action] }, global: true) end # Find a project based on params[:project_id] diff --git a/spec/support/permission_specs.rb b/spec/support/permission_specs.rb index 389e356dbe9a..caf21413d0a1 100644 --- a/spec/support/permission_specs.rb +++ b/spec/support/permission_specs.rb @@ -52,15 +52,19 @@ def self.check_permission_required_for(controller_action, permission) controller_name, action_name = controller_action.split("#") it "allows calling #{controller_action} when having the permission #{permission}" do + controller.params = { controller: controller_name, action: action_name } + become_member_with_permissions(project, current_user, permission) - expect(controller.send(:authorize, controller_name, action_name)).to be_truthy + expect(controller.send(:authorize)).to be_truthy end it "prevents calling #{controller_action} when not having the permission #{permission}" do + controller.params = { controller: controller_name, action: action_name } + become_member(project, current_user) - expect(controller.send(:authorize, controller_name, action_name)).to be_falsey + expect(controller.send(:authorize)).to be_falsey end end From 1fe87761691669d86ca4bf416710b07ca306ca7e Mon Sep 17 00:00:00 2001 From: Dombi Attila <83396+dombesz@users.noreply.github.com> Date: Mon, 10 Jun 2024 19:22:45 +0300 Subject: [PATCH 071/325] [#55254] Switch to show favorite projects is shown for anonymous user https://community.openproject.org/work_packages/55254 --- .../header-project-select.component.html | 1 + spec/features/projects/favorite_spec.rb | 146 ++++++++++-------- 2 files changed, 82 insertions(+), 65 deletions(-) diff --git a/frontend/src/app/shared/components/header-project-select/header-project-select.component.html b/frontend/src/app/shared/components/header-project-select/header-project-select.component.html index 98601df70101..d925b5dad291 100644 --- a/frontend/src/app/shared/components/header-project-select/header-project-select.component.html +++ b/frontend/src/app/shared/components/header-project-select/header-project-select.component.html @@ -29,6 +29,7 @@ > diff --git a/spec/features/projects/favorite_spec.rb b/spec/features/projects/favorite_spec.rb index 30e5f606b39a..bc581a19456c 100644 --- a/spec/features/projects/favorite_spec.rb +++ b/spec/features/projects/favorite_spec.rb @@ -30,8 +30,8 @@ require_relative "../../../modules/my_page/spec/support/pages/my/page" RSpec.describe "Favorite projects", :js do - shared_let(:project) { create(:project, name: "My favorite!", enabled_module_names: []) } - shared_let(:other_project) { create(:project, name: "Other project", enabled_module_names: []) } + shared_let(:project) { create(:public_project, name: "My favorite!", enabled_module_names: []) } + shared_let(:other_project) { create(:public_project, name: "Other project", enabled_module_names: []) } shared_let(:user) do create(:user, member_with_permissions: { @@ -44,100 +44,116 @@ let(:my_page) do Pages::My::Page.new end + context "as a user" do + before do + login_as user + end - before do - login_as user - end + it "allows favoriting and unfavoriting projects" do + visit project_path(project) + expect(page).to have_css "a", accessible_name: "Add to favorites" - it "allows favoriting and unfavoriting projects" do - visit project_path(project) - expect(page).to have_selector 'a', accessible_name: "Add to favorites" + click_link_or_button(accessible_name: "Add to favorites") - click_link_or_button(accessible_name: "Add to favorites") + expect(page).to have_css "a", accessible_name: "Remove from favorite" - expect(page).to have_selector 'a', accessible_name: "Remove from favorite" + project.reload + expect(project).to be_favored_by(user) - project.reload - expect(project).to be_favored_by(user) + projects_page.visit! + projects_page.open_filters + projects_page.filter_by_favored "yes" - projects_page.visit! - projects_page.open_filters - projects_page.filter_by_favored "yes" + expect(page).to have_text "My favorite!" - expect(page).to have_text 'My favorite!' + projects_page.visit! + projects_page.open_filters + projects_page.filter_by_favored "no" - projects_page.visit! - projects_page.open_filters - projects_page.filter_by_favored "no" + expect(page).to have_no_text "My favorite!" + + visit home_path - expect(page).to have_no_text 'My favorite!' + expect(page).to have_text "Favorite projects" + expect(page).to have_test_selector "favorite-project", text: "My favorite!" - visit home_path + retry_block do + top_menu.toggle unless top_menu.open? + top_menu.expect_open - expect(page).to have_text 'Favorite projects' - expect(page).to have_test_selector 'favorite-project', text: 'My favorite!' + # projects are displayed initially + top_menu.expect_result project.name + top_menu.expect_result other_project.name + end - retry_block do - top_menu.toggle unless top_menu.open? - top_menu.expect_open + top_menu.switch_mode "Favorites" - # projects are displayed initially top_menu.expect_result project.name - top_menu.expect_result other_project.name + top_menu.expect_no_result other_project.name end - top_menu.switch_mode "Favorites" + context "when project is favored" do + before do + project.add_favoring_user(user) + other_project.add_favoring_user(user) + other_project.update! active: false + end - top_menu.expect_result project.name - top_menu.expect_no_result other_project.name - end + it "does not show archived projects" do + visit home_path - context "when projct is favored" do - before do - project.add_favoring_user(user) - other_project.add_favoring_user(user) - other_project.update! active: false - end + expect(page).to have_text "Favorite projects" + expect(page).to have_test_selector "favorite-project", text: "My favorite!" + expect(page).to have_no_text "Other project" - it "does not show archived projects" do - visit home_path + my_page.visit! + my_page.add_widget(1, 1, :within, "Favorite projects") + expect(page).to have_text "My favorite!" + end + end - expect(page).to have_text 'Favorite projects' - expect(page).to have_test_selector 'favorite-project', text: 'My favorite!' - expect(page).to have_no_text 'Other project' + context "when favoriting only one subproject" do + before do + project.update! parent: other_project + project.add_favoring_user(user) + end - my_page.visit! - my_page.add_widget(1, 1, :within, "Favorite projects") - expect(page).to have_text 'My favorite!' - end - end + it "still shows up in top menu (Regression #54729)" do + visit home_path - context "favoriting only one subproject" do - before do - project.update! parent: other_project - project.add_favoring_user(user) - end + expect(page).to have_text "Favorite projects" + expect(page).to have_test_selector "favorite-project", text: "My favorite!" - it "still shows up in top menu (Regression #54729)" do - visit home_path + retry_block do + top_menu.toggle unless top_menu.open? + top_menu.expect_open - expect(page).to have_text 'Favorite projects' - expect(page).to have_test_selector 'favorite-project', text: 'My favorite!' + # projects are displayed initially + top_menu.expect_result project.name + top_menu.expect_result other_project.name + end - retry_block do - top_menu.toggle unless top_menu.open? - top_menu.expect_open + top_menu.switch_mode "Favorites" - # projects are displayed initially top_menu.expect_result project.name + # Parent is also shown top_menu.expect_result other_project.name end + end + end - top_menu.switch_mode "Favorites" + context "as an Anonymous User with not login required", with_settings: { login_required: false } do + it "does not shows favored projects" do + visit project_path(project) - top_menu.expect_result project.name - # Parent is also shown - top_menu.expect_result other_project.name + retry_block do + top_menu.toggle unless top_menu.open? + top_menu.expect_open + + within(".op-project-list-modal--header") do + expect(page).to have_no_css("[data-test-selector=\"spot-toggle--option\"]", text: "Favorites") + end + end end end end From 088329d5086c0ece2df216c0f452a389d1cc835c Mon Sep 17 00:00:00 2001 From: ulferts Date: Mon, 10 Jun 2024 21:30:47 +0200 Subject: [PATCH 072/325] attempt to focus on explicitly allowing no_authorization_required! --- app/controllers/account_controller.rb | 14 +++++++++++++- app/controllers/angular_controller.rb | 2 +- app/controllers/oauth/auth_base_controller.rb | 4 +++- .../app/controllers/avatars/avatar_controller.rb | 2 +- .../authentication_controller.rb | 7 ++++++- .../my/remember_cookie_controller.rb | 2 +- .../my/two_factor_devices_controller.rb | 11 +++++++++-- spec/features/auth/login_spec.rb | 2 +- 8 files changed, 35 insertions(+), 9 deletions(-) diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb index 12e7243cb5d2..7c977c1fd01c 100644 --- a/app/controllers/account_controller.rb +++ b/app/controllers/account_controller.rb @@ -36,7 +36,19 @@ class AccountController < ApplicationController # prevents login action to be filtered by check_if_login_required application scope filter skip_before_action :check_if_login_required - no_authorization_required! + no_authorization_required! only: %i[login + internal_login + logout + lost_password + register + activate + consent + confirm_consent + decline_consent + stage_success + stage_failure + change_password + auth_source_sso_failed] before_action :apply_csp_appends, only: %i[login] before_action :disable_api diff --git a/app/controllers/angular_controller.rb b/app/controllers/angular_controller.rb index 8697a2fb39a7..dc70f86e0c89 100644 --- a/app/controllers/angular_controller.rb +++ b/app/controllers/angular_controller.rb @@ -29,7 +29,7 @@ class AngularController < ApplicationController before_action :require_login - no_authorization_required! + no_authorization_required! only: %i[empty_layout notifications_layout] def empty_layout # Frontend will handle rendering diff --git a/app/controllers/oauth/auth_base_controller.rb b/app/controllers/oauth/auth_base_controller.rb index 89a6b5f88fe2..d2b703007a61 100644 --- a/app/controllers/oauth/auth_base_controller.rb +++ b/app/controllers/oauth/auth_base_controller.rb @@ -37,7 +37,9 @@ class AuthBaseController < ::ApplicationController prepend_before_action :extend_content_security_policy skip_before_action :check_if_login_required - no_authorization_required! + no_authorization_required! only: %i[new + create + show] layout "only_logo" diff --git a/modules/avatars/app/controllers/avatars/avatar_controller.rb b/modules/avatars/app/controllers/avatars/avatar_controller.rb index a5a68b0f74e4..3450061cddcd 100644 --- a/modules/avatars/app/controllers/avatars/avatar_controller.rb +++ b/modules/avatars/app/controllers/avatars/avatar_controller.rb @@ -3,7 +3,7 @@ class AvatarController < ::ApplicationController before_action :ensure_enabled before_action :find_avatar - no_authorization_required! + no_authorization_required! only: %i[show] def show send_file @avatar.diskfile, diff --git a/modules/two_factor_authentication/app/controllers/two_factor_authentication/authentication_controller.rb b/modules/two_factor_authentication/app/controllers/two_factor_authentication/authentication_controller.rb index fdd4dc400c73..d94aa599058e 100644 --- a/modules/two_factor_authentication/app/controllers/two_factor_authentication/authentication_controller.rb +++ b/modules/two_factor_authentication/app/controllers/two_factor_authentication/authentication_controller.rb @@ -11,7 +11,12 @@ class AuthenticationController < ApplicationController # User is not yet logged in, so skip login required check skip_before_action :check_if_login_required - no_authorization_required! + no_authorization_required! only: %i[request_otp + confirm_otp + enter_backup_code + verify_backup_code + retry + webauthn_challenge] # Avoid catch-all from core resulting in methods before_action :only_post, only: :confirm_otp diff --git a/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/remember_cookie_controller.rb b/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/remember_cookie_controller.rb index 5be5a66ee3ae..eb23b6f50ba3 100644 --- a/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/remember_cookie_controller.rb +++ b/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/remember_cookie_controller.rb @@ -6,7 +6,7 @@ class RememberCookieController < ::ApplicationController # Ensure user is logged in before_action :require_login - no_authorization_required! + no_authorization_required! only: :destroy layout "my" menu_item :two_factor_authentication diff --git a/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/two_factor_devices_controller.rb b/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/two_factor_devices_controller.rb index 59f69f24c15d..4295a95a5eb1 100644 --- a/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/two_factor_devices_controller.rb +++ b/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/two_factor_devices_controller.rb @@ -4,9 +4,16 @@ class TwoFactorDevicesController < ::TwoFactorAuthentication::BaseController # Ensure user is logged in before_action :require_login before_action :set_user_variables - # Authorization is not handled explictly but as the user on which changes can be done is only the current user + # Authorization is not handled explicitly but as the user on which changes can be done is only the current user # (and that user needs to be logged in), no action harmful to other users can be done. - no_authorization_required! + no_authorization_required! only: %i[new + index + create + register + confirm + destroy + make_default + webauthn_challenge] before_action :find_device, except: %i[new index register webauthn_challenge] diff --git a/spec/features/auth/login_spec.rb b/spec/features/auth/login_spec.rb index fa3d27a7e515..882c3335fea0 100644 --- a/spec/features/auth/login_spec.rb +++ b/spec/features/auth/login_spec.rb @@ -109,7 +109,7 @@ def expect_not_being_logged_in end it "prevents login for a blocked user" do - user.lock! + user.locked! login_with(user.login, user.password) From cc726d78409add36b70e9bbfa84ba38702640c1e Mon Sep 17 00:00:00 2001 From: OpenProject Actions CI Date: Tue, 11 Jun 2024 03:05:54 +0000 Subject: [PATCH 073/325] update locales from crowdin [ci skip] --- config/locales/crowdin/de.yml | 90 +++++++++---------- config/locales/crowdin/ru.yml | 2 +- .../ldap_groups/config/locales/crowdin/ms.yml | 6 +- modules/meeting/config/locales/crowdin/de.yml | 8 +- modules/meeting/config/locales/crowdin/ms.yml | 6 +- .../config/locales/crowdin/ms.yml | 2 +- 6 files changed, 57 insertions(+), 57 deletions(-) diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index e78c40a105af..65cc621f0098 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -263,7 +263,7 @@ de: my: "Meine Projekte" favored: "Favorisierte Projekte" archived: "Archivierte Projekte" - public: "Public project lists" + public: "Öffentliche Projekte" my_private: "Meine privaten Projektlisten" new: placeholder: "Neue Projektliste" @@ -291,18 +291,18 @@ de: actions: label_enable_single: "In diesem Projekt aktiv, zum Deaktivieren anklicken" label_disable_single: "In diesem Projekt inaktiv, zum Aktivieren anklicken" - deactivate_for_project: "Deactivate for this project" + deactivate_for_project: "Für dieses Projekt deaktivieren" label_enable_all: "Alles aktivieren" label_disable_all: "Alles deaktivieren" is_required_blank_slate: - heading: Required in all projects - description: This project attribute is activated in all projects since the "Required in all projects" option is checked. It cannot be deactivated for individual projects. + heading: In allen Projekten erforderlich + description: Dieses Projekt-Attribut ist in allen Projekten aktiviert, da die Option "Benötigt in allen Projekten" aktiviert ist. Es kann nicht für einzelne Projekte deaktiviert werden. new_project_mapping_form: - add_projects: Add projects - include_sub_projects: Include sub-projects + add_projects: Projekte erstellen + include_sub_projects: Andere Projekte einbeziehen project_mapping_filter: - label: Search project - placeholder: Filter by text + label: Projekt suchen + placeholder: Nach Text filtern types: no_results_title_text: Derzeit stehen keine Typen zur Verfügung. form: @@ -320,11 +320,11 @@ de: success: "Die geänderte Liste wurde gespeichert" failure: "Die geänderte Liste kann nicht gespeichert werden: %{errors}" publish: - success: "The list has been made public" - failure: "The list cannot be made public: %{errors}" + success: "Die Liste wurde veröffentlicht" + failure: "Die Liste kann nicht veröffentlicht werden: %{errors}" unpublish: - success: "The list has been made private" - failure: "The list cannot be made private: %{errors}" + success: "Diese Liste wurde auf privat gestellt" + failure: "Die Liste kann nicht auf privat gestellt werden: %{errors}" can_be_saved: "Liste geändert:" can_be_saved_as: "Die Änderungen können nur in einer neuen Liste gespeichert werden:" members: @@ -459,9 +459,9 @@ de: no_results_title_text: Derzeit gibt es keine Arbeitspaket-Status. no_results_content_text: Neuen Status hinzufügen headers: - is_default: "Default" - is_closed: "Closed" - is_readonly: "Read-only" + is_default: "Standard" + is_closed: "Erledigt" + is_readonly: "Schreibgeschützt" excluded_from_totals: "Excluded from totals" themes: light: "Hell" @@ -632,7 +632,7 @@ de: status: is_closed: "Arbeitspaket geschlossen" is_readonly: "Arbeitspakete schreibgeschützt" - excluded_from_totals: "Exclude from calculation of totals in hierarchy" + excluded_from_totals: "Von der Berechnung der Gesamtsumme in der Hierarchie ausschließen" journal: notes: "Kommentare" member: @@ -773,7 +773,7 @@ de: before_or_equal_to: "muss vor oder gleich %{date} sein." blank: "muss ausgefüllt werden." blank_nested: "muss die Eigenschaft '%{property}' gesetzt haben." - cannot_delete_mapping: "is required. Cannot be deleted." + cannot_delete_mapping: "ist erforderlich. Kann nicht gelöscht werden." cant_link_a_work_package_with_a_descendant: "Ein Arbeitspaket kann nicht mit einer seiner Unteraufgaben verlinkt werden." circular_dependency: "Diese Beziehung würde eine zyklische Abhängigkeit erzeugen." confirmation: "stimmt nicht mit %{attribute} überein." @@ -934,8 +934,8 @@ de: nonexistent: "Die Spalte ‚%{column}‘ existiert nicht." format: "%{message}" group_by_hierarchies_exclusive: "schließt sich gegenseitig mit der Gruppierung nach \"%{group_by}\" aus. Beide können nicht zeitgleich aktiv sein." - can_only_be_modified_by_owner: "The query can only be modified by its owner." - need_permission_to_modify_public_query: "You cannot modify a public query." + can_only_be_modified_by_owner: "Die Abfrage kann nur vom Besitzer geändert werden" + need_permission_to_modify_public_query: "Du kannst eine öffentliche Abfrage nicht ändern." filters: custom_fields: inexistent: "Es existiert kein benutzerdefiniertes Feld für diesen Filter." @@ -969,14 +969,14 @@ de: base: working_days_are_missing: "Mindestens ein Wochentag muss als Arbeitstag definiert werden." previous_working_day_changes_unprocessed: "Die vorherigen Änderungen an der Konfiguration der Arbeitstage wurden noch nicht angewendet." - hours_per_day_are_missing: "The number of hours per day must be defined." - days_per_week_are_missing: "The number of days per week must be defined." - days_per_month_are_missing: "The number of days per month must be defined." - durations_are_not_positive_numbers: "The durations must be positive numbers." - hours_per_day_is_out_of_bounds: "Hours per day can't be more than 24" - days_per_week_is_out_of_bounds: "Days per week can't be more than 7" - days_per_month_is_out_of_bounds: "Days per month can't be more than 31" - days_per_week_and_days_per_month_are_inconsistent: "The number of days per week and the number of days per month must be consistent." + hours_per_day_are_missing: "Die Anzahl der Stunden pro Tag muss festgelegt werden." + days_per_week_are_missing: "Die Anzahl der Tage pro Woche muss festgelegt werden." + days_per_month_are_missing: "Die Anzahl der Tage pro Monat muss festgelegt werden." + durations_are_not_positive_numbers: "Die Dauer muss positiv sein" + hours_per_day_is_out_of_bounds: "Die Anzahl der Stunden pro Tag darf 24 nicht überschreiten." + days_per_week_is_out_of_bounds: "Die Anzahl der Tage pro Woche darf nicht mehr als 7 betragen." + days_per_month_is_out_of_bounds: "Die Anzahl der Tage pro Monat darf nicht mehr als 31 betragen." + days_per_week_and_days_per_month_are_inconsistent: "Die Anzahl der Tage pro Woche und die Anzahl der Tage pro Monat müssen einheitlich sein." time_entry: attributes: hours: @@ -1341,8 +1341,8 @@ de: button_revoke_access: "Zugang widerrufen" button_revoke_all: "Alles widerrufen" button_revoke_only: "Nur %{shared_role_name} widerrufen" - button_publish: "Make public" - button_unpublish: "Make private" + button_publish: "Veröffentlichen" + button_unpublish: "Als Privat festlegen" consent: checkbox_label: Ich habe die obigen Angaben zur Kenntnis genommen und erkläre mich einverstanden. failure_message: Einwilligung fehlgeschlagen, kann nicht fortfahren. @@ -1614,11 +1614,11 @@ de: image: omitted: "Bild nicht exportiert." macro: - error: "Macro error, %{message}" - attribute_not_found: "attribute not found: %{attribute}" - model_not_found: "invalid attribute model: %{model}" - resource_not_found: "resource not found: %{resource}" - rich_text_unsupported: "Rich text embedding currently not supported in export" + error: "Makrofehler, %{message}" + attribute_not_found: "Attribut nicht gefunden: %{attribute}" + model_not_found: "ungültiges Attributmodell: %{model}" + resource_not_found: "Ressource nicht gefunden: %{resource}" + rich_text_unsupported: "Rich-Text-Einbettung wird derzeit beim Export nicht unterstützt" units: hours: h days: d @@ -1689,9 +1689,9 @@ de: working: "%{date} ist jetzt ein Arbeitstag" non_working: "%{date} ist jetzt ein arbeitsfreier Tag" progress_mode_changed_to_status_based: Fortschrittberechnung wurde auf Status-basiert gesetzt - status_excluded_from_totals_set_to_false_message: now included in hierarchy totals - status_excluded_from_totals_set_to_true_message: now excluded from hierarchy totals - status_percent_complete_changed: "% complete changed from %{old_value}% to %{new_value}%" + status_excluded_from_totals_set_to_false_message: jetzt in den Gesamtwerten der Hierarchie enthalten + status_excluded_from_totals_set_to_true_message: jetzt von den Hierarchie-Gesamtwerten ausgeschlossen + status_percent_complete_changed: "% vollständig von %{old_value}% auf %{new_value} % geändert" system_update: file_links_journal: > Ab sofort erscheinen hier Aktivitäten, die sich auf Datei-Links beziehen (Dateien in externen Speichermedien) auf der Registerkarte Aktivität. Folgende Aktivitäten betreffen bereits existierende Links: @@ -2348,7 +2348,7 @@ de: label_workflow: "Workflow" label_workflow_plural: "Workflows" label_workflow_summary: "Zusammenfassung" - label_working_days_and_hours: "Working days and hours" + label_working_days_and_hours: "Arbeitstage und -stunden" label_x_closed_work_packages_abbr: one: "1 geschlossen" other: "%{count} geschlossen" @@ -2732,7 +2732,7 @@ de: permission_save_bcf_queries: "BCF-Abfragen speichern" permission_manage_public_bcf_queries: "Öffentliche BCF-Abfragen verwalten" permission_edit_attribute_help_texts: "Attribut-Hilfetxt bearbeiten" - permission_manage_public_project_queries: "Manage public project lists" + permission_manage_public_project_queries: "Öffentliche Projektlisten verwalten" placeholders: default: "-" project: @@ -2948,9 +2948,9 @@ de: setting_cross_project_work_package_relations: "Arbeitspaket-Beziehungen zwischen Projekten erlauben" setting_first_week_of_year: "Die erste Woche im Jahr enthält" setting_date_format: "Datum" - setting_days_per_month: "Days per month" + setting_days_per_month: "Tage pro Monat" setting_days_per_month_explanation: >- - This will define what is considered a "month" when displaying duration in a more natural way (for example, if a month is 20 days, 60 days would be 3 months. + Dies legt fest, was als "Monat" angesehen wird, wenn die Dauer auf gleichmäßige Weise angezeigt wird (zum Beispiel wenn die Länge eines Monats 20 Tage beträgt, wären 60 Tage 3 Monate). setting_default_language: "Standard-Sprache" setting_default_projects_modules: "Standardmäßig aktivierte Module für neue Projekte" setting_default_projects_public: "Neue Projekte sind standardmäßig öffentlich" @@ -2966,12 +2966,12 @@ de: setting_feeds_limit: "Max. Anzahl Einträge pro Atom-Feed" setting_file_max_size_displayed: "Maximale Größe inline angezeigter Textdateien" setting_host_name: "Hostname" - setting_hours_per_day: "Hours per day" + setting_hours_per_day: "Stunden pro Tag" setting_hours_per_day_explanation: >- - This will define what is considered a "day" when displaying duration in a more natural way (for example, if a day is 8 hours, 32 hours would be 4 days). - setting_days_per_week: "Days per week" + Dies legt fest, was als "Tag" angesehen wird, wenn die Dauer auf gleichmäßige Weise angezeigt wird (zum Beispiel wenn die Länge eines Tags 8 Stunden beträgt, wären 32 Stunden 4 Tage). + setting_days_per_week: "Tage pro Woche" setting_days_per_week_explanation: >- - This will define what is considered a "week" when displaying duration in a more natural way (for example, if a week is 5 days, 15 days would be 3 weeks). + Dies legt fest, was als "Woche" angesehen wird, wenn die Dauer auf gleichmäßige Weise angezeigt wird (zum Beispiel wenn die Länge einer Woche 5 Tage beträgt, wären 15 Tage 3 Wochen). setting_invitation_expiration_days: "Aktivierungs-Mail läuft ab nach" setting_work_package_done_ratio: "Fortschrittsberechnung" setting_work_package_done_ratio_field: "Arbeitsbezogen" diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index 189d831411dd..472607e0b17e 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -1058,7 +1058,7 @@ ru: only_values_greater_or_equal_zeroes_allowed: "Должно быть >= 0." format: "%{message}" remaining_hours: - not_a_number: "is not a valid duration." + not_a_number: "не является допустимой продолжительностью." cant_exceed_work: "Не может быть выше Работы." must_be_set_when_work_is_set: "Требуется, если установлен параметр «Работа»." format: "%{message}" diff --git a/modules/ldap_groups/config/locales/crowdin/ms.yml b/modules/ldap_groups/config/locales/crowdin/ms.yml index d9c231720d65..52ae887095f7 100644 --- a/modules/ldap_groups/config/locales/crowdin/ms.yml +++ b/modules/ldap_groups/config/locales/crowdin/ms.yml @@ -31,7 +31,7 @@ ms: synchronized_filters: add_new: 'Tambah saringan LDAP yang diselaraskan' singular: 'Penyaring sinkronisasi kumpulan LDAP' - plural: 'Penyaring sinkronisasi kumpulan LDAP' + plural: 'Penyaring sinkronisasi Kumpulan LDAP' label_n_groups_found: one: "1 kumpulan ditemui penyaring" other: "%{count} kumpulan ditemui penyaring" @@ -39,7 +39,7 @@ ms: destroy: title: 'Buang saringan yang diselaraskan %{name}' confirmation: "Jika anda teruskan, saringan yang diselaraskan %{name} dan semua kumpulan %{groups_count} yang dicipta melaluinya akan dikeluarkan." - removed_groups: "Amaran: Ini akan mengeluarkan kumpulan berikut dari OpenProject dan mengeluarkannya dari semua projek!" + removed_groups: "Amaran: Ini akan mengeluarkan kumpulan berikut daripada OpenProject dan mengeluarkannya daripada semua projek!" verification: "Masukkan nama penyaring %{name} untuk mengesahkan pembuangan." form: group_name_attribute_text: 'Masukkan atribut kumpulan LDAP yang digunakan untuk tetapkan nama kumpulan OpenProject.' @@ -59,7 +59,7 @@ ms:
Kumpulan diselaraskan setiap jam melalui tugasan cron. Sila lihat dokumentasi kami berkenaan topik ini. - no_results: 'Tiada kumpulan yang diseleraskan ditemui.' + no_results: 'Tiada kumpulan yang diselaraskan ditemui.' no_members: 'Kumpulan ini tidak mempunyai ahli yang diselaraskan lagi.' plural: 'Kumpulan-kumpulan LDAP yang diselaraskan' singular: 'Kumpulan LDAP yang diselaraskan' diff --git a/modules/meeting/config/locales/crowdin/de.yml b/modules/meeting/config/locales/crowdin/de.yml index 47b58d5629d2..924b863bc9ad 100644 --- a/modules/meeting/config/locales/crowdin/de.yml +++ b/modules/meeting/config/locales/crowdin/de.yml @@ -65,8 +65,8 @@ de: item: meeting_agenda_item: duration: - added: "auf %{value} eingestellt" - added_html: "auf %{value} eingestellt" + added: "auf %{value} setzen" + added_html: "auf %{value} setzen" removed: "entfernt" updated: "von %{old_value} zu %{value} geändert" updated_html: "von %{old_value} zu %{value} geändert" @@ -121,8 +121,8 @@ de: agenda: "Tagesordnung kopieren" agenda_text: "Tagesordnung der alten Besprechung kopieren" email: - send_emails: "Send emails" - send_invitation_emails: "Send out invitation emails upon creation" + send_emails: "E-Mails senden" + send_invitation_emails: "Einladungs-E-Mails bei Erstellung versenden" open_meeting_link: "Besprechung öffnen" invited: summary: "%{actor} hat Ihnen eine Einladung für die folgende Besprechung gesendet: %{title}" diff --git a/modules/meeting/config/locales/crowdin/ms.yml b/modules/meeting/config/locales/crowdin/ms.yml index a16185072566..f59a892525ca 100644 --- a/modules/meeting/config/locales/crowdin/ms.yml +++ b/modules/meeting/config/locales/crowdin/ms.yml @@ -127,11 +127,11 @@ ms: summary: "%{actor} telah menghantar anda jemputan ke mesyuarat %{title}" rescheduled: header: "Mesyuarat %{title} telah dijadualkan semula" - summary: "Mesyuarat %{title} telah dijadual semula oleh %{actor}" - body: "Mesyuarat %{title} telah dijadual semula oleh %{actor}" + summary: "Mesyuarat %{title} telah dijadualkan semula oleh %{actor}" + body: "Mesyuarat %{title} telah dijadualkan semula oleh %{actor}" old_date_time: "Tarikh/masa lama" new_date_time: "Tarikh/masa baharu" - label_mail_all_participants: "Hantar e-mel ke semua peserta" + label_mail_all_participants: "Hantar e-mel kepada semua peserta" types: classic: "Klasik" classic_text: "Aturkan mesyuarat anda dalam agenda teks yang boleh diformat dan diprotokol." diff --git a/modules/openid_connect/config/locales/crowdin/ms.yml b/modules/openid_connect/config/locales/crowdin/ms.yml index deb7931a0968..8a3f6a0ccf65 100644 --- a/modules/openid_connect/config/locales/crowdin/ms.yml +++ b/modules/openid_connect/config/locales/crowdin/ms.yml @@ -16,7 +16,7 @@ ms: openid_connect: menu_title: Penyedia OpenID providers: - label_add_new: Tambah penyedia OpenID baru + label_add_new: Tambah penyedia OpenID baharu label_edit: Edit penyedia OpenID %{name} no_results_table: Belum ada penyedia yang ditetapkan lagi. plural: Penyedia OpenID From 28887a260fc09d68d20ed2b99835c88d46d7180e Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Tue, 11 Jun 2024 05:33:22 +0200 Subject: [PATCH 074/325] fix colors on task board --- app/views/custom_styles/_primer_color_mapping.erb | 5 +++++ .../backlogs-page/styles/master_backlog.sass | 10 +++++----- .../backlogs/backlogs-page/styles/taskboard.sass | 12 +++++++----- .../openproject/_variable_defaults.scss | 1 + 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/app/views/custom_styles/_primer_color_mapping.erb b/app/views/custom_styles/_primer_color_mapping.erb index 90e1f1df15ff..bafdf801e415 100644 --- a/app/views/custom_styles/_primer_color_mapping.erb +++ b/app/views/custom_styles/_primer_color_mapping.erb @@ -69,4 +69,9 @@ --main-menu-border-width: 1px; --accent-color: var(--fgColor-accent); } + + [data-dark-theme=dark] { + --task-board-header-background-color: var(--header-bgColor) !important; + --link-text-decoration: none; + } diff --git a/frontend/src/app/features/backlogs/backlogs-page/styles/master_backlog.sass b/frontend/src/app/features/backlogs/backlogs-page/styles/master_backlog.sass index 1e712a015351..f25a565ef1a7 100644 --- a/frontend/src/app/features/backlogs/backlogs-page/styles/master_backlog.sass +++ b/frontend/src/app/features/backlogs/backlogs-page/styles/master_backlog.sass @@ -69,7 +69,7 @@ #rb #backlogs_container .backlog .header - background-color: #eee + background-color: var(--bgColor-muted) height: 30px position: relative width: 100% @@ -94,7 +94,7 @@ display: block .items display: none - background-color: #EEEEEE + background-color: var(--overlay-bgColor) border: 1px solid var(--borderColor-default) position: absolute top: 30px @@ -209,9 +209,9 @@ position: relative width: 100% &.odd - background-color: #F6F7F8 + background-color: var(--bgColor-neutral-muted) &.even - background-color: #FFF + background-color: var(--body-background) &.error.icon-bug background: none text-align: center @@ -220,7 +220,7 @@ color: red pointer-events: none &.hover, &:hover - background-color: rgb(254, 248, 168) + background-color: var(--highlight-neutral-bgColor) &.closed text-decoration: line-through .id diff --git a/frontend/src/app/features/backlogs/backlogs-page/styles/taskboard.sass b/frontend/src/app/features/backlogs/backlogs-page/styles/taskboard.sass index 623870356138..89058606ca30 100644 --- a/frontend/src/app/features/backlogs/backlogs-page/styles/taskboard.sass +++ b/frontend/src/app/features/backlogs/backlogs-page/styles/taskboard.sass @@ -27,7 +27,7 @@ */ @mixin story-header - background-color: #FFFFFF + background-color: var(--task-board-header-background-color) font-size: 1rem - rem-calc(5px) opacity: 0.8 filter: alpha(opacity = 80) @@ -87,7 +87,7 @@ width: 241px .board - background-color: #FCFCFC + background-color: var(--overlay-bgColor) border: 1px solid var(--borderColor-default) border-top: none margin-right: 10px @@ -96,7 +96,7 @@ border-collapse: collapse empty-cells: show tr:hover - background-color: #ffffff + background-color: var(--control-transparent-bgColor-hover) td border-right: 1px dotted #CFCFCF border-bottom: 1px dotted #CFCFCF @@ -116,9 +116,10 @@ width: 30px &.clickable:hover cursor: pointer - background-color: #ffffcc + background-color: var(--highlight-neutral-bgColor) .story, .label_sprint_impediments - background-color: #F8F6A5 + background-color: var(--color-scale-yellow-0) + color: var(--fgColor-muted) border: none display: block min-height: 100px @@ -138,6 +139,7 @@ text-decoration: line-through .work_package, .placeholder background-color: #AFAFAF + color: var(--color-scale-black) border: none cursor: move display: block diff --git a/frontend/src/global_styles/openproject/_variable_defaults.scss b/frontend/src/global_styles/openproject/_variable_defaults.scss index 79e76145d020..9c4ed8a3bcb3 100644 --- a/frontend/src/global_styles/openproject/_variable_defaults.scss +++ b/frontend/src/global_styles/openproject/_variable_defaults.scss @@ -143,4 +143,5 @@ --list-item-hover--border-color: transparent; --list-item-hover--color: var(--accent-color); --link-text-decoration: none; + --task-board-header-background-color: #FFFFFF; } From 417f82023db4df51c02efda94144d7aaa5dad6be Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Tue, 11 Jun 2024 05:55:57 +0200 Subject: [PATCH 075/325] fix colors in notification center --- .../entry/in-app-notification-entry.component.sass | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass b/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass index f978129b80dc..1eced56281bb 100644 --- a/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass +++ b/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass @@ -1,11 +1,11 @@ @import "helpers" -$ian-bg-color: #FFFFFF -$ian-bg-hover-color: var(--gray-light) -$ian-bg-read-color: #F3F3F3 -$ian-bg-read-hover-color: darken($ian-bg-read-color, 2) -$ian-bg-selected-color: #D1E5F5 -$ian-bg-selected-hover-color: darken($ian-bg-selected-color, 2) +$ian-bg-color: var(--overlay-bgColor) +$ian-bg-hover-color: var(--control-transparent-bgColor-hover) +$ian-bg-read-color: var(--bgColor-inset) +$ian-bg-read-hover-color: hsl(from $ian-bg-read-color h s calc(l - 3)) +$ian-bg-selected-color: var(--selection-bgColor) +$ian-bg-selected-hover-color: hsl(from $ian-bg-selected-color h s calc(l - 3)) // This needs to be set in the itemSize of // the virtual scroller $ian-height: 100px From fb7e92e52ed2ba53c62da83da5059987c09abdc2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 05:31:22 +0000 Subject: [PATCH 076/325] Bump aws-sdk-s3 from 1.152.0 to 1.152.1 Bumps [aws-sdk-s3](https://github.com/aws/aws-sdk-ruby) from 1.152.0 to 1.152.1. - [Release notes](https://github.com/aws/aws-sdk-ruby/releases) - [Changelog](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sdk-s3/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-ruby/commits) --- updated-dependencies: - dependency-name: aws-sdk-s3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index f8328f994fce..a4c39023ddfb 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.940.0) + aws-partitions (1.942.0) aws-sdk-core (3.197.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) @@ -350,7 +350,7 @@ GEM aws-sdk-kms (1.83.0) aws-sdk-core (~> 3, >= 3.197.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.152.0) + aws-sdk-s3 (1.152.1) aws-sdk-core (~> 3, >= 3.197.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.8) From a879482a8f7ba0e8b390c065e35fd154333ac236 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 05:53:46 +0000 Subject: [PATCH 077/325] Bump @typescript-eslint/parser from 7.12.0 to 7.13.0 in /frontend Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 7.12.0 to 7.13.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.13.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 96 +++++++++++++++++++------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 6ba9170313de..16c4e50a7a0d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -5891,15 +5891,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.12.0.tgz", - "integrity": "sha512-dm/J2UDY3oV3TKius2OUZIFHsomQmpHtsV0FTh1WO8EKgHLQ1QCADUqscPgTpU+ih1e21FQSRjXckHn3txn6kQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.13.0.tgz", + "integrity": "sha512-EjMfl69KOS9awXXe83iRN7oIEXy9yYdqWfqdrFAYAAr6syP8eLEFI7ZE4939antx2mNgPRW/o1ybm2SFYkbTVA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.12.0", - "@typescript-eslint/types": "7.12.0", - "@typescript-eslint/typescript-estree": "7.12.0", - "@typescript-eslint/visitor-keys": "7.12.0", + "@typescript-eslint/scope-manager": "7.13.0", + "@typescript-eslint/types": "7.13.0", + "@typescript-eslint/typescript-estree": "7.13.0", + "@typescript-eslint/visitor-keys": "7.13.0", "debug": "^4.3.4" }, "engines": { @@ -5919,13 +5919,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.12.0.tgz", - "integrity": "sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.13.0.tgz", + "integrity": "sha512-ZrMCe1R6a01T94ilV13egvcnvVJ1pxShkE0+NDjDzH4nvG1wXpwsVI5bZCvE7AEDH1mXEx5tJSVR68bLgG7Dng==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.12.0", - "@typescript-eslint/visitor-keys": "7.12.0" + "@typescript-eslint/types": "7.13.0", + "@typescript-eslint/visitor-keys": "7.13.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -5936,9 +5936,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz", - "integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.13.0.tgz", + "integrity": "sha512-QWuwm9wcGMAuTsxP+qz6LBBd3Uq8I5Nv8xb0mk54jmNoCyDspnMvVsOxI6IsMmway5d1S9Su2+sCKv1st2l6eA==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -5949,13 +5949,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.12.0.tgz", - "integrity": "sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.0.tgz", + "integrity": "sha512-cAvBvUoobaoIcoqox1YatXOnSl3gx92rCZoMRPzMNisDiM12siGilSM4+dJAekuuHTibI2hVC2fYK79iSFvWjw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.12.0", - "@typescript-eslint/visitor-keys": "7.12.0", + "@typescript-eslint/types": "7.13.0", + "@typescript-eslint/visitor-keys": "7.13.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5977,12 +5977,12 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.12.0.tgz", - "integrity": "sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.0.tgz", + "integrity": "sha512-nxn+dozQx+MK61nn/JP+M4eCkHDSxSLDpgE3WcQo0+fkjEolnaB5jswvIKC4K56By8MMgIho7f1PVxERHEo8rw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.12.0", + "@typescript-eslint/types": "7.13.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -26072,42 +26072,42 @@ } }, "@typescript-eslint/parser": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.12.0.tgz", - "integrity": "sha512-dm/J2UDY3oV3TKius2OUZIFHsomQmpHtsV0FTh1WO8EKgHLQ1QCADUqscPgTpU+ih1e21FQSRjXckHn3txn6kQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.13.0.tgz", + "integrity": "sha512-EjMfl69KOS9awXXe83iRN7oIEXy9yYdqWfqdrFAYAAr6syP8eLEFI7ZE4939antx2mNgPRW/o1ybm2SFYkbTVA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "7.12.0", - "@typescript-eslint/types": "7.12.0", - "@typescript-eslint/typescript-estree": "7.12.0", - "@typescript-eslint/visitor-keys": "7.12.0", + "@typescript-eslint/scope-manager": "7.13.0", + "@typescript-eslint/types": "7.13.0", + "@typescript-eslint/typescript-estree": "7.13.0", + "@typescript-eslint/visitor-keys": "7.13.0", "debug": "^4.3.4" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.12.0.tgz", - "integrity": "sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.13.0.tgz", + "integrity": "sha512-ZrMCe1R6a01T94ilV13egvcnvVJ1pxShkE0+NDjDzH4nvG1wXpwsVI5bZCvE7AEDH1mXEx5tJSVR68bLgG7Dng==", "dev": true, "requires": { - "@typescript-eslint/types": "7.12.0", - "@typescript-eslint/visitor-keys": "7.12.0" + "@typescript-eslint/types": "7.13.0", + "@typescript-eslint/visitor-keys": "7.13.0" } }, "@typescript-eslint/types": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz", - "integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.13.0.tgz", + "integrity": "sha512-QWuwm9wcGMAuTsxP+qz6LBBd3Uq8I5Nv8xb0mk54jmNoCyDspnMvVsOxI6IsMmway5d1S9Su2+sCKv1st2l6eA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.12.0.tgz", - "integrity": "sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.0.tgz", + "integrity": "sha512-cAvBvUoobaoIcoqox1YatXOnSl3gx92rCZoMRPzMNisDiM12siGilSM4+dJAekuuHTibI2hVC2fYK79iSFvWjw==", "dev": true, "requires": { - "@typescript-eslint/types": "7.12.0", - "@typescript-eslint/visitor-keys": "7.12.0", + "@typescript-eslint/types": "7.13.0", + "@typescript-eslint/visitor-keys": "7.13.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -26117,12 +26117,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.12.0.tgz", - "integrity": "sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.0.tgz", + "integrity": "sha512-nxn+dozQx+MK61nn/JP+M4eCkHDSxSLDpgE3WcQo0+fkjEolnaB5jswvIKC4K56By8MMgIho7f1PVxERHEo8rw==", "dev": true, "requires": { - "@typescript-eslint/types": "7.12.0", + "@typescript-eslint/types": "7.13.0", "eslint-visitor-keys": "^3.4.3" } }, From 09654fe8917af0ed65996b82e355d0c52fe1c895 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 05:54:09 +0000 Subject: [PATCH 078/325] Bump @typescript-eslint/eslint-plugin from 7.12.0 to 7.13.0 in /frontend Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 7.12.0 to 7.13.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.13.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- frontend/package-lock.json | 140 ++++++++++++++++++------------------- 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 6ba9170313de..94fa7daf3f2e 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -5710,16 +5710,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.12.0.tgz", - "integrity": "sha512-7F91fcbuDf/d3S8o21+r3ZncGIke/+eWk0EpO21LXhDfLahriZF9CGj4fbAetEjlaBdjdSm9a6VeXbpbT6Z40Q==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.13.0.tgz", + "integrity": "sha512-FX1X6AF0w8MdVFLSdqwqN/me2hyhuQg4ykN6ZpVhh1ij/80pTvDKclX1sZB9iqex8SjQfVhwMKs3JtnnMLzG9w==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.12.0", - "@typescript-eslint/type-utils": "7.12.0", - "@typescript-eslint/utils": "7.12.0", - "@typescript-eslint/visitor-keys": "7.12.0", + "@typescript-eslint/scope-manager": "7.13.0", + "@typescript-eslint/type-utils": "7.13.0", + "@typescript-eslint/utils": "7.13.0", + "@typescript-eslint/visitor-keys": "7.13.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -5743,13 +5743,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.12.0.tgz", - "integrity": "sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.13.0.tgz", + "integrity": "sha512-ZrMCe1R6a01T94ilV13egvcnvVJ1pxShkE0+NDjDzH4nvG1wXpwsVI5bZCvE7AEDH1mXEx5tJSVR68bLgG7Dng==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.12.0", - "@typescript-eslint/visitor-keys": "7.12.0" + "@typescript-eslint/types": "7.13.0", + "@typescript-eslint/visitor-keys": "7.13.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -5760,13 +5760,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/type-utils": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.12.0.tgz", - "integrity": "sha512-lib96tyRtMhLxwauDWUp/uW3FMhLA6D0rJ8T7HmH7x23Gk1Gwwu8UZ94NMXBvOELn6flSPiBrCKlehkiXyaqwA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.13.0.tgz", + "integrity": "sha512-xMEtMzxq9eRkZy48XuxlBFzpVMDurUAfDu5Rz16GouAtXm0TaAoTFzqWUFPPuQYXI/CDaH/Bgx/fk/84t/Bc9A==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.12.0", - "@typescript-eslint/utils": "7.12.0", + "@typescript-eslint/typescript-estree": "7.13.0", + "@typescript-eslint/utils": "7.13.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -5787,9 +5787,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz", - "integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.13.0.tgz", + "integrity": "sha512-QWuwm9wcGMAuTsxP+qz6LBBd3Uq8I5Nv8xb0mk54jmNoCyDspnMvVsOxI6IsMmway5d1S9Su2+sCKv1st2l6eA==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -5800,13 +5800,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.12.0.tgz", - "integrity": "sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.0.tgz", + "integrity": "sha512-cAvBvUoobaoIcoqox1YatXOnSl3gx92rCZoMRPzMNisDiM12siGilSM4+dJAekuuHTibI2hVC2fYK79iSFvWjw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.12.0", - "@typescript-eslint/visitor-keys": "7.12.0", + "@typescript-eslint/types": "7.13.0", + "@typescript-eslint/visitor-keys": "7.13.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5828,15 +5828,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.12.0.tgz", - "integrity": "sha512-Y6hhwxwDx41HNpjuYswYp6gDbkiZ8Hin9Bf5aJQn1bpTs3afYY4GX+MPYxma8jtoIV2GRwTM/UJm/2uGCVv+DQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.13.0.tgz", + "integrity": "sha512-jceD8RgdKORVnB4Y6BqasfIkFhl4pajB1wVxrF4akxD2QPM8GNYjgGwEzYS+437ewlqqrg7Dw+6dhdpjMpeBFQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.12.0", - "@typescript-eslint/types": "7.12.0", - "@typescript-eslint/typescript-estree": "7.12.0" + "@typescript-eslint/scope-manager": "7.13.0", + "@typescript-eslint/types": "7.13.0", + "@typescript-eslint/typescript-estree": "7.13.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -5850,12 +5850,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.12.0.tgz", - "integrity": "sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.0.tgz", + "integrity": "sha512-nxn+dozQx+MK61nn/JP+M4eCkHDSxSLDpgE3WcQo0+fkjEolnaB5jswvIKC4K56By8MMgIho7f1PVxERHEo8rw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.12.0", + "@typescript-eslint/types": "7.13.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -25969,16 +25969,16 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.12.0.tgz", - "integrity": "sha512-7F91fcbuDf/d3S8o21+r3ZncGIke/+eWk0EpO21LXhDfLahriZF9CGj4fbAetEjlaBdjdSm9a6VeXbpbT6Z40Q==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.13.0.tgz", + "integrity": "sha512-FX1X6AF0w8MdVFLSdqwqN/me2hyhuQg4ykN6ZpVhh1ij/80pTvDKclX1sZB9iqex8SjQfVhwMKs3JtnnMLzG9w==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.12.0", - "@typescript-eslint/type-utils": "7.12.0", - "@typescript-eslint/utils": "7.12.0", - "@typescript-eslint/visitor-keys": "7.12.0", + "@typescript-eslint/scope-manager": "7.13.0", + "@typescript-eslint/type-utils": "7.13.0", + "@typescript-eslint/utils": "7.13.0", + "@typescript-eslint/visitor-keys": "7.13.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -25986,41 +25986,41 @@ }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.12.0.tgz", - "integrity": "sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.13.0.tgz", + "integrity": "sha512-ZrMCe1R6a01T94ilV13egvcnvVJ1pxShkE0+NDjDzH4nvG1wXpwsVI5bZCvE7AEDH1mXEx5tJSVR68bLgG7Dng==", "dev": true, "requires": { - "@typescript-eslint/types": "7.12.0", - "@typescript-eslint/visitor-keys": "7.12.0" + "@typescript-eslint/types": "7.13.0", + "@typescript-eslint/visitor-keys": "7.13.0" } }, "@typescript-eslint/type-utils": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.12.0.tgz", - "integrity": "sha512-lib96tyRtMhLxwauDWUp/uW3FMhLA6D0rJ8T7HmH7x23Gk1Gwwu8UZ94NMXBvOELn6flSPiBrCKlehkiXyaqwA==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.13.0.tgz", + "integrity": "sha512-xMEtMzxq9eRkZy48XuxlBFzpVMDurUAfDu5Rz16GouAtXm0TaAoTFzqWUFPPuQYXI/CDaH/Bgx/fk/84t/Bc9A==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "7.12.0", - "@typescript-eslint/utils": "7.12.0", + "@typescript-eslint/typescript-estree": "7.13.0", + "@typescript-eslint/utils": "7.13.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" } }, "@typescript-eslint/types": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz", - "integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.13.0.tgz", + "integrity": "sha512-QWuwm9wcGMAuTsxP+qz6LBBd3Uq8I5Nv8xb0mk54jmNoCyDspnMvVsOxI6IsMmway5d1S9Su2+sCKv1st2l6eA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.12.0.tgz", - "integrity": "sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.0.tgz", + "integrity": "sha512-cAvBvUoobaoIcoqox1YatXOnSl3gx92rCZoMRPzMNisDiM12siGilSM4+dJAekuuHTibI2hVC2fYK79iSFvWjw==", "dev": true, "requires": { - "@typescript-eslint/types": "7.12.0", - "@typescript-eslint/visitor-keys": "7.12.0", + "@typescript-eslint/types": "7.13.0", + "@typescript-eslint/visitor-keys": "7.13.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -26030,24 +26030,24 @@ } }, "@typescript-eslint/utils": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.12.0.tgz", - "integrity": "sha512-Y6hhwxwDx41HNpjuYswYp6gDbkiZ8Hin9Bf5aJQn1bpTs3afYY4GX+MPYxma8jtoIV2GRwTM/UJm/2uGCVv+DQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.13.0.tgz", + "integrity": "sha512-jceD8RgdKORVnB4Y6BqasfIkFhl4pajB1wVxrF4akxD2QPM8GNYjgGwEzYS+437ewlqqrg7Dw+6dhdpjMpeBFQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.12.0", - "@typescript-eslint/types": "7.12.0", - "@typescript-eslint/typescript-estree": "7.12.0" + "@typescript-eslint/scope-manager": "7.13.0", + "@typescript-eslint/types": "7.13.0", + "@typescript-eslint/typescript-estree": "7.13.0" } }, "@typescript-eslint/visitor-keys": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.12.0.tgz", - "integrity": "sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==", + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.0.tgz", + "integrity": "sha512-nxn+dozQx+MK61nn/JP+M4eCkHDSxSLDpgE3WcQo0+fkjEolnaB5jswvIKC4K56By8MMgIho7f1PVxERHEo8rw==", "dev": true, "requires": { - "@typescript-eslint/types": "7.12.0", + "@typescript-eslint/types": "7.13.0", "eslint-visitor-keys": "^3.4.3" } }, From 05c44ca395964ab4959035d26c8226d5ac33780b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 06:24:03 +0000 Subject: [PATCH 079/325] Bump will_paginate from 4.0.0 to 4.0.1 Bumps [will_paginate](https://github.com/mislav/will_paginate) from 4.0.0 to 4.0.1. - [Release notes](https://github.com/mislav/will_paginate/releases) - [Commits](https://github.com/mislav/will_paginate/compare/v4.0.0...v4.0.1) --- updated-dependencies: - dependency-name: will_paginate dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index f8328f994fce..60ce3c65c98c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1146,7 +1146,7 @@ GEM websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - will_paginate (4.0.0) + will_paginate (4.0.1) with_advisory_lock (5.1.0) activerecord (>= 6.1) zeitwerk (>= 2.6) From b9afe0188452365afbf425d639b7e568b92666f3 Mon Sep 17 00:00:00 2001 From: as-op Date: Tue, 11 Jun 2024 09:45:18 +0200 Subject: [PATCH 080/325] [#55268] PDF report: multi column table with pictures not included https://community.openproject.org/work_packages/55268 --- Gemfile | 2 +- Gemfile.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index e20dc3b08db1..10e725cc659d 100644 --- a/Gemfile +++ b/Gemfile @@ -158,7 +158,7 @@ gem "structured_warnings", "~> 0.4.0" gem "airbrake", "~> 13.0.0", require: false gem "markly", "~> 0.10" # another markdown parser like commonmarker, but with AST support used in PDF export -gem "md_to_pdf", git: "https://github.com/opf/md-to-pdf", ref: "8f14736a88ad0064d2a97be108fe7061ffbcee91" +gem "md_to_pdf", git: "https://github.com/opf/md-to-pdf", ref: "8772c791a21819751c0d111be903b3b44ef7d862" gem "prawn", "~> 2.4" gem "ttfunk", "~> 1.7.0" # remove after https://github.com/prawnpdf/prawn/issues/1346 resolved. diff --git a/Gemfile.lock b/Gemfile.lock index f8328f994fce..0fd45a88cdd7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -8,13 +8,13 @@ GIT GIT remote: https://github.com/opf/md-to-pdf - revision: 8f14736a88ad0064d2a97be108fe7061ffbcee91 - ref: 8f14736a88ad0064d2a97be108fe7061ffbcee91 + revision: 8772c791a21819751c0d111be903b3b44ef7d862 + ref: 8772c791a21819751c0d111be903b3b44ef7d862 specs: - md_to_pdf (0.0.26) + md_to_pdf (0.0.27) color_conversion (~> 0.1) front_matter_parser (~> 1.0) - json-schema (~> 4.1) + json-schema (~> 4.3) markly (~> 0.10) matrix (~> 0.4) nokogiri (~> 1.1) From fdbd6b6d5ad0a23b1aadad6004f3d9aed54d5d0d Mon Sep 17 00:00:00 2001 From: ulferts Date: Tue, 11 Jun 2024 10:20:38 +0200 Subject: [PATCH 081/325] forcing to specify allowed actions when forfeiting authorization check --- app/controllers/account_controller.rb | 26 ++++---- app/controllers/angular_controller.rb | 2 +- app/controllers/api_docs_controller.rb | 2 +- app/controllers/colors_controller.rb | 2 +- .../concerns/accounts/authorization.rb | 21 ++++--- .../concerns/accounts/omniauth_login.rb | 2 +- app/controllers/custom_styles_controller.rb | 2 +- app/controllers/favorites_controller.rb | 2 +- app/controllers/groups_controller.rb | 2 +- app/controllers/help_controller.rb | 2 +- app/controllers/highlighting_controller.rb | 2 +- app/controllers/homescreen_controller.rb | 2 +- app/controllers/journals_controller.rb | 2 +- app/controllers/messages_controller.rb | 2 +- .../my/auto_login_tokens_controller.rb | 2 +- app/controllers/my/sessions_controller.rb | 4 +- app/controllers/my_controller.rb | 30 ++++----- app/controllers/oauth/auth_base_controller.rb | 6 +- app/controllers/oauth/grants_controller.rb | 2 +- app/controllers/oauth_clients_controller.rb | 2 +- app/controllers/onboarding_controller.rb | 2 +- .../placeholder_users_controller.rb | 2 +- app/controllers/projects/menus_controller.rb | 2 +- .../projects/queries_controller.rb | 2 +- app/controllers/projects_controller.rb | 2 +- app/controllers/users_controller.rb | 4 +- app/controllers/watchers_controller.rb | 3 +- .../auto_completes_controller.rb | 2 +- .../work_packages/progress_controller.rb | 2 +- app/controllers/work_packages_controller.rb | 2 +- .../controllers/avatars/avatar_controller.rb | 2 +- .../avatars/my_avatar_controller.rb | 4 +- .../bim/ifc_models/ifc_models_controller.rb | 3 +- .../app/controllers/budgets_controller.rb | 3 +- .../controllers/calendar/ical_controller.rb | 2 +- .../controllers/hourly_rates_controller.rb | 4 +- .../recaptcha/request_controller.rb | 3 +- .../storages/project_storages_controller.rb | 2 +- .../authentication_controller.rb | 12 ++-- .../two_factor_devices_controller.rb | 12 ++-- .../my/backup_codes_controller.rb | 2 +- .../my/remember_cookie_controller.rb | 2 +- .../my/two_factor_devices_controller.rb | 16 ++--- .../webhooks/incoming/hooks_controller.rb | 2 +- .../application_controller_spec.rb | 4 +- .../concerns/authorization_spec.rb | 62 ++++--------------- 46 files changed, 124 insertions(+), 151 deletions(-) diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb index 7c977c1fd01c..a9b2423c55e3 100644 --- a/app/controllers/account_controller.rb +++ b/app/controllers/account_controller.rb @@ -36,19 +36,19 @@ class AccountController < ApplicationController # prevents login action to be filtered by check_if_login_required application scope filter skip_before_action :check_if_login_required - no_authorization_required! only: %i[login - internal_login - logout - lost_password - register - activate - consent - confirm_consent - decline_consent - stage_success - stage_failure - change_password - auth_source_sso_failed] + no_authorization_required! :login, + :internal_login, + :logout, + :lost_password, + :register, + :activate, + :consent, + :confirm_consent, + :decline_consent, + :stage_success, + :stage_failure, + :change_password, + :auth_source_sso_failed before_action :apply_csp_appends, only: %i[login] before_action :disable_api diff --git a/app/controllers/angular_controller.rb b/app/controllers/angular_controller.rb index dc70f86e0c89..40e623c9027d 100644 --- a/app/controllers/angular_controller.rb +++ b/app/controllers/angular_controller.rb @@ -29,7 +29,7 @@ class AngularController < ApplicationController before_action :require_login - no_authorization_required! only: %i[empty_layout notifications_layout] + no_authorization_required! :empty_layout, :notifications_layout def empty_layout # Frontend will handle rendering diff --git a/app/controllers/api_docs_controller.rb b/app/controllers/api_docs_controller.rb index 5a1bec3d2edb..3a78ca1c7a59 100644 --- a/app/controllers/api_docs_controller.rb +++ b/app/controllers/api_docs_controller.rb @@ -28,7 +28,7 @@ class APIDocsController < ApplicationController before_action :require_login - no_authorization_required! only: :index + no_authorization_required! :index helper API::APIDocsHelper diff --git a/app/controllers/colors_controller.rb b/app/controllers/colors_controller.rb index 569dacf95405..b911b9451cfc 100644 --- a/app/controllers/colors_controller.rb +++ b/app/controllers/colors_controller.rb @@ -28,7 +28,7 @@ class ColorsController < ApplicationController before_action :require_admin_unless_readonly_api_request - authorization_checked! only: %i[index show new edit create update confirm_destroy destroy] + authorization_checked! :index, :show, :new, :edit, :create, :update, :confirm_destroy, :destroy layout "admin" diff --git a/app/controllers/concerns/accounts/authorization.rb b/app/controllers/concerns/accounts/authorization.rb index 8000d6ac7665..afcc1f302f69 100644 --- a/app/controllers/concerns/accounts/authorization.rb +++ b/app/controllers/concerns/accounts/authorization.rb @@ -144,14 +144,19 @@ def append_before_action(*names, &) def set_authorization_checked_if_covered(*names) return unless METHODS_ENFORCING_AUTHORIZATION.intersect?(names) - authorization_checked!(only: names.last.is_a?(Hash) ? Array(names.last[:only]) : [], - except: names.last.is_a?(Hash) ? Array(names.last[:except]) : []) + authorization_checked_by_default_action(only: names.last.is_a?(Hash) ? Array(names.last[:only]) : [], + except: names.last.is_a?(Hash) ? Array(names.last[:except]) : []) end - def no_authorization_required!(only: [], except: []) - only = Array(only) - except = Array(except) + def no_authorization_required!(*actions) + raise ArgumentError, "no_authorization_required! needs to have actions specified" unless actions.any? + authorization_checked_by_default_action(only: actions) + end + + alias :authorization_checked! :no_authorization_required! + + def authorization_checked_by_default_action(only: [], except: []) # A class_attribute is used so that inheritance works also for defined only/except actions. # But since the only/accept arrays are only modified in place, the same object would be used from the # ApplicationController downwards. So whenever it is detected that the controller the authorization_ensured @@ -165,19 +170,17 @@ def no_authorization_required!(only: [], except: []) end end - alias :authorization_checked! :no_authorization_required! - def update_authorization_ensured_on_actions(only: [], except: []) update_authorization_ensured_on_action_only(only) update_authorization_ensured_on_action_except(only, except) end def update_authorization_ensured_on_action_only(only) - authorization_ensured[:generally_allowed] = true if only.empty? - if only.any? authorization_ensured[:only] += only authorization_ensured[:only].uniq! + else + update_authorization_ensured_on_all end end diff --git a/app/controllers/concerns/accounts/omniauth_login.rb b/app/controllers/concerns/accounts/omniauth_login.rb index 96a7a4475314..c037b28196aa 100644 --- a/app/controllers/concerns/accounts/omniauth_login.rb +++ b/app/controllers/concerns/accounts/omniauth_login.rb @@ -44,7 +44,7 @@ module Accounts::OmniauthLogin check_session_lifetime ] .each { |key| skip_before_action key, only: [:omniauth_login] } - no_authorization_required! only: %i[omniauth_login omniauth_failure] + no_authorization_required! :omniauth_login, :omniauth_failure helper :omniauth end diff --git a/app/controllers/custom_styles_controller.rb b/app/controllers/custom_styles_controller.rb index 228c47c8343c..a8467ed35a77 100644 --- a/app/controllers/custom_styles_controller.rb +++ b/app/controllers/custom_styles_controller.rb @@ -42,7 +42,7 @@ class CustomStylesController < ApplicationController except: UNGUARDED_ACTIONS + %i[upsale] skip_before_action :check_if_login_required, only: UNGUARDED_ACTIONS - no_authorization_required! only: UNGUARDED_ACTIONS + no_authorization_required! *UNGUARDED_ACTIONS def show @custom_style = CustomStyle.current || CustomStyle.new diff --git a/app/controllers/favorites_controller.rb b/app/controllers/favorites_controller.rb index 3dc66c8bdeac..cdc157058e42 100644 --- a/app/controllers/favorites_controller.rb +++ b/app/controllers/favorites_controller.rb @@ -29,7 +29,7 @@ class FavoritesController < ApplicationController before_action :find_favored_by_object before_action :require_login - no_authorization_required! only: %i[favorite unfavorite] + no_authorization_required! :favorite, :unfavorite def favorite if @favored.visible?(User.current) diff --git a/app/controllers/groups_controller.rb b/app/controllers/groups_controller.rb index ba45fc56000b..778ddd6082c6 100644 --- a/app/controllers/groups_controller.rb +++ b/app/controllers/groups_controller.rb @@ -31,7 +31,7 @@ class GroupsController < ApplicationController layout "admin" before_action :require_admin, except: %i[show] - no_authorization_required! only: %i[show] + no_authorization_required! :show before_action :find_group, only: %i[destroy update show create_memberships destroy_membership edit_membership add_users] diff --git a/app/controllers/help_controller.rb b/app/controllers/help_controller.rb index ffcc23bfe192..3eb2c7b28858 100644 --- a/app/controllers/help_controller.rb +++ b/app/controllers/help_controller.rb @@ -27,7 +27,7 @@ #++ class HelpController < ApplicationController - no_authorization_required! only: %i[keyboard_shortcuts text_formatting] + no_authorization_required! :keyboard_shortcuts, :text_formatting def keyboard_shortcuts redirect_to OpenProject::Static::Links[:shortcuts][:href] diff --git a/app/controllers/highlighting_controller.rb b/app/controllers/highlighting_controller.rb index b67442cd91f8..e859e429bb87 100644 --- a/app/controllers/highlighting_controller.rb +++ b/app/controllers/highlighting_controller.rb @@ -29,7 +29,7 @@ class HighlightingController < ApplicationController before_action :determine_freshness skip_before_action :check_if_login_required, only: [:styles] - no_authorization_required! only: [:styles] + no_authorization_required! :styles def styles response.content_type = Mime[:css] diff --git a/app/controllers/homescreen_controller.rb b/app/controllers/homescreen_controller.rb index a989230b62a7..92660ae2ada7 100644 --- a/app/controllers/homescreen_controller.rb +++ b/app/controllers/homescreen_controller.rb @@ -28,7 +28,7 @@ class HomescreenController < ApplicationController skip_before_action :check_if_login_required, only: [:robots] - no_authorization_required! only: %i[index robots] + no_authorization_required! :index, :robots layout "global" diff --git a/app/controllers/journals_controller.rb b/app/controllers/journals_controller.rb index 5fbf7e6766fd..d7ea7714252c 100644 --- a/app/controllers/journals_controller.rb +++ b/app/controllers/journals_controller.rb @@ -33,7 +33,7 @@ class JournalsController < ApplicationController before_action :find_journal, :ensure_permitted, only: [:diff] - authorization_checked! only: %i[diff] + authorization_checked! :diff accept_key_auth :index menu_item :issues diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb index 397afab23730..980c69da2e8d 100644 --- a/app/controllers/messages_controller.rb +++ b/app/controllers/messages_controller.rb @@ -33,7 +33,7 @@ class MessagesController < ApplicationController before_action :find_object_and_scope before_action :authorize, except: %i[edit update destroy] # Checked inside the method. - no_authorization_required! only: %i[edit update destroy] + no_authorization_required! :edit, :update, :destroy include AttachmentsHelper include PaginationHelper diff --git a/app/controllers/my/auto_login_tokens_controller.rb b/app/controllers/my/auto_login_tokens_controller.rb index f0222b9f8568..d8c78fd8dd0d 100644 --- a/app/controllers/my/auto_login_tokens_controller.rb +++ b/app/controllers/my/auto_login_tokens_controller.rb @@ -1,7 +1,7 @@ module My class AutoLoginTokensController < ::ApplicationController before_action :require_login - no_authorization_required! only: %i(destroy) + no_authorization_required! :destroy before_action :find_token, only: %i(destroy) diff --git a/app/controllers/my/sessions_controller.rb b/app/controllers/my/sessions_controller.rb index 2c6094505d68..98d9a6307f69 100644 --- a/app/controllers/my/sessions_controller.rb +++ b/app/controllers/my/sessions_controller.rb @@ -1,7 +1,9 @@ module My class SessionsController < ::ApplicationController before_action :require_login - no_authorization_required! only: %i(index show destroy) + no_authorization_required! :index, + :show, + :destroy self._model_object = ::Sessions::UserSession diff --git a/app/controllers/my_controller.rb b/app/controllers/my_controller.rb index 95bd80211321..ff46385f4a77 100644 --- a/app/controllers/my_controller.rb +++ b/app/controllers/my_controller.rb @@ -39,21 +39,21 @@ class MyController < ApplicationController before_action :set_grouped_ical_tokens, only: %i[access_token] before_action :set_ical_token, only: %i[revoke_ical_token] - no_authorization_required! only: %i[account - update_account - settings - update_settings - password - change_password - access_token - delete_storage_token - notifications - reminders - generate_rss_key - revoke_rss_key - generate_api_key - revoke_api_key - revoke_ical_token] + no_authorization_required! :account, + :update_account, + :settings, + :update_settings, + :password, + :change_password, + :access_token, + :delete_storage_token, + :notifications, + :reminders, + :generate_rss_key, + :revoke_rss_key, + :generate_api_key, + :revoke_api_key, + :revoke_ical_token menu_item :account, only: [:account] menu_item :settings, only: [:settings] diff --git a/app/controllers/oauth/auth_base_controller.rb b/app/controllers/oauth/auth_base_controller.rb index d2b703007a61..8ec97a4ceba0 100644 --- a/app/controllers/oauth/auth_base_controller.rb +++ b/app/controllers/oauth/auth_base_controller.rb @@ -37,9 +37,9 @@ class AuthBaseController < ::ApplicationController prepend_before_action :extend_content_security_policy skip_before_action :check_if_login_required - no_authorization_required! only: %i[new - create - show] + no_authorization_required! :new, + :create, + :show layout "only_logo" diff --git a/app/controllers/oauth/grants_controller.rb b/app/controllers/oauth/grants_controller.rb index c4587b5e5e8f..dc9206b1a48a 100644 --- a/app/controllers/oauth/grants_controller.rb +++ b/app/controllers/oauth/grants_controller.rb @@ -29,7 +29,7 @@ module OAuth class GrantsController < ::ApplicationController before_action :require_login - authorization_checked! only: %i[index revoke_application] + authorization_checked! :index, :revoke_application layout "my" menu_item :access_token diff --git a/app/controllers/oauth_clients_controller.rb b/app/controllers/oauth_clients_controller.rb index afe14e369856..a2a09b3c1ebb 100644 --- a/app/controllers/oauth_clients_controller.rb +++ b/app/controllers/oauth_clients_controller.rb @@ -38,7 +38,7 @@ class OAuthClientsController < ApplicationController before_action :set_code, only: [:callback] before_action :set_connection_manager, only: [:callback] - no_authorization_required! only: %i[callback ensure_connection] + no_authorization_required! :callback, :ensure_connection after_action :clear_oauth_state_cookie, only: [:callback] diff --git a/app/controllers/onboarding_controller.rb b/app/controllers/onboarding_controller.rb index 95bc94725a4e..59105b0a5437 100644 --- a/app/controllers/onboarding_controller.rb +++ b/app/controllers/onboarding_controller.rb @@ -27,7 +27,7 @@ #++ class OnboardingController < ApplicationController - no_authorization_required! only: %i[user_settings] + no_authorization_required! :user_settings def user_settings @user = User.current diff --git a/app/controllers/placeholder_users_controller.rb b/app/controllers/placeholder_users_controller.rb index daaf585fce5f..9936ed290323 100644 --- a/app/controllers/placeholder_users_controller.rb +++ b/app/controllers/placeholder_users_controller.rb @@ -30,7 +30,7 @@ class PlaceholderUsersController < ApplicationController include EnterpriseTrialHelper layout "admin" before_action :authorize_global, except: %i[show] - no_authorization_required! only: %i[show] + no_authorization_required! :show before_action :find_placeholder_user, only: %i[show edit diff --git a/app/controllers/projects/menus_controller.rb b/app/controllers/projects/menus_controller.rb index 08c92d81fc3b..cdecdf19bbdf 100644 --- a/app/controllers/projects/menus_controller.rb +++ b/app/controllers/projects/menus_controller.rb @@ -29,7 +29,7 @@ module Projects class MenusController < ApplicationController # No authorize as every user (or logged in user) # is allowed to see the menu. - no_authorization_required! only: :show + no_authorization_required! :show def show projects_menu = Menus::Projects.new(controller_path: params[:controller_path], params:, current_user:) diff --git a/app/controllers/projects/queries_controller.rb b/app/controllers/projects/queries_controller.rb index 27b7018364e7..04914ac7d6ab 100644 --- a/app/controllers/projects/queries_controller.rb +++ b/app/controllers/projects/queries_controller.rb @@ -30,7 +30,7 @@ class Projects::QueriesController < ApplicationController include Projects::QueryLoading # No need for a more specific authorization check. That is carried out in the contracts. - no_authorization_required! only: %i[show new create rename update publish unpublish destroy] + no_authorization_required! :show, :new, :create, :rename, :update, :publish, :unpublish, :destroy before_action :require_login before_action :find_query, only: %i[show rename update destroy publish unpublish] before_action :build_query_or_deny_access, only: %i[new create] diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 04503237f791..49a816dff3dc 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -36,7 +36,7 @@ class ProjectsController < ApplicationController before_action :authorize_global, only: %i[new] before_action :require_admin, only: %i[destroy destroy_info] - no_authorization_required! only: %i[index] + no_authorization_required! :index include SortHelper include PaginationHelper diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 9f7ea9ea6efb..50a0f970613c 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -44,8 +44,8 @@ class UsersController < ApplicationController before_action :authorize_for_user, only: [:destroy] before_action :check_if_deletion_allowed, only: %i[deletion_info destroy] - no_authorization_required! only: %i[show] - authorization_checked! only: %i[destroy deletion_info] + no_authorization_required! :show + authorization_checked! :destroy, :deletion_info before_action :set_current_activity_page, only: [:show] diff --git a/app/controllers/watchers_controller.rb b/app/controllers/watchers_controller.rb index 9d367af4b515..ee4e32938acd 100644 --- a/app/controllers/watchers_controller.rb +++ b/app/controllers/watchers_controller.rb @@ -32,7 +32,8 @@ class WatchersController < ApplicationController :require_login, :deny_access_unless_visible - authorization_checked! only: %i[watch unwatch] + authorization_checked! :watch, + :unwatch def watch set_watcher(User.current, true) diff --git a/app/controllers/work_packages/auto_completes_controller.rb b/app/controllers/work_packages/auto_completes_controller.rb index f5533e281c7a..5a06d103d14a 100644 --- a/app/controllers/work_packages/auto_completes_controller.rb +++ b/app/controllers/work_packages/auto_completes_controller.rb @@ -30,7 +30,7 @@ class WorkPackages::AutoCompletesController < ApplicationController # Authorization is checked by the query. - no_authorization_required! only: :index + no_authorization_required! :index def index @work_packages = work_packages_matching_query_prop diff --git a/app/controllers/work_packages/progress_controller.rb b/app/controllers/work_packages/progress_controller.rb index f10dc61cf1eb..194bbad8c1b1 100644 --- a/app/controllers/work_packages/progress_controller.rb +++ b/app/controllers/work_packages/progress_controller.rb @@ -37,7 +37,7 @@ class WorkPackages::ProgressController < ApplicationController layout false before_action :set_work_package before_action :extract_persisted_progress_attributes, only: %i[edit create update] - authorization_checked! only: %i[new edit create update] + authorization_checked! :new, :edit, :create, :update helper_method :modal_class diff --git a/app/controllers/work_packages_controller.rb b/app/controllers/work_packages_controller.rb index d67001318a2b..513d5d9e174e 100644 --- a/app/controllers/work_packages_controller.rb +++ b/app/controllers/work_packages_controller.rb @@ -39,7 +39,7 @@ class WorkPackagesController < ApplicationController before_action :load_and_authorize_in_optional_project, :check_allowed_export, :protect_from_unauthorized_export, only: :index - authorization_checked! only: %i[index show] + authorization_checked! :index, :show before_action :load_and_validate_query, only: :index, unless: -> { request.format.html? } before_action :load_work_packages, only: :index, if: -> { request.format.atom? } diff --git a/modules/avatars/app/controllers/avatars/avatar_controller.rb b/modules/avatars/app/controllers/avatars/avatar_controller.rb index 3450061cddcd..e76b67ea3b50 100644 --- a/modules/avatars/app/controllers/avatars/avatar_controller.rb +++ b/modules/avatars/app/controllers/avatars/avatar_controller.rb @@ -3,7 +3,7 @@ class AvatarController < ::ApplicationController before_action :ensure_enabled before_action :find_avatar - no_authorization_required! only: %i[show] + no_authorization_required! :show def show send_file @avatar.diskfile, diff --git a/modules/avatars/app/controllers/avatars/my_avatar_controller.rb b/modules/avatars/app/controllers/avatars/my_avatar_controller.rb index 9054b3c03a78..ba6bcda521d1 100644 --- a/modules/avatars/app/controllers/avatars/my_avatar_controller.rb +++ b/modules/avatars/app/controllers/avatars/my_avatar_controller.rb @@ -3,7 +3,9 @@ class MyAvatarController < BaseController before_action :require_login before_action :set_user - no_authorization_required! only: %i[show update destroy] + no_authorization_required! :show, + :update, + :destroy layout "my" menu_item :avatar diff --git a/modules/bim/app/controllers/bim/ifc_models/ifc_models_controller.rb b/modules/bim/app/controllers/bim/ifc_models/ifc_models_controller.rb index 0e3ac8abe607..a2b62136608a 100644 --- a/modules/bim/app/controllers/bim/ifc_models/ifc_models_controller.rb +++ b/modules/bim/app/controllers/bim/ifc_models/ifc_models_controller.rb @@ -39,7 +39,8 @@ class IfcModelsController < BaseController before_action :authorize, except: %i[direct_upload_finished set_direct_upload_file_name] before_action :require_login, only: [:set_direct_upload_file_name] skip_before_action :verify_authenticity_token, only: [:set_direct_upload_file_name] # AJAX request in page, so skip authenticity token - no_authorization_required! only: %i[set_direct_upload_file_name direct_upload_finished] + no_authorization_required! :set_direct_upload_file_name, + :direct_upload_finished menu_item :ifc_models diff --git a/modules/budgets/app/controllers/budgets_controller.rb b/modules/budgets/app/controllers/budgets_controller.rb index 2f2ee53bffc0..6e94db625761 100644 --- a/modules/budgets/app/controllers/budgets_controller.rb +++ b/modules/budgets/app/controllers/budgets_controller.rb @@ -42,7 +42,8 @@ class BudgetsController < ApplicationController :update_material_budget_item, :update_labor_budget_item ] - no_authorization_required! only: %i[update_material_budget_item update_labor_budget_item] + no_authorization_required! :update_material_budget_item, + :update_labor_budget_item helper :sort include SortHelper diff --git a/modules/calendar/app/controllers/calendar/ical_controller.rb b/modules/calendar/app/controllers/calendar/ical_controller.rb index ad2deaffad14..1153dfb04222 100644 --- a/modules/calendar/app/controllers/calendar/ical_controller.rb +++ b/modules/calendar/app/controllers/calendar/ical_controller.rb @@ -30,7 +30,7 @@ module ::Calendar class ICalController < ApplicationController # Authentication and authorization is handled within the service. skip_before_action :check_if_login_required - no_authorization_required! only: :show + no_authorization_required! :show def show begin diff --git a/modules/costs/app/controllers/hourly_rates_controller.rb b/modules/costs/app/controllers/hourly_rates_controller.rb index b47f0cf22e6b..dfc835f26016 100644 --- a/modules/costs/app/controllers/hourly_rates_controller.rb +++ b/modules/costs/app/controllers/hourly_rates_controller.rb @@ -40,7 +40,9 @@ class HourlyRatesController < ApplicationController # #show, #edit and #update have their own authorization before_action :authorize, except: %i[show edit update] - no_authorization_required! only: %i[show edit update] + no_authorization_required! :show, + :edit, + :update # TODO: this should be an index def show diff --git a/modules/recaptcha/app/controllers/recaptcha/request_controller.rb b/modules/recaptcha/app/controllers/recaptcha/request_controller.rb index 63f81b212f11..55d423a9e67d 100644 --- a/modules/recaptcha/app/controllers/recaptcha/request_controller.rb +++ b/modules/recaptcha/app/controllers/recaptcha/request_controller.rb @@ -7,7 +7,8 @@ class RequestController < ApplicationController # User is not yet logged in, so skip login required check skip_before_action :check_if_login_required - no_authorization_required! only: %i[perform verify] + no_authorization_required! :perform, + :verify # Skip if recaptcha was disabled before_action :skip_if_disabled diff --git a/modules/storages/app/controllers/storages/project_storages_controller.rb b/modules/storages/app/controllers/storages/project_storages_controller.rb index 530e79b8f184..8dbde0d3a265 100644 --- a/modules/storages/app/controllers/storages/project_storages_controller.rb +++ b/modules/storages/app/controllers/storages/project_storages_controller.rb @@ -36,7 +36,7 @@ class Storages::ProjectStoragesController < ApplicationController before_action :find_model_object before_action :find_project_by_project_id before_action :render_403, unless: -> { User.current.allowed_in_project?(:view_file_links, @project) } - no_authorization_required! only: %i[open] + no_authorization_required! :open # rubocop:disable Metrics/AbcSize def open diff --git a/modules/two_factor_authentication/app/controllers/two_factor_authentication/authentication_controller.rb b/modules/two_factor_authentication/app/controllers/two_factor_authentication/authentication_controller.rb index d94aa599058e..a2cb5a503807 100644 --- a/modules/two_factor_authentication/app/controllers/two_factor_authentication/authentication_controller.rb +++ b/modules/two_factor_authentication/app/controllers/two_factor_authentication/authentication_controller.rb @@ -11,12 +11,12 @@ class AuthenticationController < ApplicationController # User is not yet logged in, so skip login required check skip_before_action :check_if_login_required - no_authorization_required! only: %i[request_otp - confirm_otp - enter_backup_code - verify_backup_code - retry - webauthn_challenge] + no_authorization_required! :request_otp, + :confirm_otp, + :enter_backup_code, + :verify_backup_code, + :retry, + :webauthn_challenge # Avoid catch-all from core resulting in methods before_action :only_post, only: :confirm_otp diff --git a/modules/two_factor_authentication/app/controllers/two_factor_authentication/forced_registration/two_factor_devices_controller.rb b/modules/two_factor_authentication/app/controllers/two_factor_authentication/forced_registration/two_factor_devices_controller.rb index 0a5f2363caea..35ec4564a375 100644 --- a/modules/two_factor_authentication/app/controllers/two_factor_authentication/forced_registration/two_factor_devices_controller.rb +++ b/modules/two_factor_authentication/app/controllers/two_factor_authentication/forced_registration/two_factor_devices_controller.rb @@ -6,12 +6,12 @@ class TwoFactorDevicesController < ::TwoFactorAuthentication::BaseController # Skip default login skip_before_action :check_if_login_required - no_authorization_required! only: %i[register - new - confirm - web_authn - make_default - destroy] + no_authorization_required! :register, + :new, + :confirm, + :web_authn, + :make_default, + :destroy before_action :find_device, only: [:confirm] diff --git a/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/backup_codes_controller.rb b/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/backup_codes_controller.rb index a6eb12a0f84b..0f46af2e804b 100644 --- a/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/backup_codes_controller.rb +++ b/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/backup_codes_controller.rb @@ -3,7 +3,7 @@ module My class BackupCodesController < ::ApplicationController # Ensure user is logged in before_action :require_login - no_authorization_required! only: %i[show create] + no_authorization_required! :show, :create # Password confirmation helpers and actions include PasswordConfirmation diff --git a/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/remember_cookie_controller.rb b/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/remember_cookie_controller.rb index eb23b6f50ba3..e3d5ac206eef 100644 --- a/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/remember_cookie_controller.rb +++ b/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/remember_cookie_controller.rb @@ -6,7 +6,7 @@ class RememberCookieController < ::ApplicationController # Ensure user is logged in before_action :require_login - no_authorization_required! only: :destroy + no_authorization_required! :destroy layout "my" menu_item :two_factor_authentication diff --git a/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/two_factor_devices_controller.rb b/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/two_factor_devices_controller.rb index 4295a95a5eb1..55e72a3cd479 100644 --- a/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/two_factor_devices_controller.rb +++ b/modules/two_factor_authentication/app/controllers/two_factor_authentication/my/two_factor_devices_controller.rb @@ -6,14 +6,14 @@ class TwoFactorDevicesController < ::TwoFactorAuthentication::BaseController before_action :set_user_variables # Authorization is not handled explicitly but as the user on which changes can be done is only the current user # (and that user needs to be logged in), no action harmful to other users can be done. - no_authorization_required! only: %i[new - index - create - register - confirm - destroy - make_default - webauthn_challenge] + no_authorization_required! :new, + :index, + :create, + :register, + :confirm, + :destroy, + :make_default, + :webauthn_challenge before_action :find_device, except: %i[new index register webauthn_challenge] diff --git a/modules/webhooks/app/controllers/webhooks/incoming/hooks_controller.rb b/modules/webhooks/app/controllers/webhooks/incoming/hooks_controller.rb index f1ef5786a891..bdea46978280 100644 --- a/modules/webhooks/app/controllers/webhooks/incoming/hooks_controller.rb +++ b/modules/webhooks/app/controllers/webhooks/incoming/hooks_controller.rb @@ -37,7 +37,7 @@ class HooksController < ApplicationController skip_before_action :verify_authenticity_token # Authorization cannot be applied since authentication is skipped. # It is then to be ensured when handling the hook. - no_authorization_required! only: [:handle_hook] + no_authorization_required! :handle_hook # Wrap the JSON body as 'payload' param # making it available as params[:payload] diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb index 0d39fe54a3ff..b280a0c134cd 100644 --- a/spec/controllers/application_controller_spec.rb +++ b/spec/controllers/application_controller_spec.rb @@ -33,7 +33,7 @@ # Fake controller to test calling an action controller do - no_authorization_required! + no_authorization_required! :index def index # just do anything that doesn't require an extra template @@ -154,7 +154,7 @@ def index controller do include OpenProjectErrorHelper - no_authorization_required! + no_authorization_required! :index def index op_handle_error "fail" diff --git a/spec/controllers/concerns/authorization_spec.rb b/spec/controllers/concerns/authorization_spec.rb index 45296d7eaf84..de0e0fee0ae5 100644 --- a/spec/controllers/concerns/authorization_spec.rb +++ b/spec/controllers/concerns/authorization_spec.rb @@ -150,26 +150,6 @@ def other_before_action; end it_behaves_like "is prevented" end - context "when forfeiting authorization checks" do - controller do - no_authorization_required! - - include controller_setup - end - - it_behaves_like "succeeds" - end - - context "when stating that authorization has been checked" do - controller do - authorization_checked! - - include controller_setup - end - - it_behaves_like "succeeds" - end - context "with authorization check in the superclass" do controller(described_class) do before_action :require_admin @@ -182,21 +162,19 @@ def other_before_action; end it_behaves_like "succeeds" end - context "when stating that authorization has been checked in the superclass" do - controller(described_class) do - authorization_checked! - end + context "when forfeiting authorization checks on this specific action" do + controller do + no_authorization_required! :index - controller(controller_class) do include controller_setup end it_behaves_like "succeeds" end - context "when forfeiting authorization checks in the superclass" do + context "when stating that authorization has been checked in the superclass" do controller(described_class) do - no_authorization_required! + authorization_checked! :index end controller(controller_class) do @@ -206,39 +184,21 @@ def other_before_action; end it_behaves_like "succeeds" end - context "when forfeiting authorization checks on this specific action with only" do - controller do - no_authorization_required! only: %i[index] - - include controller_setup - end - - it_behaves_like "succeeds" - end - - context "when forfeiting authorization checks on another action with only" do - controller do - no_authorization_required! only: %i[some_other_action] - - include controller_setup + context "when forfeiting authorization checks in the superclass" do + controller(described_class) do + no_authorization_required! :index end - it_behaves_like "is prevented" - end - - context "when forfeiting authorization checks on all but another action with except" do - controller do - no_authorization_required! except: %i[some_other_action] - + controller(controller_class) do include controller_setup end it_behaves_like "succeeds" end - context "when forfeiting authorization on all other actions with except" do + context "when forfeiting authorization checks on another action" do controller do - no_authorization_required! except: %i[index] + no_authorization_required! :some_other_action include controller_setup end From 36b4e47d36a04056d2541f25f67118d25cd6d17f Mon Sep 17 00:00:00 2001 From: ulferts Date: Tue, 11 Jun 2024 10:47:24 +0200 Subject: [PATCH 082/325] raise error in every env --- .../concerns/accounts/authorization.rb | 22 ++++++++----------- .../concerns/authorization_spec.rb | 8 +++---- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/app/controllers/concerns/accounts/authorization.rb b/app/controllers/concerns/accounts/authorization.rb index afcc1f302f69..206e81e78c43 100644 --- a/app/controllers/concerns/accounts/authorization.rb +++ b/app/controllers/concerns/accounts/authorization.rb @@ -47,19 +47,15 @@ module Accounts::Authorization def authorization_check_required unless authorization_is_ensured?(params[:action]) - if Rails.env.development? - raise <<-MESSAGE - Authorization check required for #{params[:action]} in #{self.class.name}. - - Use any method of - #{METHODS_ENFORCING_AUTHORIZATION.join(', ')} - to ensure authorization. If authorization is checked by any other means, - affirm the same by calling 'authorization_checked!' in the controller. If the authorization does - not need to be checked for this action, affirm the same by calling 'no_authorization_required!' - MESSAGE - else - render_403 - end + raise <<-MESSAGE + Authorization check required for #{self.class.name}##{params[:action]}. + + Use any method of + #{METHODS_ENFORCING_AUTHORIZATION.join(', ')} + to ensure authorization. If authorization is checked by any other means, + affirm the same by calling 'authorization_checked!' in the controller. If the authorization does + not need to be checked for this action, affirm the same by calling 'no_authorization_required!' + MESSAGE end end diff --git a/spec/controllers/concerns/authorization_spec.rb b/spec/controllers/concerns/authorization_spec.rb index de0e0fee0ae5..ac9dbd42f894 100644 --- a/spec/controllers/concerns/authorization_spec.rb +++ b/spec/controllers/concerns/authorization_spec.rb @@ -64,11 +64,9 @@ def other_before_action; end end shared_examples "is prevented" do - it "fails with a 403" do - get :index - - expect(response) - .to have_http_status :forbidden + it "fails with a RuntimeError" do + expect { get :index } + .to raise_error RuntimeError end end From 5b14fbf3d97c5fc8121ee4cdc17e513b75911e3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Tue, 11 Jun 2024 10:22:32 +0200 Subject: [PATCH 083/325] Bump ng-select to fix #54376 https://community.openproject.org/work_packages/54376 --- frontend/package-lock.json | 42 ++++++++++++++++++++------------------ frontend/package.json | 4 ++-- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 77e195a39b3e..0a62f365de7e 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -42,8 +42,8 @@ "@hotwired/turbo": "^8.0.4", "@hotwired/turbo-rails": "^8.0.4", "@kolkov/ngx-gallery": "^2.0.1", - "@ng-select/ng-option-highlight": "12.0.6", - "@ng-select/ng-select": "^12.0.7", + "@ng-select/ng-option-highlight": "13.2.0", + "@ng-select/ng-select": "^13.2.0", "@ngneat/content-loader": "^7.0.0", "@ngx-formly/core": "^6.1.4", "@openproject/octicons-angular": "^19.14.0", @@ -4023,32 +4023,34 @@ "integrity": "sha512-3uWLVXHY3jQxsXCr/UCNPSc2BG0hNUljhmOBt9l+lNFDp7zHgm0cK2Tw4kj2XfkJy4TgwZTBGwRDQgWEbLbdTA==" }, "node_modules/@ng-select/ng-option-highlight": { - "version": "12.0.6", - "resolved": "https://registry.npmjs.org/@ng-select/ng-option-highlight/-/ng-option-highlight-12.0.6.tgz", - "integrity": "sha512-c1ZoQZZSlxfo8M55hWPuifkUPdGn3iobXtkzC9YzXooOWpfW0OxVlowqbb+qYupGqfdlF+FH3TlihxWD9HragA==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@ng-select/ng-option-highlight/-/ng-option-highlight-13.2.0.tgz", + "integrity": "sha512-B10PiJbCur48R5OTm5hgToJ0c+xAyN4EkklUFd1TfVT+GkxSePQW312gdE3NOQK0ddFdi9xohGaGx5nJRIalWg==", + "license": "MIT", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/common": "^17.0.0-rc.0", - "@angular/core": "^17.0.0-rc.0" + "@angular/common": "^18.0.0", + "@angular/core": "^18.0.0" } }, "node_modules/@ng-select/ng-select": { - "version": "12.0.7", - "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-12.0.7.tgz", - "integrity": "sha512-Eht1zlLP0DJxiXcKnq3aY/EJ8odomgU0hM0BJoPY6oX3XFHndtFtdPxlZfhVtQn+FwyDEh7306rRx6digxVssA==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-13.2.0.tgz", + "integrity": "sha512-Oh4UaUvYJa6D+G4nEcdzqOgRP2TKqwwRpQBVVyLMUgzebSY3Cw9aJXqudqJ/EYiK3Bz+4uKJXPZIrYgNqqx02g==", + "license": "MIT", "dependencies": { "tslib": "^2.3.1" }, "engines": { - "node": ">= 16", + "node": ">= 18", "npm": ">= 8" }, "peerDependencies": { - "@angular/common": "^17.0.0-rc.0", - "@angular/core": "^17.0.0-rc.0", - "@angular/forms": "^17.0.0-rc.0" + "@angular/common": "^18.0.0", + "@angular/core": "^18.0.0", + "@angular/forms": "^18.0.0" } }, "node_modules/@ngneat/content-loader": { @@ -24722,17 +24724,17 @@ "integrity": "sha512-3uWLVXHY3jQxsXCr/UCNPSc2BG0hNUljhmOBt9l+lNFDp7zHgm0cK2Tw4kj2XfkJy4TgwZTBGwRDQgWEbLbdTA==" }, "@ng-select/ng-option-highlight": { - "version": "12.0.6", - "resolved": "https://registry.npmjs.org/@ng-select/ng-option-highlight/-/ng-option-highlight-12.0.6.tgz", - "integrity": "sha512-c1ZoQZZSlxfo8M55hWPuifkUPdGn3iobXtkzC9YzXooOWpfW0OxVlowqbb+qYupGqfdlF+FH3TlihxWD9HragA==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@ng-select/ng-option-highlight/-/ng-option-highlight-13.2.0.tgz", + "integrity": "sha512-B10PiJbCur48R5OTm5hgToJ0c+xAyN4EkklUFd1TfVT+GkxSePQW312gdE3NOQK0ddFdi9xohGaGx5nJRIalWg==", "requires": { "tslib": "^2.3.0" } }, "@ng-select/ng-select": { - "version": "12.0.7", - "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-12.0.7.tgz", - "integrity": "sha512-Eht1zlLP0DJxiXcKnq3aY/EJ8odomgU0hM0BJoPY6oX3XFHndtFtdPxlZfhVtQn+FwyDEh7306rRx6digxVssA==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@ng-select/ng-select/-/ng-select-13.2.0.tgz", + "integrity": "sha512-Oh4UaUvYJa6D+G4nEcdzqOgRP2TKqwwRpQBVVyLMUgzebSY3Cw9aJXqudqJ/EYiK3Bz+4uKJXPZIrYgNqqx02g==", "requires": { "tslib": "^2.3.1" } diff --git a/frontend/package.json b/frontend/package.json index 40417cd475a1..e08d8f36badb 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -93,8 +93,8 @@ "@hotwired/turbo": "^8.0.4", "@hotwired/turbo-rails": "^8.0.4", "@kolkov/ngx-gallery": "^2.0.1", - "@ng-select/ng-option-highlight": "12.0.6", - "@ng-select/ng-select": "^12.0.7", + "@ng-select/ng-option-highlight": "13.2.0", + "@ng-select/ng-select": "^13.2.0", "@ngneat/content-loader": "^7.0.0", "@ngx-formly/core": "^6.1.4", "@openproject/octicons-angular": "^19.14.0", From 7f0d181452fe23d540306c72d4663dcb0b2153fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Tue, 21 May 2024 20:25:13 +0200 Subject: [PATCH 084/325] Get rid of manual html_safe calls in reporting --- .../reporting/app/helpers/reporting_helper.rb | 90 +++++++------- .../app/views/cost_reports/index.html.erb | 5 +- modules/reporting/lib/report/result.rb | 4 +- modules/reporting/lib/widget/base.rb | 16 +-- .../reporting/lib/widget/controls/save_as.rb | 19 +-- modules/reporting/lib/widget/cost_types.rb | 6 +- modules/reporting/lib/widget/filters.rb | 28 +++-- modules/reporting/lib/widget/filters/heavy.rb | 8 +- .../lib/widget/filters/multi_choice.rb | 16 +-- .../reporting/lib/widget/filters/operators.rb | 11 +- .../reporting/lib/widget/filters/option.rb | 13 ++- modules/reporting/lib/widget/group_bys.rb | 29 +++-- .../reporting/lib/widget/reporting_widget.rb | 1 + modules/reporting/lib/widget/table.rb | 5 +- .../reporting/lib/widget/table/entry_table.rb | 17 +-- .../lib/widget/table/report_table.rb | 110 +++++++----------- 16 files changed, 194 insertions(+), 184 deletions(-) diff --git a/modules/reporting/app/helpers/reporting_helper.rb b/modules/reporting/app/helpers/reporting_helper.rb index cf3a04d5f483..9cafe6029989 100644 --- a/modules/reporting/app/helpers/reporting_helper.rb +++ b/modules/reporting/app/helpers/reporting_helper.rb @@ -100,31 +100,50 @@ def budget_link(budget_id) end end + # rubocop:disable Metrics/AbcSize def field_representation_map(key, value) return I18n.t(:"placeholders.default") if value.blank? case key.to_sym - when :activity_id then mapped value, Enumeration, "#{I18n.t(:caption_material_costs)}" - when :project_id then link_to_project Project.find(value.to_i) - when :user_id, :assigned_to_id, :author_id, :logged_by_id then link_to_user(User.find_by(id: value.to_i) || DeletedUser.first) - when :tyear, :units then h(value.to_s) - when :tweek then "#{I18n.t(:label_week)} ##{h value}" - when :tmonth then month_name(value.to_i) - when :category_id then h(Category.find(value.to_i).name) - when :cost_type_id then mapped value, CostType, I18n.t(:caption_labor) - when :budget_id then budget_link value - when :work_package_id then link_to_work_package(WorkPackage.find(value.to_i)) - when :spent_on then format_date(value.to_date) - when :type_id then h(Type.find(value.to_i).name) - when :week then "#{I18n.t(:label_week)} #%s" % value.to_i.modulo(100) - when :priority_id then h(IssuePriority.find(value.to_i).name) - when :version_id then h(Version.find(value.to_i).name) - when :singleton_value then "" - when :status_id then h(Status.find(value.to_i).name) - when /custom_field\d+/ then h(custom_value(key, value)) - else h(value.to_s) + when :activity_id + mapped value, Enumeration, "#{I18n.t(:caption_material_costs)}" + when :project_id + link_to_project Project.find(value.to_i) + when :user_id, :assigned_to_id, :author_id, :logged_by_id + link_to_user(User.find_by(id: value.to_i) || DeletedUser.first) + when :tweek + "#{I18n.t(:label_week)} ##{h value}" + when :tmonth + month_name(value.to_i) + when :category_id + Category.find(value.to_i).name + when :cost_type_id + mapped value, CostType, I18n.t(:caption_labor) + when :budget_id + budget_link value + when :work_package_id + link_to_work_package(WorkPackage.find(value.to_i)) + when :spent_on + format_date(value.to_date) + when :type_id + Type.find(value.to_i).name + when :week + "#{I18n.t(:label_week)} #%s" % value.to_i.modulo(100) + when :priority_id + IssuePriority.find(value.to_i).name + when :version_id + Version.find(value.to_i).name + when :singleton_value + "" + when :status_id + Status.find(value.to_i).name + when /custom_field\d+/ + custom_value(key, value) + else + value.to_s end end + # rubocop:enable Metrics/AbcSize def custom_value(cf_identifier, value) cf_id = cf_identifier.gsub("custom_field", "").to_i @@ -146,6 +165,13 @@ def field_sort_map(key, value) end end + def html_safe_gsub(string, *gsub_args, &) + html_safe = string.html_safe? + string.gsub(*gsub_args, &) + # We only mark the string as safe if the previous string was already safe + string.html_safe if html_safe # rubocop:disable Rails/OutputSafety + end + def show_result(row, unit_id = self.unit_id) case unit_id when -1 then l_hours(row.units) @@ -168,7 +194,7 @@ def available_cost_type_tabs(cost_types) tabs.map { |cost_type_id| [cost_type_id, cost_type_label(cost_type_id)] } end - def cost_type_label(cost_type_id, cost_type_inst = nil, _plural = true) + def cost_type_label(cost_type_id, cost_type_inst = nil) case cost_type_id when -1 then I18n.t(:caption_labor) when 0 then I18n.t(:label_money) @@ -176,27 +202,6 @@ def cost_type_label(cost_type_id, cost_type_inst = nil, _plural = true) end end - def link_to_details(result) - return "" # unless result.respond_to? :fields # uncomment to display - session_filter = { operators: session[:report][:filters][:operators].dup, values: session[:report][:filters][:values].dup } - filters = result.fields.inject session_filter do |struct, (key, value)| - key = key.to_sym - case key - when :week - set_filter_options struct, :tweek, value.to_i.modulo(100) - set_filter_options struct, :tyear, value.to_i / 100 - when :month, :year - set_filter_options struct, :"t#{key}", value - when :count, :units, :costs, :display_costs, :sum, :real_costs - else - set_filter_options struct, key, value - end - struct - end - options = { fields: filters[:operators].keys, set_filter: 1, action: :drill_down } - link_to "[+]", filters.merge(options), class: "drill_down", title: I18n.t(:description_drill_down) - end - ## # Create the appropriate action for an entry with the type of log to use def action_for(result, options = {}) @@ -218,8 +223,7 @@ def entry_for(result) # For a given row, determine how to render it's contents according to usability and # localization rules def show_row(row) - row_text = link_to_details(row) << row.render { |k, v| show_field(k, v) } - row_text.html_safe + row.render { |k, v| show_field(k, v) } end def delimit(items, options = {}) diff --git a/modules/reporting/app/views/cost_reports/index.html.erb b/modules/reporting/app/views/cost_reports/index.html.erb index 1d37980e00c2..6c3b58bea996 100644 --- a/modules/reporting/app/views/cost_reports/index.html.erb +++ b/modules/reporting/app/views/cost_reports/index.html.erb @@ -65,5 +65,8 @@ See COPYRIGHT and LICENSE files for more details.

<%= t(:text_costs_are_rounded_note) %> - <%= "
#{t(:information_restricted_depending_on_permission)}".html_safe unless User.current.admin?%> + <% unless User.current.admin? %> +
+ <%= t(:information_restricted_depending_on_permission) %> + <% end %>

diff --git a/modules/reporting/lib/report/result.rb b/modules/reporting/lib/report/result.rb index bfc6d58069fc..ac993d5cc90a 100644 --- a/modules/reporting/lib/report/result.rb +++ b/modules/reporting/lib/report/result.rb @@ -35,6 +35,7 @@ class Base alias values value include Enumerable include Report::QueryUtils + include ActionView::Helpers::OutputSafetyHelper def initialize(value) @important_fields ||= [] @@ -146,7 +147,8 @@ def final_column? end def render(keys = important_fields) - fields.map { |k, v| yield(k, v) if keys.include? k }.join + rendered = fields.map { |k, v| yield(k, v) if keys.include? k } + safe_join(rendered) end def set_key(index = []) diff --git a/modules/reporting/lib/widget/base.rb b/modules/reporting/lib/widget/base.rb index 3138db91fa2e..8cd0535d15b7 100644 --- a/modules/reporting/lib/widget/base.rb +++ b/modules/reporting/lib/widget/base.rb @@ -53,15 +53,11 @@ def initialize(query) end ## - # Write a string to the canvas. The string is marked as html_safe. - # This will write twice, if @cache_output is set. + # Write a string to the canvas. def write(str) - str ||= "" @output ||= "".html_safe - @output = @output + "" if @output.frozen? # Rails 2 freezes tag strings - @output.concat str.html_safe - @cache_output.concat(str.html_safe) if @cache_output - str.html_safe + @output << str + str end ## @@ -108,15 +104,13 @@ def render_with_cache(_options = {}, &) write Rails.cache.fetch(cache_key) else render(&) - Rails.cache.write(cache_key, @cache_output || @output) if cache? + Rails.cache.write(cache_key, @output) if cache? end end ## - # Set the canvas. If the canvas object isn't a string (e.g. cannot be cached easily), - # a @cache_output String is created, that will mirror what is being written to the canvas. + # Set the canvas. def set_canvas(canvas) - @cache_output = "".html_safe @output = canvas end end diff --git a/modules/reporting/lib/widget/controls/save_as.rb b/modules/reporting/lib/widget/controls/save_as.rb index c23ac74658f7..fac5007b659f 100644 --- a/modules/reporting/lib/widget/controls/save_as.rb +++ b/modules/reporting/lib/widget/controls/save_as.rb @@ -28,14 +28,13 @@ class Widget::Controls::SaveAs < Widget::Controls def render - if @subject.new_record? - link_name = I18n.t(:button_save) - icon = "icon-save" - else - link_name = I18n.t(:button_save_as) - icon = "icon-save" - end - button = link_to(link_name, "#", id: "query-icon-save-as", class: "button icon-context #{icon}") + link_name = + if @subject.new_record? + I18n.t(:button_save) + else + I18n.t(:button_save_as) + end + button = link_to(link_name, "#", id: "query-icon-save-as", class: "button icon-context icon-save") write(button + render_popup) end @@ -43,12 +42,13 @@ def cache_key "#{super}#{@subject.name}" end + # rubocop:disable Metrics/AbcSize def render_popup_form name = content_tag :p, class: "form--field -required -wide-label" do label_tag(:query_name, class: "form--label -transparent") do - Query.human_attribute_name(:name).html_safe + Query.human_attribute_name(:name) end + content_tag(:span, class: "form--field-container") do @@ -81,6 +81,7 @@ def render_popup_form name end end + # rubocop:enable Metrics/AbcSize def render_popup_buttons save_url_params = { action: "create", set_filter: "1" } diff --git a/modules/reporting/lib/widget/cost_types.rb b/modules/reporting/lib/widget/cost_types.rb index aa47078d88ef..67e63d3c7769 100644 --- a/modules/reporting/lib/widget/cost_types.rb +++ b/modules/reporting/lib/widget/cost_types.rb @@ -40,7 +40,7 @@ def render def contents content_tag :div do - available_cost_type_tabs(@subject).sort_by { |id, _| id }.map do |id, label| + tabs = available_cost_type_tabs(@subject).sort_by { |id, _| id }.map do |id, label| content_tag :div, class: "form--field -trailing-label" do types = label_tag "unit_#{id}", h(label), class: "form--label" types += content_tag :span, class: "form--field-container" do @@ -49,7 +49,9 @@ def contents end end end - end.join("").html_safe + end + + safe_join(tabs) end end end diff --git a/modules/reporting/lib/widget/filters.rb b/modules/reporting/lib/widget/filters.rb index f1a9aaf41456..0494e7418986 100644 --- a/modules/reporting/lib/widget/filters.rb +++ b/modules/reporting/lib/widget/filters.rb @@ -26,16 +26,22 @@ # See COPYRIGHT and LICENSE files for more details. #++ +# rubocop:disable Metrics/AbcSize class Widget::Filters < Widget::Base def render spacer = content_tag :li, "", class: "advanced-filters--spacer hide-when-print" add_filter = content_tag :li, id: "add_filter_block", class: "advanced-filters--add-filter hide-when-print" do - add_filter_label = label_tag "add_filter_select", I18n.t(:label_filter_add), - class: "advanced-filters--add-filter-label" - add_filter_label += label_tag "add_filter_select", I18n.t("js.filter.description.text_open_filter") + " " + - I18n.t("js.filter.description.text_close_filter"), - class: "hidden-for-sighted" + add_filter_label = label_tag( + "add_filter_select", + I18n.t(:label_filter_add), + class: "advanced-filters--add-filter-label" + ) + add_filter_label += label_tag( + "add_filter_select", + "#{I18n.t('js.filter.description.text_open_filter')} #{I18n.t('js.filter.description.text_close_filter')}", + class: "hidden-for-sighted" + ) add_filter_value = content_tag :div, class: "advanced-filters--add-filter-value" do select_tag "add_filter_select", @@ -44,7 +50,7 @@ def render name: nil end - (add_filter_label + add_filter_value).html_safe + add_filter_label + add_filter_value end list = content_tag :ul, id: "filter_table", class: "advanced-filters--filters" do @@ -63,7 +69,7 @@ def selectables def render_filters active_filters = @subject.filters.select(&:display?) - engine::Filter.all.select(&:selectable?).map do |filter| + filters = engine::Filter.all.select(&:selectable?).map do |filter| opts = { id: "filter_#{filter.underscore_name}", class: "#{filter.underscore_name} advanced-filters--filter", "data-filter-name": filter.underscore_name } @@ -76,9 +82,12 @@ def render_filters content_tag :li, opts do render_filter filter, active_instance end - end.join.html_safe + end + + safe_join(filters) end + # rubocop:disable Metrics/PerceivedComplexity def render_filter(f_cls, f_inst) f = f_inst || f_cls html = "".html_safe @@ -106,4 +115,7 @@ def render_filter(f_cls, f_inst) end render_widget RemoveButton, f, to: html end + # rubocop:enable Metrics/PerceivedComplexity end + +# rubocop:enable Metrics/AbcSize diff --git a/modules/reporting/lib/widget/filters/heavy.rb b/modules/reporting/lib/widget/filters/heavy.rb index e9701052cfc8..c360b84be77b 100644 --- a/modules/reporting/lib/widget/filters/heavy.rb +++ b/modules/reporting/lib/widget/filters/heavy.rb @@ -31,6 +31,7 @@ # Filter. This is overhead... # But well this is again one of those temporary solutions. class Widget::Filters::Heavy < Widget::Filters::Base + # rubocop:disable Metrics/AbcSize def render # TODO: sometimes filter.values is of the form [["3"]] and sometimes ["3"]. # (using cost reporting) @@ -50,9 +51,8 @@ def render end box end - alternate_text = opts.map(&:first).join(", ").html_safe - write(div + content_tag(:label) do - alternate_text - end) + alternate_text = safe_join(opts.map(&:first), ", ") + write(div + content_tag(:label, alternate_text)) end + # rubocop:enable Metrics/AbcSize end diff --git a/modules/reporting/lib/widget/filters/multi_choice.rb b/modules/reporting/lib/widget/filters/multi_choice.rb index 31a4080adbe0..250131bc5491 100644 --- a/modules/reporting/lib/widget/filters/multi_choice.rb +++ b/modules/reporting/lib/widget/filters/multi_choice.rb @@ -27,28 +27,30 @@ #++ class Widget::Filters::MultiChoice < Widget::Filters::Base + # rubocop:disable Metrics/AbcSize def render - filterName = filter_class.underscore_name - result = content_tag :div, id: "#{filterName}_arg_1", class: "advanced-filters--filter-value" do + filter_name = filter_class.underscore_name + result = content_tag :div, id: "#{filter_name}_arg_1", class: "advanced-filters--filter-value" do choices = filter_class.available_values.each_with_index.map do |(label, value), i| opts = { type: "radio", - name: "values[#{filterName}][]", - id: "#{filterName}_radio_option_#{i}", + name: "values[#{filter_name}][]", + id: "#{filter_name}_radio_option_#{i}", value: } opts[:checked] = "checked" if filter.values == [value].flatten radio_button = tag :input, opts content_tag :label, radio_button + translate(label), - for: "#{filterName}_radio_option_#{i}", + for: "#{filter_name}_radio_option_#{i}", "data-filter-name": filter_class.underscore_name, - class: "#{filterName}_radio_option filter_radio_option" + class: "#{filter_name}_radio_option filter_radio_option" end - content_tag :div, choices.join.html_safe, + content_tag :div, safe_join(choices), id: "#{filter_class.underscore_name}_arg_1_val" end write result end + # rubocop:enable Metrics/AbcSize private diff --git a/modules/reporting/lib/widget/filters/operators.rb b/modules/reporting/lib/widget/filters/operators.rb index 1c24fb6a21ed..b9c9384fd5ad 100644 --- a/modules/reporting/lib/widget/filters/operators.rb +++ b/modules/reporting/lib/widget/filters/operators.rb @@ -27,6 +27,7 @@ #++ class Widget::Filters::Operators < Widget::Filters::Base + # rubocop:disable Metrics/AbcSize def render write(content_tag(:div, class: "advanced-filters--filter-operator") do hide_select_box = filter_class.available_operators.count == 1 || filter_class.heavy? @@ -34,15 +35,16 @@ def render id: "operators[#{filter_class.underscore_name}]", name: "operators[#{filter_class.underscore_name}]", "data-filter-name": filter_class.underscore_name } - options.merge! style: "display: none" if hide_select_box + options[:style] = "display: none" if hide_select_box select_box = content_tag :select, options do - filter_class.available_operators.map do |o| + operators = filter_class.available_operators.map do |o| opts = { value: h(o.to_s), "data-arity": o.arity } opts.reverse_merge! "data-forced": o.forced if o.forced? opts[:selected] = "selected" if filter.operator.to_s == o.to_s content_tag(:option, opts) { h(I18n.t(o.label)) } - end.join.html_safe + end + safe_join(operators) end label1 = content_tag :label, hidden_for_sighted_label, @@ -56,8 +58,9 @@ def render hide_select_box ? label1 + select_box + label : label1 + select_box end) end + # rubocop:enable Metrics/AbcSize def hidden_for_sighted_label - h(filter_class.label) + " " + I18n.t(:label_operator) + " " + I18n.t("js.filter.description.text_open_filter") + "#{h(filter_class.label)} #{I18n.t(:label_operator)} #{I18n.t('js.filter.description.text_open_filter')}" end end diff --git a/modules/reporting/lib/widget/filters/option.rb b/modules/reporting/lib/widget/filters/option.rb index 21c71ebd4d40..8f4fa9da3972 100644 --- a/modules/reporting/lib/widget/filters/option.rb +++ b/modules/reporting/lib/widget/filters/option.rb @@ -32,13 +32,19 @@ # option-tags from the content array instead of the filters available values. class Widget::Filters::Option < Widget::Filters::Base def render + options = content(@options[:content] || filter_class.available_values) + write safe_join(options) + end + + # rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity + def content(values) first = true - write((@options[:content] || filter_class.available_values).map do |name, id, *args| + values.map do |name, id, *args| options = args.first || {} # optional configuration for values level = options[:level] # nesting_level is optional for values name = I18n.t(name) if name.is_a? Symbol name = I18n.t(:label_none) if name.empty? - name_prefix = (level && level > 0 ? ((" " * 2 * level) + "> ") : "") + name_prefix = (level && level > 0 ? "#{' ' * 2 * level}> " : "") if options[:optgroup] tag :optgroup, label: I18n.t(:label_sector) else @@ -49,6 +55,7 @@ def render first = false content_tag(:option, opts) { name_prefix + name } end - end.join.html_safe) + end end + # rubocop:enable Metrics/AbcSize, Metrics/PerceivedComplexity end diff --git a/modules/reporting/lib/widget/group_bys.rb b/modules/reporting/lib/widget/group_bys.rb index ed3ddd51eaf6..6a4d76df9f74 100644 --- a/modules/reporting/lib/widget/group_bys.rb +++ b/modules/reporting/lib/widget/group_bys.rb @@ -27,8 +27,9 @@ #++ class Widget::GroupBys < Widget::Base + # rubocop:disable Metrics/AbcSize def render_options(group_by_ary) - group_by_ary.sort_by(&:label).map do |group_by| + options = group_by_ary.sort_by(&:label).map do |group_by| next unless group_by.selectable? label_text = CGI::escapeHTML(h(group_by.label)).to_s @@ -37,7 +38,9 @@ def render_options(group_by_ary) content_tag :option, option_tags do h(truncate_single_line(group_by.label, length: 40)) end - end.join.html_safe + end + + safe_join(options) end def render_group(type, initially_selected) @@ -63,20 +66,20 @@ def render_group(type, initially_selected) out += content_tag :span, class: "group-by--control grid-content shrink" do label = label_tag "group-by--add-#{type}", - I18n.t(:label_group_by_add) + " " + - I18n.t("js.filter.description.text_open_filter"), + "#{I18n.t(:label_group_by_add)} #{I18n.t('js.filter.description.text_open_filter')}", class: "hidden-for-sighted" label += content_tag :select, id: "group-by--add-#{type}", class: "advanced-filters--select" do content = content_tag :option, I18n.t(:label_group_by_add), value: "", disabled: true, selected: true - content += engine::GroupBy.all_grouped.sort_by do |label, _group_by_ary| - I18n.t(label) - end.map do |label, group_by_ary| - content_tag :optgroup, label: h(I18n.t(label)) do + sort_by_options = engine::GroupBy.all_grouped.sort_by do |i18n_key, _group_by_ary| + I18n.t(i18n_key) + end.map do |i18n_key, group_by_ary| # rubocop:disable Style/MultilineBlockChain + content_tag :optgroup, label: h(I18n.t(i18n_key)) do render_options group_by_ary end - end.join.html_safe + end + content += safe_join(sort_by_options) content end @@ -89,12 +92,14 @@ def render_group(type, initially_selected) legend + container end end + # rubocop:enable Metrics/AbcSize def render write(content_tag(:div, id: "group-by--area", class: "autoscroll") do - out = render_group "columns", @subject.group_bys(:column) - out += render_group "rows", @subject.group_bys(:row) - out.html_safe + out = "".html_safe + out << render_group("columns", @subject.group_bys(:column)) + out << render_group("rows", @subject.group_bys(:row)) + out end) end end diff --git a/modules/reporting/lib/widget/reporting_widget.rb b/modules/reporting/lib/widget/reporting_widget.rb index d894bd981958..e413e5ffe088 100644 --- a/modules/reporting/lib/widget/reporting_widget.rb +++ b/modules/reporting/lib/widget/reporting_widget.rb @@ -31,6 +31,7 @@ class Widget::ReportingWidget < ActionView::Base include ActionView::Helpers::AssetTagHelper include ActionView::Helpers::FormTagHelper include ActionView::Helpers::JavaScriptHelper + include ActionView::Helpers::OutputSafetyHelper include Rails.application.routes.url_helpers include ApplicationHelper include ReportingHelper diff --git a/modules/reporting/lib/widget/table.rb b/modules/reporting/lib/widget/table.rb index c66f2e7e80d6..8d0d1a8e34a8 100644 --- a/modules/reporting/lib/widget/table.rb +++ b/modules/reporting/lib/widget/table.rb @@ -47,15 +47,14 @@ def resolve_table end def render - write("") + write("".html_safe) if @subject.result.count <= 0 write(content_tag(:div, "", class: "generic-table--no-results-container") do content_tag(:i, "", class: "icon-info1") + content_tag(:span, I18n.t(:no_results_title_text), class: "generic-table--no-results-title") end) else - str = render_widget(resolve_table, @subject, @options.reverse_merge(to: @output)) - @cache_output.write(str.html_safe) if @cache_output + render_widget(resolve_table, @subject, @options.reverse_merge(to: @output)) end end end diff --git a/modules/reporting/lib/widget/table/entry_table.rb b/modules/reporting/lib/widget/table/entry_table.rb index 76cc3958adda..bba07bc7b71b 100644 --- a/modules/reporting/lib/widget/table/entry_table.rb +++ b/modules/reporting/lib/widget/table/entry_table.rb @@ -48,14 +48,15 @@ def render def colgroup content_tag :colgroup do FIELDS.each do - concat content_tag(:col, "opHighlightCol" => true) {} + concat content_tag(:col, "", "opHighlightCol" => true) end - concat content_tag(:col, "opHighlightCol" => true) {} - concat content_tag(:col, "opHighlightCol" => true) {} - concat content_tag(:col) {} + concat content_tag(:col, "", "opHighlightCol" => true) + concat content_tag(:col, "", "opHighlightCol" => true) + concat content_tag(:col, "") end end + # rubocop:disable Metrics/AbcSize def head content_tag :thead do content_tag :tr do @@ -130,17 +131,16 @@ def body rows = "".html_safe @subject.each_direct_result do |result| rows << (content_tag(:tr) do - "".html_safe FIELDS.each do |field| - concat content_tag(:td, show_field(field, result.fields[field.to_s]).html_safe, + concat content_tag(:td, show_field(field, result.fields[field.to_s]), "raw-data": raw_field(field, result.fields[field.to_s]), class: "left") end - concat content_tag :td, show_result(result, result.fields["cost_type_id"].to_i).html_safe, + concat content_tag :td, show_result(result, result.fields["cost_type_id"].to_i), class: "units right", "raw-data": result.units concat content_tag :td, - show_result(result, 0).html_safe, + show_result(result, 0), class: "currency right", "raw-data": result.real_costs concat content_tag :td, icons(result) @@ -176,4 +176,5 @@ def icons(result) end icons end + # rubocop:enable Metrics/AbcSize end diff --git a/modules/reporting/lib/widget/table/report_table.rb b/modules/reporting/lib/widget/table/report_table.rb index a47a9e23798b..4b39acf562d3 100644 --- a/modules/reporting/lib/widget/table/report_table.rb +++ b/modules/reporting/lib/widget/table/report_table.rb @@ -37,117 +37,113 @@ def configure_query end end + # rubocop:disable Metrics/AbcSize def configure_walker @walker ||= @subject.walker @walker.for_final_row do |row, cells| - html = "#{show_row row}#{debug_fields(row)}" - html << cells.join - html << "#{show_result(row)}#{debug_fields(row)}" - html.html_safe + content_tag(:th, class: "normal inner left -break-word", scope: "row") do + concat show_row(row) + concat safe_join(cells) + concat content_tag(:td, show_result(row), class: "normal inner right") + end end @walker.for_row do |row, subrows| subrows.flatten! unless row.fields.empty? - subrows[0] = %{ - #{show_row row}#{debug_fields(row)} - #{subrows[0].gsub("class='normal", "class='top")} - #{show_result(row)}#{debug_fields(row)} - }.html_safe + subrows[0] = capture do + concat content_tag(:th, show_row(row), class: "top left -breakword", rowspan: subrows.size) + concat html_safe_gsub(subrows[0], "class='normal", "class='top") + concat content_tag(:th, show_result(row), class: "top right", rowspan: subrows.size) + end end - subrows.last.gsub!("class='normal", "class='bottom") - subrows.last.gsub!("class='top", "class='bottom top") + subrows[-1] = html_safe_gsub(subrows.last, "class='normal", "class='bottom") + subrows[-1] = html_safe_gsub(subrows.last, "class='top", "class='bottom top") + subrows end @walker.for_empty_cell { " ".html_safe } @walker.for_cell do |result| - write(" ".html_safe) # XXX: This keeps the Apache from timing out on us. Keep-Alive byte! - "#{show_result result}#{debug_fields(result)}".html_safe + content_tag(:td, show_result(result), class: "normal right") end end + # rubocop:enable Metrics/AbcSize def render configure_query configure_walker - write "" + write "
".html_safe render_thead render_tfoot render_tbody - write "
" + write "".html_safe end def render_tbody - write "" + write "".html_safe first = true odd = true walker.body do |line| if first - line.gsub!("class='normal", "class='top") + line = html_safe_gsub(line, "class='normal", "class='top") first = false end - mark_penultimate_column! line - write "#{line}" + line = mark_penultimate_column(line) + write content_tag(:tr, line, class: odd ? "odd" : "even") odd = !odd end - write "" + write "".html_safe end - def mark_penultimate_column!(line) - line.gsub! /()[^<]*)[^<]*" + write "".html_safe walker.headers do |list, first, first_in_col, last_in_col| - write "" if first_in_col + write "".html_safe if first_in_col if first - write(content_tag(:th, rowspan: @subject.depth_of(:column), colspan: @subject.depth_of(:row)) do - "" - end) + write(content_tag(:th, "", rowspan: @subject.depth_of(:column), colspan: @subject.depth_of(:row))) end list.each do |column| opts = { colspan: column.final_number(:column) } - opts.merge!(class: "inner") if column.final?(:column) + opts[:class] = "inner" if column.final?(:column) write(content_tag(:th, opts) do show_row column end) end if first - write(content_tag(:th, rowspan: @subject.depth_of(:column), colspan: @subject.depth_of(:row)) do - "" - end) + write(content_tag(:th, "", rowspan: @subject.depth_of(:column), colspan: @subject.depth_of(:row))) end - write "" if last_in_col + write "".html_safe if last_in_col end - write "" + write "".html_safe end def render_tfoot return if walker.headers_empty? - write "" + write "".html_safe walker.reverse_headers do |list, first, first_in_col, last_in_col| if first_in_col - write "" + write "".html_safe if first - write(content_tag(:th, rowspan: @subject.depth_of(:column), colspan: @subject.depth_of(:row), class: "top") do - " " - end) + write(content_tag(:th, " ", rowspan: @subject.depth_of(:column), colspan: @subject.depth_of(:row), class: "top")) end end list.each do |column| opts = { colspan: column.final_number(:column) } - opts.merge!(class: "inner") if first - write(content_tag(:th, opts) do - show_result(column) # {debug_fields(column)} - end) + opts[:class] = "inner" if first + write(content_tag(:th, show_result(column), opts)) end if last_in_col if first @@ -158,32 +154,10 @@ def render_tfoot show_result @subject end) end - write "" - end - end - write "" - end - - def debug_content - content_tag :pre do - debug_pre_content = "[ Query ]" + - @subject.chain.each do |child| - "#{h child.class.inspect}, #{h child.type}" - end - - debug_pre_content += "[ RESULT ]" - @subject.result.recursive_each_with_level do |level, result| - debug_pre_content += ">>> " * (level + 1) - debug_pre_content += h(result.inspect) - debug_pre_content += " " * (level + 1) - debug_pre_content += h(result.type.inspect) - debug_pre_content += " " * (level + 1) - debug_pre_content += h(result.fields.inspect) - end - debug_pre_content += "[ HEADER STACK ]" - debug_pre_content += walker.header_stack.each do |l| - ">>> #{l.inspect}" + write "".html_safe end end + write "".html_safe end + # rubocop:enable Metrics/AbcSize end From 7eb9d1797ff6083f220aa02b044c9a0b6673d9e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Tue, 21 May 2024 20:25:25 +0200 Subject: [PATCH 085/325] Remove remnants of debug_fields --- modules/reporting/app/helpers/reporting_helper.rb | 4 ---- modules/reporting/lib/widget/table.rb | 2 +- modules/reporting/lib/widget/table/report_table.rb | 3 ++- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/modules/reporting/app/helpers/reporting_helper.rb b/modules/reporting/app/helpers/reporting_helper.rb index 9cafe6029989..46af2f593815 100644 --- a/modules/reporting/app/helpers/reporting_helper.rb +++ b/modules/reporting/app/helpers/reporting_helper.rb @@ -68,10 +68,6 @@ def label_for(field) end end - def debug_fields(result, prefix = ", ") - prefix << result.fields.inspect << ", " << result.important_fields.inspect << ", " << result.key.inspect if params[:debug] - end - def month_name(index) Date::MONTHNAMES[index].to_s end diff --git a/modules/reporting/lib/widget/table.rb b/modules/reporting/lib/widget/table.rb index 8d0d1a8e34a8..4274e61a5021 100644 --- a/modules/reporting/lib/widget/table.rb +++ b/modules/reporting/lib/widget/table.rb @@ -30,7 +30,7 @@ class Widget::Table < Widget::Base extend Report::InheritedAttribute include ReportingHelper - attr_accessor :debug, :fields, :mapping + attr_accessor :fields, :mapping def initialize(query) raise ArgumentError, "Tables only work on CostQuery!" unless query.is_a? CostQuery diff --git a/modules/reporting/lib/widget/table/report_table.rb b/modules/reporting/lib/widget/table/report_table.rb index 4b39acf562d3..77a0b26285a9 100644 --- a/modules/reporting/lib/widget/table/report_table.rb +++ b/modules/reporting/lib/widget/table/report_table.rb @@ -105,7 +105,8 @@ def mark_penultimate_column(line) # rubocop:disable Metrics/AbcSize def render_thead - return if walker.headers && walker.headers_empty? + walker.headers + return if walker.headers_empty? write "".html_safe walker.headers do |list, first, first_in_col, last_in_col| From 69eb2ddbc45d9e0b8512893fcf054738a72d5fad Mon Sep 17 00:00:00 2001 From: Behrokh Satarnejad Date: Tue, 11 Jun 2024 12:44:41 +0200 Subject: [PATCH 086/325] change date picker styles --- .../modal-banner/modal-banner.component.sass | 2 +- .../styles/sass/components/text-field.sass | 2 +- .../global_styles/content/_datepicker.sass | 69 ++++++++++--------- 3 files changed, 37 insertions(+), 36 deletions(-) diff --git a/frontend/src/app/shared/components/modal/modal-banner/modal-banner.component.sass b/frontend/src/app/shared/components/modal/modal-banner/modal-banner.component.sass index 37d36ed51f9e..d706c5a7335c 100644 --- a/frontend/src/app/shared/components/modal/modal-banner/modal-banner.component.sass +++ b/frontend/src/app/shared/components/modal/modal-banner/modal-banner.component.sass @@ -15,7 +15,7 @@ border-top-right-radius: $spot-spacing-0-25 &_warning - background: $spot-color-feedback-warning-light + background: var(--bgColor-attention-muted) &_info background: $spot-color-feedback-info-light diff --git a/frontend/src/app/spot/styles/sass/components/text-field.sass b/frontend/src/app/spot/styles/sass/components/text-field.sass index f5c24ed0d5fb..848dbe105a81 100644 --- a/frontend/src/app/spot/styles/sass/components/text-field.sass +++ b/frontend/src/app/spot/styles/sass/components/text-field.sass @@ -5,7 +5,7 @@ color: $spot-color-basic-black border-radius: 4px padding: $spot-spacing-0_5 - background-color: $spot-color-basic-white + background-color: var(--bgColor-default) display: inline-flex justify-content: center align-items: center diff --git a/frontend/src/global_styles/content/_datepicker.sass b/frontend/src/global_styles/content/_datepicker.sass index 887f6a3873e5..e0a5c4f90843 100644 --- a/frontend/src/global_styles/content/_datepicker.sass +++ b/frontend/src/global_styles/content/_datepicker.sass @@ -29,7 +29,7 @@ $datepicker--selected-border-radius: 5px @mixin disabled-day - background: $spot-color-basic-white + background: var(--body-background) color: var(--fgColor-muted) pointer-events: none cursor: not-allowed @@ -38,14 +38,14 @@ $datepicker--selected-border-radius: 5px border-color: transparent @mixin non-working-day - background: $spot-color-basic-gray-6 + background: var(--bgColor-disabled) color: var(--fgColor-muted) border-radius: 0 pointer-events: none @mixin non-working-day_enabled - background: $spot-color-basic-gray-6 - color: $spot-color-basic-gray-1 + background: var(--bgColor-disabled) + color: var(--body-font-color) border-radius: 0 pointer-events: auto @@ -62,7 +62,7 @@ $datepicker--selected-border-radius: 5px .flatpickr-prev-month, .flatpickr-next-month svg - fill: $spot-color-basic-gray-1 !important + fill: var(--body-font-color) !important .flatpickr-day &.flatpickr-disabled @@ -77,6 +77,7 @@ $datepicker--selected-border-radius: 5px top: unset !important .flatpickr-calendar + background: var(--overlay-bgColor) !important box-shadow: none !important @include spot-caption @@ -91,7 +92,8 @@ $datepicker--selected-border-radius: 5px .numInputWrapper position: relative left: 0 - + .flatpickr-month + color: var(--body-font-color) !important .flatpickr-weekwrapper display: none @@ -130,8 +132,8 @@ $datepicker--selected-border-radius: 5px max-width: 267px .flatpickr-day - color: $spot-color-basic-gray-1 - background: $spot-color-basic-white + color: var(--body-font-color) + background: var(--body-background) width: 100% max-width: unset height: 30px @@ -150,12 +152,11 @@ $datepicker--selected-border-radius: 5px @include non-working-day_enabled &.today:not(.selected, .inRange, .startRange, .endRange) - background: $spot-color-indication-current-date - border-color: $spot-color-indication-current-date + background: var(--color-scale-yellow-0) + border-color: var(--color-scale-yellow-0) border-radius: 0 &:hover - color: $spot-color-basic-gray-1 border-color: var(--fgColor-muted) &.selected:not(.startRange, .endRange) @@ -166,7 +167,7 @@ $datepicker--selected-border-radius: 5px &.endRange background: var(--control-checked-color) border-color: var(--control-checked-color) - color: $spot-color-basic-white + color: var(--color-scale-white) &:hover background: var(--control-checked-color--major2) @@ -192,41 +193,41 @@ $datepicker--selected-border-radius: 5px border-color: var(--control-checked-color--major2) &.flatpickr-non-working-day - background: $spot-color-basic-gray-6 - border-color: $spot-color-basic-gray-6 + background: var(--bgColor-disabled) + border-color: var(--bgColor-disabled) &.flatpickr-disabled @include disabled-day &.flatpickr-non-working-day - background: $spot-color-basic-gray-6 + background: var(--bgColor-disabled) color: var(--fgColor-muted) &.flatpickr-non-working-day_enabled - background: $spot-color-basic-gray-6 + background: var(--bgColor-disabled) color: var(--fgColor-muted) &.inRange color: var(--fgColor-muted) - background: $spot-color-basic-gray-6 - border-color: $spot-color-basic-gray-6 + background: var(--bgColor-disabled) + border-color: var(--bgColor-disabled) &.selected, &.startRange, &.endRange - background: var(--fgColor-muted) - border-color: var(--fgColor-muted) - color: $spot-color-basic-gray-5 + background: var(--bgColor-disabled) + border-color: var(--bgColor-disabled) + color: var(--bgColor-neutral-muted) &.inRange - background: $spot-color-basic-gray-5 - border-color: $spot-color-basic-gray-5 + background: var(--bgColor-neutral-muted) + border-color: var(--bgColor-neutral-muted) color: var(--fgColor-muted) &.today color: var(--fgColor-muted) - background: $spot-color-indication-current-date - border-color: $spot-color-indication-current-date + background: var(--color-scale-yellow-0) + border-color: var(--color-scale-yellow-0) .flatpickr-calendar.flatpickr-container-suppress-hover .flatpickr-day @@ -235,28 +236,28 @@ $datepicker--selected-border-radius: 5px &.endRange:not(.selected) background: transparent !important border-color: transparent !important - color: $spot-color-basic-gray-1 !important + color: var(--body-font-color) !important &.flatpickr-non-working-day:not(.today,.selected) - background: $spot-color-basic-gray-6 !important + background: var(--bgColor-disabled) !important color: var(--fgColor-muted) !important &.flatpickr-non-working-day_enabled:not(.today,.selected) - background: $spot-color-basic-gray-6 !important - color: $spot-color-basic-gray-1 !important + background: var(--bgColor-disabled) !important + color: var(--body-font-color) !important &.today - color: $spot-color-basic-gray-1 !important + color: var(--body-font-color) !important &.inRange, &.startRange:not(.selected), &.endRange:not(.selected) - color: $spot-color-basic-gray-1 !important - background: $spot-color-basic-gray-6 !important - border-color: $spot-color-basic-gray-6 !important + color: var(--body-font-color) !important + background: var(--bgColor-disabled) !important + border-color: var(--bgColor-disabled) !important .flatpickr-calendar:not(.inline) - box-shadow: $spot-shadow-light-mid !important + box-shadow: var(--shadow-resting-medium) !important padding: $spot-spacing-0_5 !important width: max-content !important From 4f2b8d39c26ef2ab45606db2c0d6e64d24f97313 Mon Sep 17 00:00:00 2001 From: Henriette Darge Date: Wed, 5 Jun 2024 13:56:37 +0200 Subject: [PATCH 087/325] Replace old icons with Octicons inside the main menu --- app/views/admin/index.html.erb | 2 +- config/initializers/menus.rb | 92 +++++++++---------- .../global_styles/common/header/app-help.sass | 12 --- .../global_styles/common/header/index.sass | 1 - .../src/global_styles/common/menu/menu.sass | 8 +- .../content/menus/_menu_blocks.sass | 4 +- lib/redmine/menu_manager/menu_helper.rb | 20 +++- .../menu_manager/top_menu/help_menu.rb | 2 +- lib/redmine/menu_manager/wiki_menu_helper.rb | 2 +- .../lib/open_project/avatars/engine.rb | 2 +- .../lib/open_project/backlogs/engine.rb | 2 +- modules/bim/lib/open_project/bim/engine.rb | 2 +- .../boards/lib/open_project/boards/engine.rb | 6 +- modules/budgets/lib/budgets/engine.rb | 2 +- modules/dashboards/lib/dashboards/engine.rb | 2 +- .../lib/open_project/documents/engine.rb | 2 +- .../gantt/lib/open_project/gantt/engine.rb | 6 +- .../open_project/github_integration/engine.rb | 4 +- .../lib/open_project/meeting/engine.rb | 6 +- modules/overviews/lib/overviews/engine.rb | 2 +- .../lib/open_project/reporting/engine.rb | 6 +- .../lib/open_project/storages/engine.rb | 6 +- .../lib/open_project/team_planner/engine.rb | 6 +- .../two_factor_authentication/engine.rb | 2 +- spec/controllers/admin_controller_spec.rb | 2 +- 25 files changed, 98 insertions(+), 103 deletions(-) delete mode 100644 frontend/src/global_styles/common/header/app-help.sass diff --git a/app/views/admin/index.html.erb b/app/views/admin/index.html.erb index 9f67f397c8da..030d95237521 100644 --- a/app/views/admin/index.html.erb +++ b/app/views/admin/index.html.erb @@ -34,7 +34,7 @@ See COPYRIGHT and LICENSE files for more details. diff --git a/app/components/projects/index_sub_header_component.html.erb b/app/components/projects/index_sub_header_component.html.erb index bd09217edd2c..82dc01433430 100644 --- a/app/components/projects/index_sub_header_component.html.erb +++ b/app/components/projects/index_sub_header_component.html.erb @@ -1,5 +1,5 @@ <%= render(Primer::OpenProject::SubHeader.new(data: { - controller: "filters", + controller: "filter--filters-form", "application-target": "dynamic", })) do |subheader| subheader.with_filter_component do diff --git a/app/components/projects/settings/project_custom_field_sections/index_component.html.erb b/app/components/projects/settings/project_custom_field_sections/index_component.html.erb index 3c31b3294e78..b4044ee99669 100644 --- a/app/components/projects/settings/project_custom_field_sections/index_component.html.erb +++ b/app/components/projects/settings/project_custom_field_sections/index_component.html.erb @@ -12,7 +12,7 @@ size: :small }, show_clear_button: true, - clear_button_id: "project-custom-fields-mapping-filter-clear-button", + clear_button_id: clear_button_id, data: { action: "input->projects--settings--project-custom-fields-mapping-filter#filterLists", "projects--settings--project-custom-fields-mapping-filter-target": "filter" diff --git a/app/components/projects/settings/project_custom_field_sections/index_component.rb b/app/components/projects/settings/project_custom_field_sections/index_component.rb index 3ea8e301d048..73219fc542d0 100644 --- a/app/components/projects/settings/project_custom_field_sections/index_component.rb +++ b/app/components/projects/settings/project_custom_field_sections/index_component.rb @@ -46,9 +46,14 @@ def initialize(project:, project_custom_field_sections:) def wrapper_data_attributes { controller: "projects--settings--project-custom-fields-mapping-filter", - "application-target": "dynamic" + "application-target": "dynamic", + "projects--settings--project-custom-fields-mapping-filter-clear-button-id-value": clear_button_id } end + + def clear_button_id + "project-custom-fields-mapping-filter-clear-button" + end end end end diff --git a/app/components/projects/settings/project_custom_field_sections/index_component.sass b/app/components/projects/settings/project_custom_field_sections/index_component.sass deleted file mode 100644 index 9380cd6b3874..000000000000 --- a/app/components/projects/settings/project_custom_field_sections/index_component.sass +++ /dev/null @@ -1,3 +0,0 @@ -.Box - .hidden-by-filter - display: none diff --git a/app/views/filters/_autocomplete.html.erb b/app/views/filters/_autocomplete.html.erb index 2a54be1853ce..c33e527e4d3c 100644 --- a/app/views/filters/_autocomplete.html.erb +++ b/app/views/filters/_autocomplete.html.erb @@ -9,7 +9,7 @@ class: 'form--field', data: { 'filter-autocomplete': true, - 'filters-target': 'filterValueContainer', + 'filter--filters-form-target': 'filterValueContainer', 'filter-name': filter.name } %> diff --git a/app/views/filters/_boolean.html.erb b/app/views/filters/_boolean.html.erb index e87d54a6c2e0..14e336108f18 100644 --- a/app/views/filters/_boolean.html.erb +++ b/app/views/filters/_boolean.html.erb @@ -1,5 +1,5 @@