diff --git a/app/helpers/custom_fields_helper.rb b/app/helpers/custom_fields_helper.rb index 1c9d15ae2087..f9880b5d14e6 100644 --- a/app/helpers/custom_fields_helper.rb +++ b/app/helpers/custom_fields_helper.rb @@ -204,14 +204,9 @@ def format_value(value, custom_field) # Return an array of custom field formats which can be used in select_tag def custom_field_formats_for_select(custom_field) - hierarchy_if_deactivated = lambda do |format| - format.name == "hierarchy" && !OpenProject::FeatureDecisions.custom_field_of_type_hierarchy_active? - end - OpenProject::CustomFieldFormat.all_for_field(custom_field) .sort_by(&:order) .reject { |format| format.label.nil? } - .reject(&hierarchy_if_deactivated) .map do |custom_field_format| [label_for_custom_field_format(custom_field_format.name), custom_field_format.name] end diff --git a/config/initializers/feature_decisions.rb b/config/initializers/feature_decisions.rb index 1af9d4f3b80d..546662ab0263 100644 --- a/config/initializers/feature_decisions.rb +++ b/config/initializers/feature_decisions.rb @@ -47,9 +47,6 @@ description: "Allows to generate a PDF document from a work package description. " \ "See #45896 for details." -OpenProject::FeatureDecisions.add :custom_field_of_type_hierarchy, - description: "Allows the use of the custom field type 'Hierarchy'." - # TODO: Remove once the feature flag primerized_work_package_activities is removed altogether OpenProject::FeatureDecisions.define_singleton_method(:primerized_work_package_activities_active?) do Rails.env.production? || diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index 24f7c77a1ef5..c4fb3454098e 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -414,22 +414,22 @@ ru: will_remove_the_groups_role: "Это удалит роль группы из этого проекта." however_work_packages_shared_with_user_html: one: "Однако, %{shared_work_packages_link} также был предоставлен этому пользователю." - few: "However, %{shared_work_packages_link} have also been shared with this user." - many: "However, %{shared_work_packages_link} have also been shared with this user." + few: "Однако, %{shared_work_packages_link} так же были предоставлены этому пользователю." + many: "Однако, %{shared_work_packages_link} так же были предоставлены этому пользователю." other: "Однако, %{shared_work_packages_link} также был предоставлен этому пользователю." however_work_packages_shared_with_group_html: one: "Однако, %{shared_work_packages_link} также был предоставлен этой группе." - few: "However, %{shared_work_packages_link} have also been shared with this group." - many: "However, %{shared_work_packages_link} have also been shared with this group." - other: "Однако, %{shared_work_packages_link} также был предоставлен этой группе." + few: "Однако, %{shared_work_packages_link} так же были предоставлены этой группе." + many: "Однако, %{shared_work_packages_link} так же были предоставлены этой группе." + other: "Однако, %{shared_work_packages_link} так же был предоставлен этой группе." remove_work_packages_shared_with_user_too: "Пользователь, который был удален как участник по-прежнему может получить доступ к общим пакетам работ. Вы хотели бы также удалить эти доступы?" remove_work_packages_shared_with_group_too: "Группа, которая была удалена как участник, все еще может получить доступ к общим пакетам работ. Вы хотели бы также удалить эти доступы?" will_not_affect_inherited_shares: "(Это не повлияет на рабочие пакеты, которыми они делятся со своей группой)." can_remove_direct_but_not_shared_roles: "Вы можете удалить этого пользователя как непосредственного участника проекта, но группа, в которой он состоит, также является участником этого проекта, поэтому он будет продолжать оставаться участником через группу." also_work_packages_shared_with_user_html: one: "Также, %{shared_work_packages_link} был предоставлен этому пользователю." - few: "Also, %{shared_work_packages_link} have been shared with this user." - many: "Also, %{shared_work_packages_link} have been shared with this user." + few: "Также, %{shared_work_packages_link} были предоставлены этому пользователю." + many: "Также, %{shared_work_packages_link} были предоставлены этому пользователю." other: "Также, %{shared_work_packages_link} был предоставлен этому пользователю." remove_project_membership_or_work_package_shares_too: "Вы хотите удалить только пользователя как непосредственного участника (и сохранить общие ресурсы) или также удалить общие ресурсы рабочего пакета?" will_remove_all_user_access_priveleges: "Удаление этого участника удалит все права доступа пользователя к проекту. Пользователь по-прежнему будет существовать как часть системы." @@ -441,18 +441,18 @@ ru: title: "Отменить общий доступ к пакету работ" shared_with_this_user_html: one: "%{all_shared_work_packages_link} был предоставлен этому пользователю." - few: "%{all_shared_work_packages_link} have been shared with this user." - many: "%{all_shared_work_packages_link} have been shared with this user." - other: "%{all_shared_work_packages_link} был предоставлен этому пользователю." + few: "%{all_shared_work_packages_link} были предоставлены этому пользователю." + many: "%{all_shared_work_packages_link} были предоставлены этому пользователю." + other: "%{all_shared_work_packages_link} были предоставлены этому пользователю." shared_with_this_group_html: one: "%{all_shared_work_packages_link} был предоставлен этой группе." - few: "%{all_shared_work_packages_link} have been shared with this group." - many: "%{all_shared_work_packages_link} have been shared with this group." - other: "%{all_shared_work_packages_link} был предоставлен этой группе." + few: "%{all_shared_work_packages_link} были предоставлены этой группе." + many: "%{all_shared_work_packages_link} были предоставлены этой группе." + other: "%{all_shared_work_packages_link} были предоставлены этой группе." shared_with_permission_html: one: "Только %{shared_work_packages_link} был предоставлен общий доступ с правами %{shared_role_name}." - few: "Only %{shared_work_packages_link} have been shared with %{shared_role_name} permissions." - many: "Only %{shared_work_packages_link} have been shared with %{shared_role_name} permissions." + few: "Только %{shared_work_packages_link} был предоставлен общий доступ с правами %{shared_role_name}." + many: "Только %{shared_work_packages_link} был предоставлен общий доступ с правами %{shared_role_name}." other: "Только %{shared_work_packages_link} был предоставлен общий доступ с правами %{shared_role_name}." revoke_all_or_with_role: "Хотите ли Вы отменить доступ ко всем общим пакетам работ или только к тем, которые имеют разрешения %{shared_role_name}?" will_not_affect_inherited_shares: "(Это не повлияет на пакеты работ, разделенные с их группой)." @@ -538,8 +538,8 @@ ru: and_user: "и %{user}" and_others: one: и еще 1 - few: and %{count} others - many: and %{count} others + few: и еще %{count} + many: и еще %{count} other: и еще %{count} reaction_by: "%{reaction} от" reportings: @@ -1355,8 +1355,8 @@ ru: status: "Статус пакета работ" token/api: one: Токен доступа - few: Access tokens - many: Access tokens + few: Токены доступа + many: Токены доступа other: Токены доступа type: "Тип" user: "Пользователь" diff --git a/config/locales/en.yml b/config/locales/en.yml index 9657cfe546b0..aa05c4b171c9 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -731,7 +731,7 @@ en: follows_description: "The related work package necessarily needs to finish before this one can start" label_child_singular: "child" label_child_plural: "children" - child_description: "Makes the related a work package a sub-item of the current (parent) work package" + child_description: "Makes the related work package a sub-item of the current (parent) work package" label_blocks_singular: "blocks" label_blocks_plural: "blocks" blocks_description: "The related work package cannot be closed until this one is closed first" diff --git a/docs/release-notes/15-0-0/README.md b/docs/release-notes/15-0-0/README.md index 809db56fbba1..1b95ddf3bdd9 100644 --- a/docs/release-notes/15-0-0/README.md +++ b/docs/release-notes/15-0-0/README.md @@ -235,4 +235,4 @@ Last but not least, we are very grateful for our very engaged translation contri - [hmmftg](https://crowdin.com/profile/hmmftg), for a great number of translations into Persian. - [william](https://crowdin.com/profile/WilliamFromTW), for a great number of translations into Chinese Simplified and Chinese Traditional. -Would you like to help out with translations yourself? Then take a look at our [translation guide](../../contributions-guide/translate-openproject/) and find out exactly how you can contribute. It is very much appreciated! +Would you like to help out with translations yourself? Then take a look at our [translation guide](../../contributions-guide/translate-openproject/) and find out exactly how you can contribute. It is very much appreciated! \ No newline at end of file diff --git a/docs/release-notes/15-0-2/README.md b/docs/release-notes/15-0-2/README.md index 87f50df7b795..44c2213b71dd 100644 --- a/docs/release-notes/15-0-2/README.md +++ b/docs/release-notes/15-0-2/README.md @@ -29,7 +29,7 @@ At the end, you will find a complete list of all changes and bug fixes. - Bugfix: Storage in copied project does not have the correct Project Folder setting \[[#59344](https://community.openproject.org/wp/59344)\] - Bugfix: Cannot change limit\_self\_registration for SAML auth providers \[[#59370](https://community.openproject.org/wp/59370)\] - Bugfix: Option to limit\_self\_registration in SAML provider not respected \[[#59375](https://community.openproject.org/wp/59375)\] -- Bugfix: Migration of SAML auth providers doesn't retain limit\_self\_registration \[[#59403](https://community.openproject.org/wp/59403)\] +- Bugfix: Migration of SAML auth providers doesn't retain limit\_self\_registration \[[#59403](https://community.openproject.org/wp/59403)\] - Bugfix: OpenID connect does not allow setting custom scopes \[[#59430](https://community.openproject.org/wp/59430)\] diff --git a/docs/release-notes/15-1-0/README.md b/docs/release-notes/15-1-0/README.md index ef71de6e2d42..4a1f193a647d 100644 --- a/docs/release-notes/15-1-0/README.md +++ b/docs/release-notes/15-1-0/README.md @@ -3,25 +3,78 @@ title: OpenProject 15.1.0 sidebar_navigation: title: 15.1.0 release_version: 15.1.0 -release_date: 2024-11-28 +release_date: 2024-12-11 --- # OpenProject 15.1.0 -Release date: 2024-11-28 +Release date: 2024-12-11 -We released OpenProject [OpenProject 15.1.0](https://community.openproject.org/versions/2122). -The release contains several bug fixes and we recommend updating to the newest version. -In these Release Notes, we will give an overview of important feature changes. -At the end, you will find a complete list of all changes and bug fixes. +We released [OpenProject 15.1.0](https://community.openproject.org/versions/2122). The release contains several bug fixes, and we recommend updating to the newest version. +In these Release Notes, we will give an overview of important feature changes and technical updates. At the end, you will find a complete list of all changes and bug fixes. ## Important feature changes - +### Custom fields of type hierarchy (Enterprise add-on) -## Important updates and breaking changes +Enterprise customers can now use a new type of custom field that allows **multi-level selections**. This makes it easier for users to organize and navigate complex data in structured, multi-level formats within work packages. The new custom fields of the hierarchy type can be added to work packages and then structured into several lower-level values. - +Each custom field of type hierarchy can be given a short name (e.g. B for Berlin). Here's an example of how custom fields of the hierarchy type look like, using the example of a detailed assignment of workspaces: + +![Example screenshot of custom fields of type hierarchy, displaying different cities as main offices](openproject-15-1-custom-field-hierarchy.jpg) + +[Read all about custom fields in our system admin guide](../../system-admin-guide/custom-fields/). + +### Redesign of the Relations tab in work packages + +The Relations tab in work packages has been completely redesigned using Primer design system, including a **new dropdown menu that allows you to directly choose the type of relation**, e.g. if the related work package is a successor and necessarily needs to start after the selected one finishes. + +Additionally, you can now add a description to add further information about the relation. Please note that the description will be displayed on both work packages, below the related other work package. + +> [!NOTE] +> Important information: With this redesign, **you will no longer be able to create new work packages directly on the Relations tab**. Please tell us if you were using this feature a lot. If it will be missed by many users, we will find a way to bring it back. + +![Screenshot showing the new Relations tab in a work package](openproject-15-1-relations.png) + +[Read all about work package relations and hierarchies in our user guide](../../user-guide/work-packages/work-package-relations-hierarchies/). + +### Redesign of the Meetings index page + +The index page of the Meetings module has been redesigned with Primer as well, making it easier to read and have a more modern look. You see your list of meetings in some kind of table view, with the columns being: Title, Date and time, Duration, and Location. + +The + Meeting button in the top right corner now offers a dropdown menu where you can directly choose whether you want to add a dynamic or classic meeting. + +Here's an example screenshot of the redesigned Meetings index page: + +![Example screenshot of the redesigned Meetings index page](openproject-15-1-meetings.png) + +[Learn what is possible with OpenProject's Dynamic Meetings to improve collaboration with your colleagues](../../user-guide/meetings/dynamic-meetings/). + +### Manual page breaks in PDF work package exports + +With our work package export feature, people can generate good-looking PDFs. Sometimes, however, the page break comes at an inconvenient place. With version 15.1, users can now force a manual page break in the work package description. This ensures, for example, that a signature can always be inserted on the correct page. + +![Example of a work package description with an employee contract and inserted page breaks](openproject-15-1-page-break-contract-highlighted.png) + +[Learn how to export work packages and what options you have](../../user-guide/work-packages/exporting/). + +### Zen mode for project lists + +Zen mode allows users to focus on a certain page, as all other menu items and elements are hidden, and the page is displayed in full screen. OpenProject already offers zen mode for other modules like Work packages, Boards, Gantt charts or Calendar – and with version 15.1 also for project lists. + +Here is how zen mode for project lists looks like: + +![Example screenshot of a project list in zen mode](openproject-15-1-zen-mode-highlighted.png) + +[Read all about OpenProject's project lists in our user guide](../../user-guide/projects/project-lists/). + +## Important technical updates + +### Possibility to lock seeded admin users, e.g. when using LDAP + +Administrators of automated deployments can now choose to skip the automatically integrated creation of an admin user. This is useful if you have set up an LDAP or SSO integration – such as those used for openDesk environments – and you want to prevent the admin user from logging in. Administrators no longer have to manually disable this automatically created admin user and thus run the risk of forgetting to do so, which would pose a security risk. + +Read more about [seeding through environment for OpenProject configuration in our Installation & operations guide](../../installation-and-operations/configuration/#seeding-through-environment) @@ -68,12 +121,14 @@ At the end, you will find a complete list of all changes and bug fixes. ## Contributions -A very special thank you goes to our sponsors for this release. -Also a big thanks to our Community members for reporting bugs and helping us identify and provide fixes. -Special thanks for reporting and finding bugs go to Frank Long, Claudio Pagnani, Ivan Kuchin, samuel law, Gerrit B.. -Last but not least, we are very grateful for our very engaged translation contributors on Crowdin, who translated quite a few OpenProject strings! -Would you like to help out with translations yourself? -Then take a look at our translation guide and find out exactly how you can contribute. -It is very much appreciated! +A very special thank you goes to our sponsors of this release: Deutsche Bahn for sponsoring custom fields of type hierarchy, and City of Cologne for sponsoring custom fields of type hierarchy as well as zen mode for project lists. + +Also, a big thanks to our Community members for reporting bugs and helping us identify and provide fixes. Special thanks for reporting and finding bugs go to Bill Bai, Sam Yelman, Knight Chang, Gábor Alexovics, Gregor Buergisser, Andrey Dermeyko, Various Interactive, Clayton Belcher, Александр Татаринцев, and Keno Krewer. + +Last but not least, we are very grateful for our very engaged translation contributors on Crowdin, who translated quite a few OpenProject strings! This release we would like to highlight +- [José Helbert Pina](https://crowdin.com/profile/GZTranslations), for a great number of translations into Portuguese. +- [Alexander Aleschenko](https://crowdin.com/profile/top4ek), for a great number of translations into Russian. +- [Adam Siemienski](https://crowdin.com/profile/siemienas), for a great number of translations into Polish. +Would you like to help out with translations yourself? Then take a look at our [translation guide](../../contributions-guide/translate-openproject/) and find out exactly how you can contribute. It is very much appreciated! diff --git a/docs/release-notes/15-1-0/openproject-15-1-custom-field-hierarchy.jpg b/docs/release-notes/15-1-0/openproject-15-1-custom-field-hierarchy.jpg new file mode 100644 index 000000000000..d664b23c5305 Binary files /dev/null and b/docs/release-notes/15-1-0/openproject-15-1-custom-field-hierarchy.jpg differ diff --git a/docs/release-notes/15-1-0/openproject-15-1-meetings.png b/docs/release-notes/15-1-0/openproject-15-1-meetings.png new file mode 100644 index 000000000000..2cfd649e6133 Binary files /dev/null and b/docs/release-notes/15-1-0/openproject-15-1-meetings.png differ diff --git a/docs/release-notes/15-1-0/openproject-15-1-page-break-contract-highlighted.png b/docs/release-notes/15-1-0/openproject-15-1-page-break-contract-highlighted.png new file mode 100644 index 000000000000..0217b2eb9cd6 Binary files /dev/null and b/docs/release-notes/15-1-0/openproject-15-1-page-break-contract-highlighted.png differ diff --git a/docs/release-notes/15-1-0/openproject-15-1-relations.png b/docs/release-notes/15-1-0/openproject-15-1-relations.png new file mode 100644 index 000000000000..405e60dbfa8b Binary files /dev/null and b/docs/release-notes/15-1-0/openproject-15-1-relations.png differ diff --git a/docs/release-notes/15-1-0/openproject-15-1-zen-mode-highlighted.png b/docs/release-notes/15-1-0/openproject-15-1-zen-mode-highlighted.png new file mode 100644 index 000000000000..ea7495f3ad77 Binary files /dev/null and b/docs/release-notes/15-1-0/openproject-15-1-zen-mode-highlighted.png differ diff --git a/docs/use-cases/safe-framework/README.md b/docs/use-cases/safe-framework/README.md index 77a0e48afe16..16e782daea29 100644 --- a/docs/use-cases/safe-framework/README.md +++ b/docs/use-cases/safe-framework/README.md @@ -77,11 +77,11 @@ You can also use [project templates](../../user-guide/projects/project-templates Project portfolios allow you to view, organize, sort and filter through all projects and their hierarchies. Since individual projects represent Agile Release trains, project portfolios can be used to access information at a **Solution train**-level. -OpenProject offers a new **Project list** view that lets you create and save custom lists of Projects using your own set of filter criteria. These lists can also display custom project attributes. Individual projects can also be favourited for easier access. Project lists allow you to be build very precise and useful dashboards at a solution-train level. +OpenProject offers a new **Project list** view that lets you create and save custom lists of Projects using your own set of filter criteria. These lists can also display custom project attributes. Individual projects can also be favored for easier access. Project lists allow you to be build very precise and useful dashboards at a solution-train level. ![You can create custom project lists](project_list_-_solution_train.png) -Alternatively, one can also create a meta-project that contains multiple sub-projects (representing ARTs and teams) and create a consolidated custom view. This **work package table** view can be filtered and customised to show particular attributes and custom fields as columns, grouped and sorted. They can also be configured to display epics, features and user stories not just from sub-projects, but from entirely different projects. +Alternatively, one can also create a meta-project that contains multiple sub-projects (representing ARTs and teams) and create a consolidated custom view. This **work package table** view can be filtered and customized to show particular attributes and custom fields as columns, grouped and sorted. They can also be configured to display epics, features and user stories not just from sub-projects, but from entirely different projects. ![All Features and User Stories across all teams](all_features_across_all_teams.png) diff --git a/docs/user-guide/meetings/classic-meetings/README.md b/docs/user-guide/meetings/classic-meetings/README.md index 3ffe529a6464..0833ae45a82d 100644 --- a/docs/user-guide/meetings/classic-meetings/README.md +++ b/docs/user-guide/meetings/classic-meetings/README.md @@ -13,7 +13,8 @@ Meetings in OpenProject allow you to manage and document your project meetings,
**Meetings** is defined as a module that allows the organization of meetings. The module has to be activated in the project settings in order to be displayed in the side navigation.
-> *Note:* [Dynamic meetings](../dynamic-meetings) were introduced in OpenProject 13.1. At the moment, the Meetings module lets you create classic or dynamic meetings but please keep in mind that the ability to create classic meetings will eventually be removed from OpenProject. +> [!NOTE] +> [Dynamic meetings](../dynamic-meetings) were introduced in OpenProject 13.1. At the moment, the Meetings module lets you create classic or dynamic meetings but please keep in mind that the ability to create classic meetings will eventually be removed from OpenProject. | Topic | Content | |---------------------------------------------------------------------------|---------------------------------------------| @@ -30,20 +31,26 @@ Meetings in OpenProject allow you to manage and document your project meetings, By selecting **Meetings** in the project menu on the left, you get an overview of all project meetings sorted by date. By clicking on a meeting name you can view further details of the meeting. -**Note:** In order to be able to use the meetings plugin, the **Meetings module needs to be activated** in the [Project Settings](../../projects/project-settings/modules/). +> [!NOTE] +> In order to be able to use the meetings plugin, the **Meetings module needs to be activated** in the [Project Settings](../../projects/project-settings/modules/). ![Meetings module in OpenProject](meetings.png) ## Create a new meeting -1. To create a new meeting, click the green **+ Meeting** button in the upper right corner. -2. Enter your meeting title. -3. Choose 'Classic meeting'. -3. Enter meeting information, such as location, start date and duration. -5. Select the meeting participants from the project members list. -6. Click the **Create** button to save your changes. +To create a new classic meeting, click the green **+ Meeting** button in the upper right corner and choose the respective option. -![create-new-meeting](create-new-classic-meeting.png) +![Button to create a new classic meeting in OpenProject](openproject_user_guide_create_classic_meeting_button.png) + +You can then specify the following: + +1. Enter your meeting title. +2. Enter meeting information, such as location, start date and duration. +3. Select the meeting participants from the project members list. +4. Choose if you want to invite meeting participants via email after the meeting has been created (this option is disabled by default). +5. Click the **Create** button to save your changes. + +![Create a new classic meeting in OpenProject](openproject_user_guide_create_classic_meeting_form.png) ## Edit a meeting @@ -61,7 +68,7 @@ You can **add participants** (Invitees and Attendees) to a meeting while being i You can see the list of all the project members under **Participants**. This list varies from project to project. If you select the field in the columns Invitees or Attendees, the selected project members will be notified automatically when an agenda or a meeting protocol is created. -![participants](meeting-participants.png) +![Edit meeting participants in OpenProject classic meetings](openproject_user_guide_create_classic_meeting_edit_participants.png) By removing the check mark you can remove project members from the meetings. @@ -105,11 +112,14 @@ To add a meeting to a calendar, select the dropdown menu behind the three dots a If you have recurring meetings, such as a Jour Fixe, and want to simplify the process of creating meetings and agendas, you can **copy an existing meeting**. To do that select the meeting, open the dropdown menu behind the three dots and select **Copy**. -![copy-meeting](copy-meeting.png) +![Button to copy a classic meeting in OpenProject](copy-meeting.png) + +You can now edit the copied meeting details, specify if you want to copy the agenda or attachments and fine tune the participants list. Click the **Create** button to secure your changes. -You can now edit the copied meeting and add the new details. Click the **Save** button to secure your changes. +> [!NOTE] +> All the settings will be copied, except for the minutes and meeting history. So if you want to keep the minutes as well, you have to copy them separately. -> **Note**: all the settings will be copied, except for the minutes, participants and meeting history. So if you want to keep the minutes as well, you have to copy it separately. +![Edit a copied classic meeting in OpenProject](openproject_user_guide_create_classic_meeting_copy_form.png) ## Delete a meeting diff --git a/docs/user-guide/meetings/classic-meetings/openproject_user_guide_create_classic_meeting_button.png b/docs/user-guide/meetings/classic-meetings/openproject_user_guide_create_classic_meeting_button.png new file mode 100644 index 000000000000..0bc3913a850a Binary files /dev/null and b/docs/user-guide/meetings/classic-meetings/openproject_user_guide_create_classic_meeting_button.png differ diff --git a/docs/user-guide/meetings/classic-meetings/openproject_user_guide_create_classic_meeting_copy_form.png b/docs/user-guide/meetings/classic-meetings/openproject_user_guide_create_classic_meeting_copy_form.png new file mode 100644 index 000000000000..1c08ea42b16f Binary files /dev/null and b/docs/user-guide/meetings/classic-meetings/openproject_user_guide_create_classic_meeting_copy_form.png differ diff --git a/docs/user-guide/meetings/classic-meetings/openproject_user_guide_create_classic_meeting_edit_participants.png b/docs/user-guide/meetings/classic-meetings/openproject_user_guide_create_classic_meeting_edit_participants.png new file mode 100644 index 000000000000..e49c50c279c4 Binary files /dev/null and b/docs/user-guide/meetings/classic-meetings/openproject_user_guide_create_classic_meeting_edit_participants.png differ diff --git a/docs/user-guide/meetings/classic-meetings/openproject_user_guide_create_classic_meeting_form.png b/docs/user-guide/meetings/classic-meetings/openproject_user_guide_create_classic_meeting_form.png new file mode 100644 index 000000000000..eb13bbecb36f Binary files /dev/null and b/docs/user-guide/meetings/classic-meetings/openproject_user_guide_create_classic_meeting_form.png differ diff --git a/docs/user-guide/meetings/dynamic-meetings/README.md b/docs/user-guide/meetings/dynamic-meetings/README.md index b0b726342501..df28a925bb1f 100644 --- a/docs/user-guide/meetings/dynamic-meetings/README.md +++ b/docs/user-guide/meetings/dynamic-meetings/README.md @@ -41,9 +41,21 @@ The menu on the left will allow you to filter for upcoming or past meetings. You ![Meetings overview in openproject global modules](openproject_userguide_dynamic_meetings_overview.png) +You can also use the meetings filters to refine the list of meetings based on the following criteria: + +- **Attended user** - shows meetings that a specific user attended +- **Author** - shows meetings that a specific user created +- **Invited user** - shows meetings that a specific user was invited to +- **Project** - shows meetings for a specific project (this will only be displayed in the global module view, i.e. not within a specific project) +- **Time** - shows past or upcoming meetings + +![Filter the list of dynamic meetings in OpenProject](openproject_dynamic_meetings_filters.png) + > [!TIP] > If you are interested in how the Meetings module is used by the OpenProject team, please take a look at [this blog article](https://www.openproject.org/blog/meeting-management-example/). + + ## Create and edit dynamic meetings ### Create a new meeting @@ -54,27 +66,29 @@ You can either create a meeting from within a project or from the global **Meeti > [!NOTE] > Dynamic meetings were introduced in OpenProject 13.1. At the moment, the Meetings module lets you create [classic](../classic-meetings) or dynamic meetings but please keep in mind that the ability to create [classic meetings](../classic-meetings) will eventually be removed from OpenProject. -To create a new meeting, click the green **+ Meeting** button in the upper right corner. +To create a new meeting, click the green **+ Meeting** button in the upper right corner and select if you want to create a dynamic or a classic meeting. -![Create new meeting in OpenProject](openproject_userguide_create_new_meeting.png) +![Create new meeting in OpenProject](openproject_dynamic_meetings_create_button.png) -Enter your meeting's title, type, location, start date and duration. You can also choose if you want to invite meeting participants via email after the meeting has been created (this option is disabled by default). +Enter your meeting's title, type, location, start date and duration. If you are creating a meeting from a global module you will first need to select a project to which the meeting is attributed. After you have selected a project, the list of potential participants (project members) will appear for you to select who to invite. After the meeting you can note who attended the meeting. -Click the blue **Create** button to save your changes. +![Create a new dynamic meeting in OpenProject](openproject_dynamic_meetings_new_dynamic_meeting_form.png) + +Click the **Create meeting** button to save your changes. You can proceed to adding more meeting details. ### Edit a meeting If you want to change the details of a meeting, for example its time or location, open the meetings details view by clicking on pencil icon next to the **Meeting details**. -![edit-meeting](openproject_userguide_edit_dynamic_meeting.png) +![Edit a dynamic meeting in OpenProject](openproject_userguide_edit_dynamic_meeting_icon.png) An edit screen will be displayed, where you can adjust the date, time, duration and location of the meeting. ![edit-meeting](openproject_userguide_edit_screen.png) -Do not forget to save the changes by clicking the green **Save** button. Cancel will bring you back to the details view. +Do not forget to save the changes by clicking the **Save** button. Cancel will bring you back to the details view. > [!TIP] > If someone else edits or updates the current meeting page at the same time and saves their changes, you and all other users on the same page will be notified of this with a small banner at the top of the page. Click the **Reload** button to load the updated version of the page. @@ -233,9 +247,11 @@ You can copy an existing meeting. This is useful if you have recurring meetings. ![Copy a dynamic meeting in OpenProject](openproject_dynamic_meetings_copy_meeting.png) -A screen will open, which will allow you adjust the name, time, location and further details of the copied meeting. By default, the date for the copied meeting will be moved forward by one week from the original meeting's date. You also have an option of copying the agenda and attachments. If you copy a closed meeting, the new meeting status will automatically be set to open. Don't forget to **Save** the copied meeting by clicking the green **Create** button. +A modal will open, which will allow you adjust the title, time, location and further details of the copied meeting. By default, the date for the copied meeting will be set to the next day. You also have an option of copying the agenda, attachments and the list of participants. You also have an option to email all participants after the meeting was copied. + +If you copy a closed meeting, the new meeting status will automatically be set to open. Don't forget to **Save** the copied meeting by clicking the **Create** button. -![Edit details of a copied dynamic meeting in OpenProject](openproject_dynamic_meetings_copy_meeting_details.png) +![Edit details of a copied dynamic meeting in OpenProject](openproject_dynamic_meetings_copy_modal.png) ## Delete a meeting diff --git a/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_copy_modal.png b/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_copy_modal.png new file mode 100644 index 000000000000..ad07d9f57559 Binary files /dev/null and b/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_copy_modal.png differ diff --git a/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_create_button.png b/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_create_button.png new file mode 100644 index 000000000000..645eb69aec20 Binary files /dev/null and b/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_create_button.png differ diff --git a/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_filters.png b/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_filters.png new file mode 100644 index 000000000000..1f37c1bd8353 Binary files /dev/null and b/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_filters.png differ diff --git a/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_new_dynamic_meeting_form.png b/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_new_dynamic_meeting_form.png new file mode 100644 index 000000000000..60d66b9f82c7 Binary files /dev/null and b/docs/user-guide/meetings/dynamic-meetings/openproject_dynamic_meetings_new_dynamic_meeting_form.png differ diff --git a/docs/user-guide/meetings/dynamic-meetings/openproject_userguide_dynamic_meetings_overview.png b/docs/user-guide/meetings/dynamic-meetings/openproject_userguide_dynamic_meetings_overview.png index c054c14cfd84..4edce8daeaa8 100644 Binary files a/docs/user-guide/meetings/dynamic-meetings/openproject_userguide_dynamic_meetings_overview.png and b/docs/user-guide/meetings/dynamic-meetings/openproject_userguide_dynamic_meetings_overview.png differ diff --git a/docs/user-guide/meetings/dynamic-meetings/openproject_userguide_edit_dynamic_meeting_icon.png b/docs/user-guide/meetings/dynamic-meetings/openproject_userguide_edit_dynamic_meeting_icon.png new file mode 100644 index 000000000000..bae899e4f374 Binary files /dev/null and b/docs/user-guide/meetings/dynamic-meetings/openproject_userguide_edit_dynamic_meeting_icon.png differ diff --git a/docs/user-guide/meetings/dynamic-meetings/openproject_userguide_meetings_module_select.png b/docs/user-guide/meetings/dynamic-meetings/openproject_userguide_meetings_module_select.png index a21f271a0dc9..f770c8aac135 100644 Binary files a/docs/user-guide/meetings/dynamic-meetings/openproject_userguide_meetings_module_select.png and b/docs/user-guide/meetings/dynamic-meetings/openproject_userguide_meetings_module_select.png differ diff --git a/modules/costs/config/locales/crowdin/hu.yml b/modules/costs/config/locales/crowdin/hu.yml index 1a965580fe97..299922c91202 100644 --- a/modules/costs/config/locales/crowdin/hu.yml +++ b/modules/costs/config/locales/crowdin/hu.yml @@ -109,7 +109,7 @@ hu: label_rate: "Díj" label_rate_plural: "Díjak" label_status_finished: "Kész" - label_show: "Show" + label_show: "Mutat" label_units: "Költség egységek" label_user: "Felhasználó" label_until: "-ig" @@ -133,10 +133,10 @@ hu: permission_view_own_hourly_rate: "Saját óradíj megtekintése" permission_view_own_time_entries: "Az eltöltött idő megtekintése" project_module_costs: "Idő és költség" - setting_allow_tracking_start_and_end_times: "Allow users to track start and end time on time records" - setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" - setting_enforce_tracking_start_and_end_times: "Force users to set start and end time on time records" + setting_allow_tracking_start_and_end_times: "Lehetővé teszi a felhasználók számára, hogy nyomon kövessék az időrekordok kezdő és befejező időpontját" + setting_costs_currency: "Pénznem" + setting_costs_currency_format: "Pénznem formátuma" + setting_enforce_tracking_start_and_end_times: "A felhasználókat a kezdő és befejező időpont beállítására kényszeríti az időrekordoknál" text_assign_time_and_cost_entries_to_project: "Idők és költségek projekthez rendelése" text_destroy_cost_entries_question: "A work package-hez rögzített %{cost_entries} törlése. Mit szeretnél tenni?" text_destroy_time_and_cost_entries: "Idők és költségek törlése" diff --git a/modules/recaptcha/config/locales/crowdin/hu.yml b/modules/recaptcha/config/locales/crowdin/hu.yml index 7a5131ef39d8..0dd9e21a7e41 100644 --- a/modules/recaptcha/config/locales/crowdin/hu.yml +++ b/modules/recaptcha/config/locales/crowdin/hu.yml @@ -9,7 +9,7 @@ hu: verify_account: "Fiók ellenőrzése..." error_captcha: "Fiókját nem lehetett ellenőrizni. Vegye fel a kapcsolatot egy rendszergazdával." settings: - website_key: 'Website key (May also be called "Site key")' + website_key: 'Weboldal-kulcs (más néven "Site key")' response_limit: 'HCaptcha válaszadási limit' response_limit_text: 'A karakterek maximális száma a HCaptcha-válasz érvényesként való kezeléséhez.' website_key_text: 'Írja be az e domain reCAPTCHA adminisztrációs konzolján létrehozott webhelykulcsot.' @@ -22,4 +22,4 @@ hu: type_hcaptcha: 'HChaptcha' type_turnstile: 'Cloudflare Turnstile™' captcha_description_html: > - reCAPTCHA is a free service by Google that can be enabled for your OpenProject instance. If enabled, a captcha form will be rendered upon login for all users that have not verified a captcha yet.
Please see the following link for more details on reCAPTCHA and their versions, and how to create the website and secret keys: %{recaptcha_link}
HCaptcha is a Google-free alternative that you can use if you do not want to use reCAPTCHA. See this link for more information: %{hcaptcha_link}
Cloudflare Turnstile™ is another alternative that is more convenient for users while still providing the same level of security. See this link for more information: %{turnstile_link} + A reCAPTCHA a Google ingyenes szolgáltatása, amely engedélyezhető az Ön OpenProject példányában. Ha engedélyezett, a bejelentkezéskor egy captcha űrlap jelenik meg minden olyan felhasználó számára, aki még nem erősítette meg a captchát.
A reCAPTCHA-ról és annak változatairól, valamint a weboldal és a titkos kulcsok létrehozásának módjáról az alábbi linken talál további részleteket: %{recaptcha_link}
A HCaptcha egy Google-mentes alternatíva, amelyet használhat, ha nem szeretné a reCAPTCHA-t használni. További információkért lásd ezt a linket: %{hcaptcha_link}
A Cloudflare Turnstile™ egy másik alternatíva, amely kényelmesebb a felhasználók számára, miközben ugyanolyan szintű biztonságot nyújt. További információért lásd ezt a linket: %{turnstile_link} diff --git a/modules/reporting/config/locales/crowdin/hu.yml b/modules/reporting/config/locales/crowdin/hu.yml index a605734bec5d..f07d543052be 100644 --- a/modules/reporting/config/locales/crowdin/hu.yml +++ b/modules/reporting/config/locales/crowdin/hu.yml @@ -23,7 +23,7 @@ hu: plugin_openproject_reporting: name: "OpenProject Reporting" description: "This plugin allows creating custom cost reports with filtering and grouping created by the OpenProject Time and costs plugin." - button_save_report_as: "Save report as..." + button_save_report_as: "Jelentés mentése más néven..." comments: "Megjegyzés" cost_reports_title: "Idő és költség" label_cost_report: "Költség jelentés" diff --git a/spec/features/custom_fields/hierarchy_custom_field_spec.rb b/spec/features/custom_fields/hierarchy_custom_field_spec.rb index 68542e168e23..37344c95716f 100644 --- a/spec/features/custom_fields/hierarchy_custom_field_spec.rb +++ b/spec/features/custom_fields/hierarchy_custom_field_spec.rb @@ -40,8 +40,7 @@ allow(EnterpriseToken).to receive(:allows_to?).and_return(true) end - it "lets you create, update and delete a custom field of type hierarchy", - with_flag: { custom_field_of_type_hierarchy: true } do + it "lets you create, update and delete a custom field of type hierarchy" do login_as admin # region CustomField creation diff --git a/spec/features/work_packages/details/relations/primerized_relations_spec.rb b/spec/features/work_packages/details/relations/primerized_relations_spec.rb index bd7cb8c42a4c..ea86ee42cb9a 100644 --- a/spec/features/work_packages/details/relations/primerized_relations_spec.rb +++ b/spec/features/work_packages/details/relations/primerized_relations_spec.rb @@ -106,6 +106,9 @@ def label_for_relation_type(relation_type) describe "rendering" do it "renders the relations tab" do scroll_to_element relations_panel + + wait_for_network_idle + expect(page).to have_css(relations_panel_selector) tabs.expect_counter("relations", 4) @@ -120,6 +123,8 @@ def label_for_relation_type(relation_type) it "can delete relations" do scroll_to_element relations_panel + wait_for_network_idle + relations_tab.remove_relation(relation_follows) expect { relation_follows.reload }.to raise_error(ActiveRecord::RecordNotFound) @@ -130,6 +135,8 @@ def label_for_relation_type(relation_type) it "can delete children" do scroll_to_element relations_panel + wait_for_network_idle + relations_tab.remove_child(child_wp) expect(child_wp.reload.parent).to be_nil @@ -141,6 +148,8 @@ def label_for_relation_type(relation_type) it "renders an edit form" do scroll_to_element relations_panel + wait_for_network_idle + relation_row = relations_tab.expect_relation(relation_follows) relations_tab.add_description_to_relation(relation_follows, "Discovered relations have descriptions!") @@ -164,6 +173,8 @@ def label_for_relation_type(relation_type) it "does not have an edit action for children" do scroll_to_element relations_panel + wait_for_network_idle + child_row = relations_panel.find("[data-test-selector='op-relation-row-#{child_wp.id}']") within(child_row) do @@ -182,10 +193,18 @@ def label_for_relation_type(relation_type) relation_type: Relation::TYPE_FOLLOWS) end + before do + another_wp + relation_to + end + it "shows the correct related WorkPackage in the dialog (regression #59771)" do scroll_to_element relations_panel - relations_tab.open_relation_dialog(relation_to) + wait_for_network_idle + + relations_tab.expect_relation(another_wp) + relations_tab.open_relation_dialog(another_wp) within "##{WorkPackageRelationsTab::WorkPackageRelationDialogComponent::DIALOG_ID}" do expect(page).to have_field("Work package", @@ -202,6 +221,8 @@ def label_for_relation_type(relation_type) it "renders the new relation form for the selected type and creates the relation" do scroll_to_element relations_panel + wait_for_network_idle + relations_tab.add_relation(type: :precedes, relatable: wp_successor, description: "Discovered relations have descriptions!") relations_tab.expect_relation(wp_successor) @@ -238,6 +259,8 @@ def label_for_relation_type(relation_type) it "renders the new child form and creates the child relationship" do scroll_to_element relations_panel + wait_for_network_idle + tabs.expect_counter("relations", 4) relations_tab.add_existing_child(not_yet_child_wp) @@ -296,6 +319,8 @@ def label_for_relation_type(relation_type) it "does not show options to add or edit relations" do scroll_to_element relations_panel + wait_for_network_idle + tabs.expect_counter("relations", 4) relations_tab.expect_no_add_relation_button @@ -311,6 +336,8 @@ def label_for_relation_type(relation_type) it "does not show the option to delete the child" do scroll_to_element relations_panel + wait_for_network_idle + tabs.expect_counter("relations", 4) # The menu is shown as the user can add a relation @@ -332,6 +359,8 @@ def label_for_relation_type(relation_type) it "does not show the option to edit the relation but only the child" do scroll_to_element relations_panel + wait_for_network_idle + tabs.expect_counter("relations", 4) # The menu is shown as the user can add a child diff --git a/spec/support/components/work_packages/relations.rb b/spec/support/components/work_packages/relations.rb index 246412fb1520..79ee9f1274ac 100644 --- a/spec/support/components/work_packages/relations.rb +++ b/spec/support/components/work_packages/relations.rb @@ -64,11 +64,11 @@ def expect_no_add_relation_button def find_row(relatable) actual_relatable = find_relatable(relatable) - page.find_test_selector("op-relation-row-#{actual_relatable.id}") + page.find_test_selector("op-relation-row-#{actual_relatable.id}", wait: 5) end def find_some_row(text:) - page.find("[data-test-selector^='op-relation-row']", text:) + page.find("[data-test-selector^='op-relation-row']", text:, wait: 5) end def expect_row(work_package)