diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb index 820b4b5ee3d7..237cea344003 100644 --- a/app/controllers/account_controller.rb +++ b/app/controllers/account_controller.rb @@ -40,6 +40,7 @@ class AccountController < ApplicationController before_action :apply_csp_appends, only: %i[login] before_action :disable_api before_action :check_auth_source_sso_failure, only: :auth_source_sso_failed + before_action :check_internal_login_enabled, only: :internal_login layout 'no_menu' @@ -49,13 +50,17 @@ def login if user.logged? redirect_after_login(user) - elsif omniauth_direct_login? + elsif request.get? && omniauth_direct_login? direct_login(user) elsif request.post? authenticate_user end end + def internal_login + render 'account/login' + end + # Log out current user and redirect to welcome page def logout # Keep attributes from the session @@ -527,4 +532,8 @@ def apply_csp_appends append_content_security_policy_directives(appends) end + + def check_internal_login_enabled + render_404 unless omniauth_direct_login? + end end diff --git a/app/controllers/projects/templated_controller.rb b/app/controllers/projects/templated_controller.rb index 8d1ccdc6d7a8..514533f69268 100644 --- a/app/controllers/projects/templated_controller.rb +++ b/app/controllers/projects/templated_controller.rb @@ -48,10 +48,15 @@ def change_templated_action(templated) if service_call.success? flash[:notice] = t(:notice_successful_update) - redirect_to project_settings_general_path(@project) else - @errors = service_call.errors - render template: 'projects/settings/general' + messages = [ + t('activerecord.errors.template.header', model: Project.model_name.human, count: service_call.errors.count), + service_call.message + ] + + flash[:error] = messages.join(". ") end + + redirect_to project_settings_general_path(@project) end end diff --git a/app/helpers/meta_tags_helper.rb b/app/helpers/meta_tags_helper.rb index 975996418163..bdd13090653d 100644 --- a/app/helpers/meta_tags_helper.rb +++ b/app/helpers/meta_tags_helper.rb @@ -45,8 +45,9 @@ def initializer_meta_tag firstWeekOfYear: locale_first_week_of_year, firstDayOfWeek: locale_first_day_of_week, environment: Rails.env, - edition: OpenProject::Configuration.edition - } + edition: OpenProject::Configuration.edition, + 'asset-host': OpenProject::Configuration.rails_asset_host.presence + }.compact end ## diff --git a/app/views/announcement_mailer/announce.html.erb b/app/views/announcement_mailer/announce.html.erb index 6f5d9c32d034..20c8be32dddd 100644 --- a/app/views/announcement_mailer/announce.html.erb +++ b/app/views/announcement_mailer/announce.html.erb @@ -39,5 +39,11 @@ <% end %> +
%{set_protocol}
, but the request is an %{actual_protocol}
request. This will result in errors! You will need to set the following configuration value: %{setting_value}
. Please see the installation documentation on how to set this configuration.
hostname_mismatch:
- title: 'Hostname setting mismatch'
+ title: 'Ketidakcocokan pengaturan nama host'
text_html: >
- Your application is running with its host name setting set to %{set_hostname}
, but the request is a %{actual_hostname}
hostname. This will result in errors! Go to System settings and change the "Host name" setting to correct this.
+ Aplikasi Anda berjalan dengan pengaturan nama hostnya disetel ke %{set_hostname}
, tetapi permintaannya adalah nama host %{actual_hostname}
. Ini akan menghasilkan kesalahan! Buka Setelan sistem dan ubah setelan "Nama host" untuk memperbaikinya.
menu_item: "Menu item"
menu_item_setting: "Visibilitas"
wiki_menu_item_for: "Menu untuk Halaman Wiki \"%{title}\""
@@ -2964,36 +2962,36 @@ id:
Define days considered part of the work week%{set_protocol}
, but the request is an %{actual_protocol}
request. This will result in errors! You will need to set the following configuration value: %{setting_value}
. Please see the installation documentation on how to set this configuration.
+ Jūsų aplikacija veikia su HTTPS režimo nustatymu %{set_protocol}
, bet užklausa yra %{actual_protocol}
. Dėl to kils klaidų! Jums reikia nustatyti šią konfigūracijos reikšmę: %{setting_value}
. Daugiau informacijos apie šios konfigūracijos keitimą rasite diegimo dokumentacijoje.
hostname_mismatch:
title: 'Neatitinka serverio vardo nustatymai'
text_html: >
@@ -3026,25 +3025,25 @@ lt:
title: "Ištrinti darbų paketą"
working_days:
info: >
- Define days considered part of the work weekand @ did not prevent code execution in the work package description. - - The “Spent time” link on the work package list caused an error + - The “Spent time” link on the work package table caused an error 404 in subfolder installations ([#24427](https://community.openproject.com/projects/openproject/work_packages/24427/activity)). - Line breaks were not displayed in the work package description @@ -69,4 +69,3 @@ or take a look at You can try OpenProject for free. For a free 30 day trial create your OpenProject instance on [OpenProject.org](https://openproject.org/). - diff --git a/docs/release-notes/7/7-0-0/README.md b/docs/release-notes/7/7-0-0/README.md index cac87816ccff..1e9000ad6d59 100644 --- a/docs/release-notes/7/7-0-0/README.md +++ b/docs/release-notes/7/7-0-0/README.md @@ -11,22 +11,21 @@ OpenProject 7.0 is the biggest OpenProject release yet with amazing new features: A new interactive timeline, hierarchies in the work package -list, multi-select custom fields and much more. +table, multi-select custom fields and much more. ## New integrated Gantt chart / timeline OpenProject 7.0 introduces a new Gantt chart which is integrated in the -work package list -([#13785](https://community.openproject.com/projects/openproject/work_packages/13785/activity)). +work package table ([#13785](https://community.openproject.com/projects/openproject/work_packages/13785/activity)). The new timeline is much more interactive and user-friendly than the old timeline. -## Display hierarchies in work package list +## Display hierarchies in work package table -You can display hierarchies on the work package list and collapse and +You can display hierarchies on the work package table and collapse and expand them ([#24647](https://community.openproject.com/projects/openproject/work_packages/24647/activity)). @@ -43,9 +42,9 @@ hidden by default. -## Filter based on date in work package list +## Filter based on date in work package table -The work package list now supports filtering based on fixed dates. This +The work package table now supports filtering based on fixed dates. This affects all date attributes (e.g. start / due date, created on / updated on) ([#22585](https://community.openproject.com/projects/telekom/work_packages/22585/activity)). @@ -71,7 +70,7 @@ project settings ## Zen-mode on work package page -With the zen mode on the work package list, you can maximize the +With the zen mode on the work package table, you can maximize the available screen real estate by hiding the side and top navigation ([#18216](https://community.openproject.com/projects/openproject/work_packages/18216/activity)). @@ -104,8 +103,7 @@ Additionally, you can change the colors by using a custom color scheme ## Performance improvements -The performance – especially for the work package list – has been -improved. Loading and displaying work packages is faster. +The performance – especially for the work package table – has been improved. Loading and displaying work packages is faster. ## Improved design @@ -119,4 +117,3 @@ OpenProject 7.0 contains a large number of bugs fixes. For an extensive overview of bug fixes please refer to the [following list](https://community.openproject.com/projects/openproject/work_packages?query_props=%7B%22c%22:%5B%22id%22,%22subject%22,%22type%22,%22status%22,%22assignee%22%5D,%22p%22:%22openproject%22,%22t%22:%22parent:desc%22,%22f%22:%5B%7B%22n%22:%22version%22,%22o%22:%22%253D%22,%22t%22:%22list_optional%22,%22v%22:%22750%22%7D,%7B%22n%22:%22type%22,%22o%22:%22%253D%22,%22t%22:%22list_model%22,%22v%22:%221%22%7D,%7B%22n%22:%22subprojectId%22,%22o%22:%22*%22,%22t%22:%22list_subprojects%22,%22v%22:%5B%5D%7D%5D,%22pa%22:1,%22pp%22:20%7D). - diff --git a/docs/release-notes/7/7-2-0/README.md b/docs/release-notes/7/7-2-0/README.md index d037906f46b0..e751ae86ade5 100644 --- a/docs/release-notes/7/7-2-0/README.md +++ b/docs/release-notes/7/7-2-0/README.md @@ -26,7 +26,7 @@ is shown in the Gantt chart and start and due date is visible on hover. ### Full-width Gantt chart / timeline -By removing columns from the work package list the width of the Gantt +By removing columns from the work package table the width of the Gantt chart can be increased. By removing all columns, the Gantt chart expands to almost the entire width of the page. @@ -47,10 +47,10 @@ on the activity tab to hide all other activity entries. -### Relations in the work package list (Enterprise add-on) +### Relations in the work package table (Enterprise add-on) With OpenProject 7.2 you can show relation columns in the work package -list. A label shows how many related elements a work package has. By +table. A label shows how many related elements a work package has. By clicking on the label, the related work packages are shown. @@ -78,4 +78,3 @@ OpenProject 7.2 contains a large number of bugs fixes. For an extensive overview of bug fixes please refer to the [following list](https://community.openproject.com/projects/openproject/work_packages?query_props=%7B%22c%22:%5B%22id%22,%22subject%22,%22type%22,%22status%22,%22assignee%22%5D,%22tzl%22:%22days%22,%22hi%22:true,%22t%22:%22parent:desc%22,%22f%22:%5B%7B%22n%22:%22version%22,%22o%22:%22%253D%22,%22v%22:%5B%22824%22%5D%7D,%7B%22n%22:%22type%22,%22o%22:%22%253D%22,%22v%22:%5B%221%22%5D%7D,%7B%22n%22:%22subprojectId%22,%22o%22:%22*%22,%22v%22:%5B%5D%7D%5D,%22pa%22:1,%22pp%22:20%7D). - diff --git a/docs/release-notes/7/7-3-0/README.md b/docs/release-notes/7/7-3-0/README.md index 5e99cf35c301..a1e91fd8bc21 100644 --- a/docs/release-notes/7/7-3-0/README.md +++ b/docs/release-notes/7/7-3-0/README.md @@ -75,7 +75,7 @@ OpenProject 7.3 includes several usability improvements. The context menu on the work package page – which you can use to perform bulk updates – was quite hidden. (You need to right-click on the work -package list to open the menu.) Therefore, the work package list now +package table to open the menu.) Therefore, the work package table now contains an additional icon for each row that allows you to open the context menu. diff --git a/docs/release-notes/7/7-3-1/README.md b/docs/release-notes/7/7-3-1/README.md index b9397206d0e3..7bafa3523715 100644 --- a/docs/release-notes/7/7-3-1/README.md +++ b/docs/release-notes/7/7-3-1/README.md @@ -18,7 +18,7 @@ - An internal error occurred when exporting a budget as CSV. \[[#26518](https://community.openproject.com/wp/26518)\] - The selected work package was not focused when navigating from the - work package list to the fullscreen view and back. + work package table to the fullscreen view and back. - Drag and drop for work package custom field values of type “List” did not work. - In MS Edge work package attributes which were shown by themselves in @@ -42,4 +42,3 @@ For further information on the 7.3.1 release, please refer to the or take a look at [GitHub](https://github.com/opf/openproject/tree/v7.3.1). - diff --git a/docs/release-notes/7/7-4-0/README.md b/docs/release-notes/7/7-4-0/README.md index b23c9b1491b9..66b75fc8bdaf 100644 --- a/docs/release-notes/7/7-4-0/README.md +++ b/docs/release-notes/7/7-4-0/README.md @@ -104,7 +104,7 @@ functionality to allow you to work and update your data more smoothly. OpenProject 7.4 includes several usability improvements. -The PDF print layout for the work package list has been improved. When +The PDF print layout for the work package table has been improved. When you print out a work package in fullscreen view (using the browser’s print functionality), the layout is optimized and unnecessary information is hidden. diff --git a/docs/release-notes/7/7-4-7/README.md b/docs/release-notes/7/7-4-7/README.md index 4913a3b536f4..10415730b13a 100644 --- a/docs/release-notes/7/7-4-7/README.md +++ b/docs/release-notes/7/7-4-7/README.md @@ -13,7 +13,7 @@ regarding MessageBird adapter for Two-factor authentication. #### Work packages PDF export with images -Exporting a work package list can now optionally export image +Exporting a work package table can now optionally export image attachments of the work package. Additional options are added to the export modal. @@ -32,4 +32,3 @@ export modal. project autocompleter \[[#28039](https://community.openproject.com/wp/28039)\] - diff --git a/docs/release-notes/8/8-0-0/README.md b/docs/release-notes/8/8-0-0/README.md index 14ba264df774..5ad28462637e 100644 --- a/docs/release-notes/8/8-0-0/README.md +++ b/docs/release-notes/8/8-0-0/README.md @@ -90,7 +90,7 @@ predefined workflows. You save time and avoid errors. -## Conditional formatting for work package list (Enterprise add-on) +## Conditional formatting for work package table (Enterprise add-on) Rows in the work package page page can be highlighted based on the status or priority of the work packages. This makes it very easy to see diff --git a/docs/release-notes/9/9-0-0/README.md b/docs/release-notes/9/9-0-0/README.md index 95ae533d055e..f43cdb23160b 100644 --- a/docs/release-notes/9/9-0-0/README.md +++ b/docs/release-notes/9/9-0-0/README.md @@ -21,7 +21,7 @@ Read below to get a detailed overview of what is new in OpenProject 9. The board view is a new module for OpenProject and allows Scrum and Kanban-style agile project management. You can display display a board view with the different statuses shown as columns (similarly to a Kanban board) and quickly update the status. Alternatively, you can define a basic board with custom names or display versions as columns (e.g. to plan your roadmap). -Since boards display work packages - just like the work packages list - you can easily combine traditional and agile project management. Simply schedule your tasks in the Gantt chart and work on them from the boards view. +Since boards display work packages - just like the work package tables - you can easily combine traditional and agile project management. Simply schedule your tasks in the Gantt chart and work on them from the boards view. To use boards you need to use either the Enterprise cloud or the Enterprise on-premises edition. If you currently use the Community edition and would like to give boards a try, simply [request an Enterprise edition trial license](). @@ -47,7 +47,7 @@ You can filter and group by work package attributes and also display Gantt chart -## Updated work package list +## Updated work package table Assignees are now directly displayed as avatars in the work package page. Additionally, the work package type selection has been updated. @@ -59,7 +59,7 @@ Assignees are now directly displayed as avatars in the work package page. Additi OpenProject is even more user-friendly: You can add attachments (e.g. images) directly to meetings (agenda / minutes). -Creating work packages on the global work package list is now easier as well: When you select a type, only the projects in which the types are activated can be selected in the project menu. +Creating work packages on the global work package table is now easier as well: When you select a type, only the projects in which the types are activated can be selected in the project menu. Filters and work package attributes are improved and support auto-completion. diff --git a/docs/release-notes/README.md b/docs/release-notes/README.md index b15174f13922..cddba3108120 100644 --- a/docs/release-notes/README.md +++ b/docs/release-notes/README.md @@ -14,6 +14,13 @@ Stay up to date and get an overview of the new features included in the releases +## 12.5.8 + +Release date: 2023-07-18 + +[Release Notes](12-5-8/) + + ## 12.5.7 Release date: 2023-06-14 diff --git a/docs/system-admin-guide/authentication/kerberos/README.md b/docs/system-admin-guide/authentication/kerberos/README.md index e86675fe7506..66541be84fdd 100644 --- a/docs/system-admin-guide/authentication/kerberos/README.md +++ b/docs/system-admin-guide/authentication/kerberos/README.md @@ -139,6 +139,73 @@ For non-existing users, if you have an LDAP configured with automatic user regis +# Known issues + + + +## Using the OpenProject REST API + +As Kerberos provides its own Basic Auth challenges if configured as shown above, it will prevent you from using the OpenProject API using an Authorization header such as API key authentication or OAuth2. + +**Note:** A precondition to use this workaround is to run OpenProject under its own path (server prefix) such as `https://YOUR DOMAIN/openproject/`. If you are not using this, you need to first reconfigure the wizard with `openproject reconfigure` to use such a path prefix. Alternatively, you might have success by using a separate domain or subdomain, but this is untested. + + To work around this, you will have to configure a separate route to access the API, bypassing the Kerberos configuration. You can do that by modifying the `/etc/openproject/addons/apache2/custom/vhost/kerberos.conf`as follows: + + + +``` + # Add a Proxy for a separate route + # Replace /openproject/ with your own relative URL root / path prefix + ProxyPass /openproject-api/ http://127.0.0.1:6000/openproject/ retry=0 + ProxyPassReverse /openproject-api/ http://127.0.0.1:6000/openproject/ + + # Require kerberos flow for anything BUT /openproject-api ++ AuthType GSSAPI + # The Basic Auth dialog name shown to the user + # change this freely + AuthName "EXAMPLE.COM realm login" + + # The credential store used by GSSAPI + GssapiCredStore keytab:/etc/apache2/openproject.keytab + + # Allow basic auth negotiation fallback + GssapiBasicAuth On + + # Uncomment this if you want to allow NON-TLS connections for kerberos + # GssapiSSLonly Off + + # Use the local user name without the realm. + # When off: OpenProject gets sent logins like "user1@EXAMPLE.com" + # When on: OpenProject gets sent logins like "user1" + GssapiLocalName On + + # Allow kerberos5 login mechanism + GssapiAllowedMech krb5 + + + # After authentication, Apache will set a header + # "X-Authenticated-User" to the logged in username + # appended with a configurable secret value + RequestHeader set X-Authenticated-User expr=%{REMOTE_USER}:MyPassword + + # Ensure the Authorization header is not passed to OpenProject + # as this will result in trying to perform basic auth with the API + RequestHeader unset Authorization + + # Apache directive to ensure a user is authenticated + Require valid-user + +``` + + + + + + + + + # Additional resources - [Kerberos documentation by Ubuntu](https://help.ubuntu.com/community/Kerberos) diff --git a/docs/system-admin-guide/manage-work-packages/work-package-settings/README.md b/docs/system-admin-guide/manage-work-packages/work-package-settings/README.md index c8d1d7ea8eae..7532d50c39c4 100644 --- a/docs/system-admin-guide/manage-work-packages/work-package-settings/README.md +++ b/docs/system-admin-guide/manage-work-packages/work-package-settings/README.md @@ -23,7 +23,7 @@ You can adjust the following: ![default highlighting mode](openproject_system_guide_default_highlighting_mode.png) -6. Customize the appearance of the work package lists to **define which work package attributes are displayed in the work package lists by default**. +6. Customize the appearance of the work package tables to **define which work package attributes are displayed in the work package tables by default**. Do not forget to save your changes with the blue **Save** button at the bottom. diff --git a/docs/system-admin-guide/manage-work-packages/work-package-status/README.md b/docs/system-admin-guide/manage-work-packages/work-package-status/README.md index b8b7a9d76d10..8a7c38ba2e04 100644 --- a/docs/system-admin-guide/manage-work-packages/work-package-status/README.md +++ b/docs/system-admin-guide/manage-work-packages/work-package-status/README.md @@ -10,7 +10,7 @@ keywords: work package status Work packages can have various status depending on their types, e.g. tasks can have the status new, in progress, done, on hold, rejected, closed. Or any other status which you would need. -The status can be set at the top of the work package details view or in the list view in the corresponding column. +The status can be set at the top of the work package details view or in the table view in the corresponding column. ![Sys-admin-work-package-status](Sys-admin-work-package-status.png)The status field can be configured under *Administration ->* *Work packages* -> *Status*. You will see the list of all the existing work package status in the system. You can add new status or change the name and order of existing status. To learn about the options for configuring the transition from one status to another navigate to [Manage work package workflows](../work-package-workflows). @@ -24,7 +24,7 @@ To create a new work package status click the green ***+ New Status*** icon. A new window will open, where you will be able to specify the following: 1. Name the new work package status. -2. Define if the new work package status closes a work package (e.g. relevant when filtering for closed for packages), e.g. a work package status "rejected" will set a work package technically on closed and it will not appear in the default work package list with Open Work packages. +2. Define if the new work package status closes a work package (e.g. relevant when filtering for closed for packages), e.g. a work package status "rejected" will set a work package technically on closed and it will not appear in the default work package table with Open Work packages. 3. Define if this status is set as default value when creating new work packages. BEWARE: If you decide to set the new status as default it will impact all work packages, existing and future ones. See more below. 4. Check if this status sets a **work package in read-only mode**. This means no work package attributes can be changed except the status. 5. Set a **color** for the work package status. The color appears in the status button of the work packages or in the work package table. diff --git a/docs/system-admin-guide/manage-work-packages/work-package-types/README.md b/docs/system-admin-guide/manage-work-packages/work-package-types/README.md index 01e62dd53449..310a70141283 100644 --- a/docs/system-admin-guide/manage-work-packages/work-package-types/README.md +++ b/docs/system-admin-guide/manage-work-packages/work-package-types/README.md @@ -80,7 +80,7 @@ Also, you can add a table of related work packages to your work package form. Cl ![Sys-admin-table-of-related-work-packages](openproject_system_guide_table_of_related_wp.png) -Now, you can configure which related work packages should be included in your embedded list, e.g. child work packages or work packages related to this work package, and more. Then you can configure how the list should be filtered, grouped, etc. The configuration of the work package list can be done according to the [work package table configuration](../../../user-guide/work-packages/work-package-table-configuration/). +Now, you can configure which related work packages should be included in your embedded list, e.g. child work packages or work packages related to this work package, and more. Then you can configure how the list should be filtered, grouped, etc. The configuration of the work package table can be done according to the [work package table configuration](../../../user-guide/work-packages/work-package-table-configuration/). Click the blue **Apply** button to add this work package list to your form. diff --git a/docs/system-admin-guide/system-settings/general-settings/README.md b/docs/system-admin-guide/system-settings/general-settings/README.md index 28a8a001efcc..f3ebb543e124 100644 --- a/docs/system-admin-guide/system-settings/general-settings/README.md +++ b/docs/system-admin-guide/system-settings/general-settings/README.md @@ -11,7 +11,7 @@ You can configure general system settings in OpenProject. Under System settings 1. **Application title**: This title will be displayed on the [application start page](../../../user-guide/start-page). -2. **Object per page options** define the options of how many objects (for example work packages or news entries) you can have displayed on one page. This is used for the pagination in the work package list. You can enter several values, separated by coma. Please note that the higher value you set, the more work packages will be initially loaded and therefore it might take longer time to load a work package page. +2. **Object per page options** define the options of how many objects (for example work packages or news entries) you can have displayed on one page. This is used for the pagination in the work package table. You can enter several values, separated by coma. Please note that the higher value you set, the more work packages will be initially loaded and therefore it might take longer time to load a work package page. 3. **Days displayed on project activity** determines how far back the project activities will be traced and displayed in the project's [Activity](../../../user-guide/activity). diff --git a/docs/user-guide/README.md b/docs/user-guide/README.md index 4b37b62297a3..f77e27dca769 100644 --- a/docs/user-guide/README.md +++ b/docs/user-guide/README.md @@ -29,25 +29,25 @@ Within a project Modules can be activated and deactivated under "Modules" in the Please choose the module or topic you want to learn more about. -| Topic | Content | -|------------------------------------------------------------------|:-----------------------------------------------------------------------------------| -| [Project overview page](project-overview) | How to create a project overview dashboard with important project information. | -| [Activity](activity) | How to find out about the latest activities in a project. | -| [Backlogs (Scrum)](backlogs-scrum) | How to manage a Scrum team in OpenProject with a product backlog and taskboard. | -| [Boards](agile-boards) | How to work with Agile boards for agile project management, e.g. Kanban. | -| [Budgets](budgets) | How to create and manage a project budget. | -| [Calendar](calendar) | How to display your work in a calendar in OpenProject. | -| [Documents](documents) | How to upload and share documents in OpenProject. | -| [Forums](forums) | How to manage forums to discuss and comment on topics. | -| [GitHub](../system-admin-guide/integrations/github-integration/) | How to manage the GitHub integration. | -| [Meetings](meetings) | How to manage meetings to create and share meeting agenda and meeting minutes. | -| [News](news) | How to create and manage News for your projects. | -| [Using the Nextcloud integration](nextcloud-integration) | How to link and use Nextcloud files and folders in OpenProject | -| [Team planner](team-planner) | How to use the team planner module. | -| [Time and costs](time-and-costs) | How to track time and costs in OpenProject and report spent time and costs. | -| [Roadmap](roadmap) | How to create a product roadmap with OpenProject. | -| [Wiki](wiki) | How to create and manage a wiki to collaboratively document and share information. | -| [Work packages](work-packages) | How to manage your work in a project. | -| [Gantt chart](gantt-chart) | How to create and manage a project plan in a Gantt chart. | -| [Members](members/) | How to manage Members in a project. | -| [Manage projects](projects) | Edit, create, copy, delete projects and change project settings. | +| Topic | Content | +| ------------------------------------------------------------ | :----------------------------------------------------------- | +| [Project overview page](project-overview) | How to create a project overview dashboard with important project information. | +| [Activity](activity) | How to find out about the latest activities in a project. | +| [Backlogs (Scrum)](backlogs-scrum) | How to manage a Scrum team in OpenProject with a product backlog and taskboard. | +| [Boards](agile-boards) | How to work with Agile boards for agile project management, e.g. Kanban. | +| [Budgets](budgets) | How to create and manage a project budget. | +| [Calendar](calendar) | How to display your work in a calendar in OpenProject. | +| [Documents](documents) | How to upload and share documents in OpenProject. | +| [Forums](forums) | How to manage forums to discuss and comment on topics. | +| [GitHub](../system-admin-guide/integrations/github-integration/) | How to manage the GitHub integration. | +| [Meetings](meetings) | How to manage meetings to create and share meeting agenda and meeting minutes. | +| [News](news) | How to create and manage News for your projects. | +| [Using the Nextcloud integration](nextcloud-integration) | How to link and use Nextcloud files and folders in OpenProject. | +| [Team planner](team-planner) | How to use the team planner module. | +| [Time and costs](time-and-costs) | How to track time and costs in OpenProject and report spent time and costs. | +| [Roadmap](roadmap) | How to create a product roadmap with OpenProject. | +| [Wiki](wiki) | How to create and manage a wiki to collaboratively document and share information. | +| [Work packages](work-packages) | How to manage your work in a project. | +| [Gantt chart](gantt-chart) | How to create and manage a project plan in a Gantt chart. | +| [Members](members/) | How to manage Members in a project. | +| [Manage projects](projects) | Edit, create, copy, delete projects and change project settings. | diff --git a/docs/user-guide/backlogs-scrum/work-with-backlogs/README.md b/docs/user-guide/backlogs-scrum/work-with-backlogs/README.md index f2ca4cc95161..4eee198be6ac 100644 --- a/docs/user-guide/backlogs-scrum/work-with-backlogs/README.md +++ b/docs/user-guide/backlogs-scrum/work-with-backlogs/README.md @@ -10,7 +10,7 @@ keywords: backlogs, scrum, agile, burndown The starting point for effective work in Scrum teams is a well-maintained and prioritized product backlog as well as the creation of sprint backlogs. In OpenProject, you can easily record and specify requirements represented by user stories. Moreover, you can respond to inquiries and sort them by priority for implementation. -Moreover, please note that the backlogs module is not available in the accessibility mode, since it uses drag&drop functionalities which are not accessible. If you use the accessibility mode you can however perform the same actions (like viewing and editing work packages such as user stories and epics) from the work package list view. +Moreover, please note that the backlogs module is not available in the accessibility mode, since it uses drag&drop functionalities which are not accessible. If you use the accessibility mode you can however perform the same actions (like viewing and editing work packages such as user stories and epics) from the work package table view. | Topic | Content | |-----------------------------------------------------|-----------------------------------------------------------------| diff --git a/docs/user-guide/calendar/calendar-faq/README.md b/docs/user-guide/calendar/calendar-faq/README.md index d46e2aa5285a..6a3d70fb96b4 100644 --- a/docs/user-guide/calendar/calendar-faq/README.md +++ b/docs/user-guide/calendar/calendar-faq/README.md @@ -24,7 +24,7 @@ You can however use the meeting module in OpenProject to organize meetings and i ## Are holidays considered in the calendar? -Currently, the calendar does not consider weekends or holidays as non-working days, i.e. the end date for a task could e.g. be set on a Sunday. This is important for businesses that are working on weekends or holidays. Please note that we are currently working on a feature for free days and weekends that can be adjusted as needed. +Since the [12.3 release](https://www.openproject.org/docs/release-notes/12-3-0/) it is possible to specify working and non-working days on an overall instance-level and consequently define a global work week. The default value for non-working days is set to Saturday and Sunday, but can be adjusted to your specific needs. Read more [here](https://www.openproject.org/docs/user-guide/work-packages/set-change-dates/#working-days). ## Is there a limit for the number of work packages displayed in the calendar? diff --git a/docs/user-guide/gantt-chart/README.md b/docs/user-guide/gantt-chart/README.md index 9d6d00610797..d68953b14f93 100644 --- a/docs/user-guide/gantt-chart/README.md +++ b/docs/user-guide/gantt-chart/README.md @@ -28,15 +28,15 @@ The **Gantt chart** in OpenProject displays the work packages in a timeline. You ## Activate the Gantt chart -A Gantt chart can be activated in any work package list, to display the work packages in a timeline view. +A Gantt chart can be activated in any work package table, to display the work packages in a timeline view. -To activate the Gantt chart, select the **Gantt** icon at the top right of the work package list. +To activate the Gantt chart, select the **Gantt** icon at the top right corner of the work package table. ![activate-gantt](activate-gantt.gif) ## Create a new element in the Gantt chart -To add a work package (e.g. phase, milestone or task) to a Gantt chart, click the **+ Create new work package** link at the bottom of the work package list view. +To add a work package (e.g. phase, milestone or task) to a Gantt chart, click the **+ Create new work package** link at the bottom of the work package table view. You can add a subject and make changes to type, status or more fields. @@ -177,9 +177,9 @@ If you want to adjust your work package table and filter, sort or order your wor ## Aggregation by project -You can get a **quick overview of multiple projects** in the Gantt chart. To accomplish this navigate to the Work packages module of a project or the [project overarching work packages list](../projects/#project-overarching-reports). +You can get a **quick overview of multiple projects** in the Gantt chart. To accomplish this navigate to the Work packages module of a project or the [project overarching work package table](../projects/#project-overarching-reports). -**Group the list** by project by using the [work packages table configuration](../work-packages/work-package-table-configuration/#flat-list-hierarchy-mode-and-group-by) (accessible in the upper right corner) or by clicking on the small triangle next to "Project" in the table header. +**Group the work packages** by project by using the [work packages table configuration](../work-packages/work-package-table-configuration/#flat-list-hierarchy-mode-and-group-by) (accessible in the upper right corner) or by clicking on the small triangle next to "Project" in the table header. ![group-by-project](image-20201211020614221.png) **Display the Gantt chart** by clicking on the button in the upper right corner. diff --git a/docs/user-guide/nextcloud-integration/README.md b/docs/user-guide/nextcloud-integration/README.md index 6f53fa56f0a0..280315c3842e 100644 --- a/docs/user-guide/nextcloud-integration/README.md +++ b/docs/user-guide/nextcloud-integration/README.md @@ -20,13 +20,13 @@ This integration makes it possible for you to: > Note: The minimum requirements for this integration are Nextcloud version 22 (or above) and OpenProject version 12.2 (or above). To be able to use Nextcloud as a file storage in your project, the administrator of your instance should first have completed the [Nextcloud integration setup](../../system-admin-guide/integrations/nextcloud). -| Topic | Description | -| ------------------------------------------------------------ | :----------------------------------------------------------- | -| [Connecting your OpenProject and Nextcloud accounts](#connecting-your-openproject-and-nextcloud-accounts) | How to connect your Nextcloud and OpenProject accounts to be able to use this integration | -| [Linking files and folders to work packages](#linking-files-and-folders-to-work-packages) | How to link files and folders to work packages and view and download linked files | -| [Unlinking files and folders](#unlinking-files-and-folders) | How to remove the link between a work package and a Nextcloud file or folder | -| [Permissions and access control](#permissions-and-access-control) | Who has access to linked files and who doesn't | -| [Possible errors and troubleshooting](#possible-errors-and-troubleshooting) | Common errors and how to troubleshoot them | +| Topic | Description | +|--------------------------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------| +| [Connecting your OpenProject and Nextcloud accounts](#connect-your-openproject-and-nextcloud-accounts) | How to connect your Nextcloud and OpenProject accounts to be able to use this integration | +| [Linking files and folders to work packages](#link-files-and-folders-to-work-packages) | How to link files and folders to work packages and view and download linked files | +| [Unlinking files and folders](#remove-links) | How to remove the link between a work package and a Nextcloud file or folder | +| [Permissions and access control](#permissions-and-access-control) | Who has access to linked files and who doesn't | +| [Possible errors and troubleshooting](#possible-errors-and-troubleshooting) | Common errors and how to troubleshoot them | ## Connect your OpenProject and Nextcloud accounts @@ -52,7 +52,7 @@ To begin using this integration, you will need to first connect your OpenProject 5. The one-time process to connect your two accounts is complete. You will now be directed back to the original work package, where you can view and open any Nextcloud files that are already linked, or start linking new ones. -> **Note**: To disconnect the link between your OpenProject and Nextcloud accounts, head on over to Nextcloud and navigate to _Settings → OpenProject_. There, click *Disconnect from OpenProject* button. To re-link the two accounts, simply follow [the above instructions](#connecting-your-openproject-and-nextcloud-accounts) again. +> **Note**: To disconnect the link between your OpenProject and Nextcloud accounts, head on over to Nextcloud and navigate to _Settings → OpenProject_. There, click *Disconnect from OpenProject* button. To re-link the two accounts, simply follow [the above instructions](#connect-your-openproject-and-nextcloud-accounts) again. ## Link files and folders to work packages diff --git a/docs/user-guide/projects/README.md b/docs/user-guide/projects/README.md index 33a4f366cfd9..266ad1a7fbd9 100644 --- a/docs/user-guide/projects/README.md +++ b/docs/user-guide/projects/README.md @@ -226,16 +226,16 @@ Click on the **Modules** icon with the nine squares in the header navigation. Th Here you will find - The [global projects list](#projects-list) -- The global work packages list (see below) +- The global work package tables (see below) - The global news overview - The global time and costs module -### Global work packages list +### Global work package tables Select **Work packages** from the drop down menu **Modules** in the upper right (nine squares). Now, you will see all work packages in the projects for which you have the required [permissions](../..//system-admin-guide/users-permissions/roles-permissions/). -In this project overarching list, you can search, filter, group by, sort, highlight and save views the same way as in the [work package list](../work-packages/work-package-table-configuration) in each project. +In this project overarching list, you can search, filter, group by, sort, highlight and save views the same way as in the [work package table](../work-packages/work-package-table-configuration) in each project. -You can group by projects by clicking in the header of the work package list next to PROJECT and select **Group by**. Collapsing the groups will allow you an **overview of the projects' aggregated milestones** as described [here](../../user-guide/work-packages/work-package-table-configuration/#flat-list-hierarchy-mode-and-group-by). +You can group by projects by clicking in the header of the work package table next to PROJECT and select **Group by**. Collapsing the groups will allow you an **overview of the projects' aggregated milestones** as described [here](../../user-guide/work-packages/work-package-table-configuration/#flat-list-hierarchy-mode-and-group-by). ![project overarching report](project-overarching-report.gif) diff --git a/docs/user-guide/projects/projects-faq/README.md b/docs/user-guide/projects/projects-faq/README.md index af365edc1917..cf8b5d939aeb 100644 --- a/docs/user-guide/projects/projects-faq/README.md +++ b/docs/user-guide/projects/projects-faq/README.md @@ -13,7 +13,7 @@ keywords: projects FAQ, project questions There are several possibilities: 1. To see only the projects without their work packages go to [Projects](../#projects-list) ("View all projects"). Here yo can also display the Project list in a Gantt chart view with all important milestones of all Projects. Therefore you have to click on "Open as Gantt view". -2. For work packages of all projects click on *Modules -> Work packages* in the upper right hand corner (9 squares) in the navigation bar, to access the [global work packages list](../#global-work-packages-list). Use the view configuration to group the work packages by project. +2. For work packages of all projects click on *Modules -> Work packages* in the upper right hand corner (9 squares) in the navigation bar, to access the [global work packages list](../#global-work-package-tables). Use the view configuration to group the work packages by project. 3. Select a project with subprojects, go to the Project overview, add the widget "Work package table" and set the filter "Including subproject". Find more information on this topic [here](../../project-overview/#add-a-widget-to-the-project-overview). Additionally you could add the column "Progress" to compare your different Project progress. 4. Add the widget "Work package table" to your My page and set the filter mentioned above. Find more information on this topic [here](../../../getting-started/my-page/#configure-the-my-page). Additionally you could add the column "Progress". diff --git a/docs/user-guide/repository/README.md b/docs/user-guide/repository/README.md index 49640261f38a..95c038c71254 100644 --- a/docs/user-guide/repository/README.md +++ b/docs/user-guide/repository/README.md @@ -41,8 +41,6 @@ The specifics of working of the selected version control client may vary. Please If you choose to use Tortoise SVN, you will find a good guide [here](https://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug.html). For Git, we recommend the [Pro Git guide](https://git-scm.com/book/en/v2). -The specifics of working of the selected version control client may vary. Please refer to the documentation of your version control software client for more information. If you choose to use Tortoise SVN, you will find a good guide [here](https://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug.html). - ## Referencing work packages In the commit message you can reference a workpackage ID (e.g. #1234). In the repository settings (Administration -> System settings -> Repository) you can define keywords that change the status of the referenced work package (e.g. fixes #1234 or closes #1234). diff --git a/docs/user-guide/search/README.md b/docs/user-guide/search/README.md index da6e2d396111..66cdaa62281b 100644 --- a/docs/user-guide/search/README.md +++ b/docs/user-guide/search/README.md @@ -26,7 +26,7 @@ To access the more detailed, advanced search, choose one of the options shown be If you do not have a project open at the moment, the first two options won't be shown. -Now, you can find the results for your search term from different categories/parts of OpenProject. In the work packages section you can click on **Advanced filter** to access additional filter options (the same as in other work package lists). +Now, you can find the results for your search term from different categories/parts of OpenProject. In the work packages section you can click on **Advanced filter** to access additional filter options (the same as in other work package tables). ![search-result-categories](image-20210412205730857.png) diff --git a/docs/user-guide/time-and-costs/reporting/README.md b/docs/user-guide/time-and-costs/reporting/README.md index d6356a49e4d1..4ee1a0cd1c49 100644 --- a/docs/user-guide/time-and-costs/reporting/README.md +++ b/docs/user-guide/time-and-costs/reporting/README.md @@ -84,7 +84,7 @@ If you just want to report on spent **unit costs**, choose the respective unit c ## Export time and cost reports -To **export reports for time and costs** to Excel you can open or create a report in the Time and costs module in your project. For the Excel export, first [filter and group the report](#group-by-criteria-for-cost-reports) according to your needs. Select the [unit to be displayed](#select-units-to-display) (Labor, Cash value, unit costs). +To **export reports for time and costs** to Excel you can open or create a report in the Time and costs module in your project. For the Excel export, first filter the report according to your needs. Select the [units to be displayed](#select-units-to-display) (Labor, Cash value, etc.). Please note that "Group by" settings won't be applied to the exported file. diff --git a/docs/user-guide/time-and-costs/time-and-costs-faq/README.md b/docs/user-guide/time-and-costs/time-and-costs-faq/README.md index d9b3ec426a6c..2e9efbc30e3b 100644 --- a/docs/user-guide/time-and-costs/time-and-costs-faq/README.md +++ b/docs/user-guide/time-and-costs/time-and-costs-faq/README.md @@ -14,15 +14,7 @@ It is not possible to prevent time logging on phases or restrict it to certain w ## Can I log time for another user than myself? -Currently, that's not possible. However, there's already a [feature request](https://community.openproject.com/projects/openproject/work_packages/21754/activity) on our wish list. - -Possible workarounds: - -- Log in as the other user. -- Set up a cost type (e.g."developer hours" or "John Smith") for unit costs and use this to log time (as unit cost) for others. -- Add a comment with the user's name in the time logging modal. If you want to see the comment in the time and costs module you will have to remove all selections for columns and rows. -- Use the "Activity" drop down menu to choose a user (you can add their names [in the system administration](../../../system-admin-guide/enumerations/)). Then you could use the time and costs module to filter for or sort by "Activity". -- Create a work package as a dummy. It should have a special status so that it can be reliably excluded in time reporting. For this work package, each user for whom times are to be booked by others (e.g. project managers) creates several entries (time bookings) with sample values in advance. Subsequently, the project manager can assign these time entries to another work package if required and enter the actual effort. +Since [12.2 release](https://www.openproject.org/docs/release-notes/12-2-0/) it is possible to log time for a user other than yourself. This right has to be granted by an admin to users with certain roles. You can find out more [here](https://www.openproject.org/docs/user-guide/time-and-costs/time-tracking/#logging-and-editing-time-for-other-users). ## Is it possible to view all hours assigned to each member in total? If I work on various projects I'd like to know how many hours I accumulated for all tasks assigned to me. diff --git a/docs/user-guide/time-and-costs/time-tracking/README.md b/docs/user-guide/time-and-costs/time-tracking/README.md index 7ddc4d24f055..cb3fd4d11ffc 100644 --- a/docs/user-guide/time-and-costs/time-tracking/README.md +++ b/docs/user-guide/time-and-costs/time-tracking/README.md @@ -21,7 +21,10 @@ Users can book their time or units spent on an activity within a project directl | [Delete time entries](#delete-time-entries) | How to delete time entries logged to a work package. | | [Logging and editing time for other users](#logging-and-editing-time-for-other-users) | How to log time to work packages. | | [Spent time widget on the My Page](#spent-time-widget-on-the-my-page) | How to easily track and display spent time in the spent time widget on the MyPage. | -| [Track time with Toggl](./toggl-integration) | How to track spent time with Toggl integration. | +| [Define hourly rate for labor costs](#define-hourly-rate-for-labor-costs) | How to easily track labor costs per user. | +| [Toggl integration](./toggl-integration) | How to track spent time with Toggl. | +| [TimeCamp integration](./timecamp-integration) | How to track spent time using TimeCamp. | +| [Time Tracker integration](./time-tracker-integration) | How to record and log spent time using Time Tracker. | ## Logging time in the work package view diff --git a/docs/user-guide/time-and-costs/time-tracking/time-tracker-integration/README.md b/docs/user-guide/time-and-costs/time-tracking/time-tracker-integration/README.md index 9234320fa205..44af5547d42e 100644 --- a/docs/user-guide/time-and-costs/time-tracking/time-tracker-integration/README.md +++ b/docs/user-guide/time-and-costs/time-tracking/time-tracker-integration/README.md @@ -37,6 +37,6 @@ Time Tracker app is available in the Apple [AppStore](https://apps.apple.com/us/ 7. Set the Confidential Property to unchecked. 8. Leave the Client Credentials User field empty. 9. Once you have completed all the fields, press the Create button. -10. After creating the application, copy the Client ID and Base URL values. Copy Base URL from Auth URL field, it may look like this: `https://example.com` +10. After creating the application, copy the Client ID and Base URL values for future reference and keep them secure. Copy Base URL from Auth URL field, it may look like this: `https://example.com` ![openproject_timetracker_configured](openproject_timetracker_configured.png) diff --git a/docs/user-guide/time-and-costs/time-tracking/toggl-integration/README.md b/docs/user-guide/time-and-costs/time-tracking/toggl-integration/README.md index b9a3dda2eb8d..bee97eebc735 100644 --- a/docs/user-guide/time-and-costs/time-tracking/toggl-integration/README.md +++ b/docs/user-guide/time-and-costs/time-tracking/toggl-integration/README.md @@ -10,6 +10,8 @@ keywords: time tracking, toggl integration To track time to a work package via a start and stop button, we offer an integration for the time recording software (or online timesheet software) Toggl Track ([https://toggl.com/track/](https://toggl.com/track/)). The spent time will be saved in your Toggl account. +Please note that the Toggl integration is not developed by OpenProject. + ## Installation You can install a browser add-in to track time via Toggl Track in OpenProject. This way, you can record spent times directly to a work package in OpenProject via a start/stop button. You need to register an account at Toggl in order to use this feature. diff --git a/docs/user-guide/wiki/create-edit-wiki/README.md b/docs/user-guide/wiki/create-edit-wiki/README.md index 380e985434e0..d4ec33b0d89e 100644 --- a/docs/user-guide/wiki/create-edit-wiki/README.md +++ b/docs/user-guide/wiki/create-edit-wiki/README.md @@ -27,17 +27,12 @@ To create a new wiki page in a project, navigate to the wiki module in your proj The editor window will open, allowing you to enter title and content of the new page. -(1) Enter your page title - -(2) Enter your wiki content. You can use the editor bar to format your texts. [Learn here how to format texts in wiki](../#general-wiki-information) with the editor toolbar. - -(3) Files can be inserted directly via drag and drop or copy and paste into the text input field, or via the image button in the editor toolbar. - -(4) Choose a parent wiki page. - -(5) Comment which changes you have made to a wiki page. - -(6) Save (or cancel) your changes to the page. +1. Enter your page title +2. Enter your wiki content. You can use the editor bar to format your texts. [Learn here how to format texts in wiki](../#general-wiki-information) with the editor toolbar. +3. Files can be inserted directly via drag and drop or copy and paste into the text input field, or via the image button in the editor toolbar. +4. Choose a parent wiki page. +5. Comment which changes you have made to a wiki page. +6. Save (or cancel) your changes to the page. ![create-wiki](create-wiki-1568199670933.png) diff --git a/docs/user-guide/wiki/wiki-menu/README.md b/docs/user-guide/wiki/wiki-menu/README.md index f0e59a350080..92d90548b159 100644 --- a/docs/user-guide/wiki/wiki-menu/README.md +++ b/docs/user-guide/wiki/wiki-menu/README.md @@ -22,15 +22,14 @@ To add a wiki page as a menu item to the project menu, select the **More** funct ![wiki-menu-item](wiki-menu-item.png)You can configure the menu items and choose between different visibility options. -(1) You can give the menu item in the project menu a different name than the wiki page itself by changing the **Name of menu item** in the list. - -(2) You can set different **visibility** options: +1. You can give the menu item in the project menu a different name than the wiki page itself by changing the **Name of menu item** in the list. +2. You can set different **visibility** options: - **Do not show this wikipage in the project navigation** will NOT display a separate menu item in the project navigation. The wiki page is just displayed within the wiki module itself. - **Show as menu item in project navigation** will add a separate menu item to the project navigation. - **Show as submenu item of ...** will display the wiki page a sub-menu item in the project navigation. -(4) **Save** your changes to the wiki page menu. +3. **Save** your changes to the wiki page menu. diff --git a/docs/user-guide/work-packages/README.md b/docs/user-guide/work-packages/README.md index 4a3aacd8d24c..690d1ecc3fc3 100644 --- a/docs/user-guide/work-packages/README.md +++ b/docs/user-guide/work-packages/README.md @@ -29,9 +29,9 @@ Work packages can be displayed in a projects timeline, e.g. as a milestone or a | Topic | Content | | ------------------------------------------------------------ | :----------------------------------------------------------- | -| [Work packages views](work-package-views) | What is the difference between the work packages views: list view, split screen view, details view? | +| [Work packages views](work-package-views) | What is the difference between the work packages views: table view, split screen view, details view? | | [Create a work package](create-work-package) | How to create a new work package in OpenProject | -| [Set and change dates and duration](set-change-dates) | How to set and change the start date, finish date and duration of a work package | +| [Set and change dates and duration](set-change-dates) | How to set and change the start date, finish date and duration of a work package | | [Edit work package](edit-work-package) | How to edit a work package in OpenProject | | [Copy, move, delete](copy-move-delete) | How to copy, move, delete a work package | | [Work package table configuration](work-package-table-configuration) | How to configure the work package table (columns, filters, group by, etc.) | diff --git a/docs/user-guide/work-packages/copy-move-delete/README.md b/docs/user-guide/work-packages/copy-move-delete/README.md index b60bab5af302..4bdf0c838e55 100644 --- a/docs/user-guide/work-packages/copy-move-delete/README.md +++ b/docs/user-guide/work-packages/copy-move-delete/README.md @@ -8,7 +8,7 @@ keywords: copy work package, delete work package, move work package # Copy, change project or delete a work package -If you click with the right mouse button in the line of the work package, a list with different editing options for the selected work package opens. Here you can copy the work package, delete it and move it to another project. You can access these features from the work package list or from within a work package. +If you click with the right mouse button in the line of the work package, a list with different editing options for the selected work package opens. Here you can copy the work package, delete it and move it to another project. You can access these features from the work package table or from within a work package. You can also dit a work package using the three dots at the far right of a row to access the menu. @@ -38,4 +38,4 @@ The *change project* option moves a work package to another project or subprojec The right to delete work packages is tied to specified roles (for example system administrators). The roles and permission may vary from project to project. -You can select these options either in the detail view under *More* or via the context menu by right-clicking into the work package list. The latter option allows you to perform an action (such as copying, moving or deleting a work package) on multiple work packages at once. +You can select these options either in the detail view under *More* or via the context menu by right-clicking into the work package table. The latter option allows you to perform an action (such as copying, moving or deleting a work package) on multiple work packages at once. diff --git a/docs/user-guide/work-packages/create-work-package/README.md b/docs/user-guide/work-packages/create-work-package/README.md index e587740c57f8..cb3a39e727c2 100644 --- a/docs/user-guide/work-packages/create-work-package/README.md +++ b/docs/user-guide/work-packages/create-work-package/README.md @@ -17,7 +17,7 @@ keywords: create work packages There are two ways to create new Work packages: -- Work packages can be [created in-line in the Work package list](#create-a-work-package-in-the-list-view) (just like Excel) to quickly create multiple Work packages. +- Work packages can be [created in-line in the Work package table](#create-a-work-package-in-the-table-view) (just like Excel) to quickly create multiple Work packages. - Work packages can be [created in a split screen](#create-a-work-package-in-the-split-screen-view) which allows you to specify detailed information from the start. Work packages always belong to a project. Therefore, you first need to [select a project](../../../getting-started/projects/#open-an-existing-project). @@ -28,17 +28,17 @@ Then, navigate to the Work package module in the project navigation. -### Create a Work package in the list view +### Create a Work package in the table view -To create new Work packages directly in line in the list view, click on the **+ Create new Work package** link below the list. +To create new Work packages directly in line in the table view, click on the **+ Create new Work package** link below the table. ![create-split-screen](create-split-screen.png) -The new Work package appears in a green row. Type in the subject of the Work package, change attributes, such as Type or Status directly in the list and hit Enter to save the changes. +The new Work package appears in a green row. Type in the subject of the Work package, change attributes, such as Type or Status directly in the table and hit Enter to save the changes. ![create-work-package-list](1566303144875.png) -This way, you can quickly and easily create new Work packages in the list, just like Excel. +This way, you can quickly and easily create new Work packages in the table, just like Excel. ### Create a Work package in the split screen view diff --git a/docs/user-guide/work-packages/edit-work-package/README.md b/docs/user-guide/work-packages/edit-work-package/README.md index 7442c0602166..abed5581bf96 100644 --- a/docs/user-guide/work-packages/edit-work-package/README.md +++ b/docs/user-guide/work-packages/edit-work-package/README.md @@ -17,7 +17,7 @@ keywords: edit work packages ## Update a work package -To edit a work package, double-click in the row of a work package in the [list view](../../work-packages/work-package-views/#list-view) or open the [split screen view](../../work-packages/work-package-views/#split-screen-view) to see the details. +To edit a work package, double-click in the row of a work package in the [table view](../../work-packages/work-package-views/#table-view) or open the [split screen view](../../work-packages/work-package-views/#split-screen-view) to see the details. In the work package details, you can click in any field to update it, e.g. change the description, status, priority, assignee, or add a comment. @@ -92,13 +92,13 @@ The user will no longer get notifications in OpenProject about changes to this w ## Export work packages -To export the work packages, choose **Export ...** in the settings menu on the top right of the work package list (or Gantt chart) view. +To export the work packages, choose **Export ...** in the settings menu on the top right of the work package table (or Gantt chart) view. Please see [this separate guide](../exporting) for more information on exporting work packages. ## Bulk edit work packages -To make a bulk update and edit several work packages at once, navigate to the work packages list view. +To make a bulk update and edit several work packages at once, navigate to the work packages table view. Highlight all work packages which you want to edit. Tip: **keep the Ctrl. button pressed** in order to select and edit several work packages at once. diff --git a/docs/user-guide/work-packages/exporting/README.md b/docs/user-guide/work-packages/exporting/README.md index 3b0e04f84a0d..140833a14af4 100644 --- a/docs/user-guide/work-packages/exporting/README.md +++ b/docs/user-guide/work-packages/exporting/README.md @@ -14,7 +14,7 @@ You can export work packages from your OpenProject instance to other formats usi ## How to trigger an export -To export a work package list or card view to another format, visit the *Work packages* module or a saved view and click on the settings icon in the top right. Trigger the **Export** dialog from the dropdown menu that opens. +To export a work package table or card view to another format, visit the *Work packages* module or a saved view and click on the settings icon in the top right. Trigger the **Export** dialog from the dropdown menu that opens. ![Exporting from the table](export-gantt-chart.png) @@ -28,7 +28,7 @@ This will open a dialog similar to the following screenshot, where you can selec ## Changing what will be exported -From the work packages module, all work packages that are included in the filter list will be exported. Up to a total of 500 work packages can be exported at once. +From the work packages module, all work packages that are included in the filter table will be exported. Up to a total of 500 work packages can be exported at once. > **Note**: If you need to export more than 500 items, filter the work packages appropriately to export multiple files. @@ -49,7 +49,7 @@ OpenProject has multiple options of exporting the results to PDF: -- **PDF** export of the work package list as rows. +- **PDF** export of the work package table, listing work packages as rows. - **PDF with descriptions** same as above with work package descriptions output. Note that this does not include a fully rendered markdown description, but a stripped version of it due to technical limitations of the PDF rendering engine. - **PDF with attachments** of work packages with their attachments inlined to fit as best as possible. - **PDF with descriptions and attachments** The above options combined to create a PDF export with work package descriptions and their attachments. diff --git a/docs/user-guide/work-packages/set-change-dates/README.md b/docs/user-guide/work-packages/set-change-dates/README.md index cb35b52e5130..188ff99d489d 100644 --- a/docs/user-guide/work-packages/set-change-dates/README.md +++ b/docs/user-guide/work-packages/set-change-dates/README.md @@ -31,7 +31,7 @@ You can open the date picker for a work package from a number of different place - By clicking on the date field in the work package [details view](../work-package-views/#full-screen-view) - By clicking the the date field in the work package [split screen view](../work-package-views/#split-screen-view) (from any other view, including [notification center](../../notifications), [team planner](../../team-planner/), [boards](../../agile-boards)...) -- By clicking the start date, finish date or duration fields in [list view](../work-package-views/#list-view) +- By clicking the start date, finish date or duration fields in [table view](../work-package-views/#table-view) ### Using the date picker @@ -46,7 +46,7 @@ You can also click on the **Today** link below the start and finish date fields A more intuitive way to select start and end dates is to simply click on two different dates in the mini calendars below. Two calendar months are displayed for better visibility. -Start by clicking on a start date. This will enter the selected date as the start date, mark it with a dark color on the mini calendar below and move the focus to the finish date field. Hovering on different finish dates will give you a preview of the date range for the work packakge if you click this second date. Once you have decided on a finish date, click on it. This will enter the finish date in the date field and mark that date with another dark color. The dates in between will be highlighted with a lighter colour. +Start by clicking on a start date. This will enter the selected date as the start date, mark it with a dark color on the mini calendar below and move the focus to the finish date field. Hovering on different finish dates will give you a preview of the date range for the work package if you click this second date. Once you have decided on a finish date, click on it. This will enter the finish date in the date field and mark that date with another dark color. The dates in between will be highlighted with a lighter colour. To confirm the selected dates, click on the **Save** button. The green message on top of the work package indicates a successful update. @@ -62,7 +62,9 @@ Date changes are documented in the work package [Activity](../../activity/). - The date picker allows you to pick start and finish dates in the opposite order. Clicking on a start date and then moving backwards to click on an earlier date will then use that first date as the finish date and the second (earlier) date as the start date. -- Once you have selected your start and finish dates, you can adjust either field without resetting the other one by clicking on a new date near the previously selected date. This, however, depends on which date field is in focus. For example, clicking on a new start date that is 2 days earlier when the start date field is in focus simply replaces the original start date (conserving the finish date). However, clicking on that same date when the finish date field is in focus clears the finish date and uses the clicked date as the new start date. A second click then allows to select the new finish date. This should feel quite intuitive when you use it. +- For a work package that already has a start and finish date, it is possible to adjust just the finish date: click on the finish date field and then click on a new date. As long as this date is after the start date, the finish date will update accordingly. If the date you pick is earlier than the start date, the original start date will then be cleared and a click on a second date will define the other end of the new range. + +- It is possible to set only one of the two dates. To do this, click on the field you would like to set (start date is selected by default, but you can change this manually to finish date) and click on a date. Then save without selecting a second date. Alternatively, if a a range is already selected, simply remove one of the dates and save. ### One-day events @@ -113,10 +115,6 @@ Changing the duration when both start and finish dates are already set will then - *If the Working days only switch is **on***, the finish date is automatically set to Monday, 17 October, 2022 (since Saturday and Sunday are not working days) - *If the Working days only switch is **off***, the finish date is automatically set to Saturday, 15 October, 2022 (since all calendar days are included) -Changing the start and finish dates will also affect duration. In our example, if you change the start date to *Monday, 10 October 2022* without changing the finish date of *Friday, 14 October 2022*, the duration is automatically updated to 5 days. - -![A duration of 5 days automatically derived from the start and finish dates](datepicker-5-days.png) - ### Duration when only one date exists A work package cannot have only one date *and* a duration; the other date is automatically derived. This derived date can either be the start date or the finish date. @@ -136,7 +134,6 @@ Setting only duration without start or finish dates is especially useful when yo > To do so, create a series of work packages that represent the main phases and set the approximate duration for each. Link them all using follow/precedes relationships. Now, when you set a start date on the first work package in the series, the start and end dates for all other work packages will be derived. - ## Scheduling mode ### Manual scheduling @@ -193,4 +190,4 @@ This warning banner is displayed on work packages whose start and end dates affe The information and warning banners also feature a **Show Relations** button. Clicking on this will open a new tab that displays work packages with direct relations to the current work package in [Gantt view](../../gantt-chart), in hierarchy mode. -> **Info**: This preview is intended to give a quick overview of only _direct_ relations that might affect scheduling options for the current work package. It does not show second-level relations (and above). To get a full overview, please use the project work package [list view](../work-package-views/#list-view) or [Gantt view](../../gantt-chart) with your desired [filter/view configuration](../work-package-table-configuration/). +> **Info**: This preview is intended to give a quick overview of only _direct_ relations that might affect scheduling options for the current work package. It does not show second-level relations (and above). To get a full overview, please use the project work package [table view](../work-package-views/#table-view) or [Gantt view](../../gantt-chart) with your desired [filter/view configuration](../work-package-table-configuration/). diff --git a/docs/user-guide/work-packages/work-package-relations-hierarchies/README.md b/docs/user-guide/work-packages/work-package-relations-hierarchies/README.md index da172baf8fa0..c906d1d30570 100644 --- a/docs/user-guide/work-packages/work-package-relations-hierarchies/README.md +++ b/docs/user-guide/work-packages/work-package-relations-hierarchies/README.md @@ -15,7 +15,7 @@ Relations indicate any functional or timely relation (e.g. follows or proceeds, | Topic | Content | | ------------------------------------------------------------ | :----------------------------------------------------------- | | [Work packages relations](#work-package-relations) | How can I set a relation between two work packages and which relations can I set? | -| [Display relations in work package list](#display-relations-in-work-package-list-enterprise-add-on) | How can I display the relations between two work packages in the work package list? | +| [Display relations in work package table](#display-relations-in-a-work-package-table-enterprise-add-on) | How can I display the relations between two work packages in the work package table? | | [Work package hierarchies](#work-package-hierarchies) | What are work package hierarchies? Learn about parent and children work packages. | | [Adding a child work package](#adding-a-child-work-package) | What are the possibilities to add children work packages? | | [Change the parent work package](#change-the-parent-work-package) | How can I change a work package's parent? | @@ -46,9 +46,9 @@ The selected relation status will be automatically displayed in the work package -## Display relations in work package list (Enterprise add-on) +## Display relations in a work package table (Enterprise add-on) -As a user of [Enterprise on-premises](https://www.openproject.org/enterprise-edition/) or [Enterprise cloud](https://www.openproject.org/hosting/) you can display relations as columns in the work package list. +As a user of [Enterprise on-premises](https://www.openproject.org/enterprise-edition/) or [Enterprise cloud](https://www.openproject.org/hosting/) you can display relations as columns in the work package tables. This is useful if you want to get an overview of certain types of relationships between work packages. You can for example see which work packages are blocking other work packages. @@ -71,8 +71,8 @@ Work packages can be structured hierarchically, e.g. in order to break down a la There are **three ways to add or create a child work package**: 1. Adding or creating a child in the *Relations* tab in a work package's details view -2. Right-clicking on a work package in the work package list and select "Create new child" -3. Right-clicking on a work package in the work package list and select "Indent hierarchy" to add it as the child of the work package above it. +2. Right-clicking on a work package in the work package table and select "Create new child" +3. Right-clicking on a work package in the work package table and select "Indent hierarchy" to add it as the child of the work package above it. ### Adding a child in the *Relations* tab in a work package's details view @@ -99,7 +99,7 @@ Note that only the children are shown in the relations tab and the parent isn't. ![work package relations](image-20200129145033802.png) -Hierarchies can also be displayed from the work package list view. +Hierarchies can also be displayed from the work package table view. To display work package hierarchies make sure the *Subject* column is displayed. You can activate or deactivate the hierarchy by pressing the icon next to the Subject. ![User guide display hierarchy](User-guide-display-hierarchy.png) diff --git a/docs/user-guide/work-packages/work-package-table-configuration/README.md b/docs/user-guide/work-packages/work-package-table-configuration/README.md index dc779b9f2c18..2f7e415429f9 100644 --- a/docs/user-guide/work-packages/work-package-table-configuration/README.md +++ b/docs/user-guide/work-packages/work-package-table-configuration/README.md @@ -3,25 +3,25 @@ sidebar_navigation: title: Configure work package table priority: 700 description: How to configure the work package list in OpenProject. -keywords: work packages table configuration, work package list, columns, filter, group +keywords: work packages table configuration, work package table, columns, filter, group --- # Work package table configuration -| Topic | Content | -|-------------------------------------------------------------------------------------|----------------------------------------------------------------------------------| -| [Add or remove columns](#add-or-remove-columns-in-the-work-package-table) | How to add or remove columns in the work package table. | -| [Filter work packages](#filter-work-packages) | How to filter in the work package table. | -| [Sort the work package list](#sort-the-work-package-list) | How to sort within the work package table. | -| [Display settings](#flat-list-hierarchy-mode-and-group-by) | Get to know the flat list, the hierarchy mode, the group by and the sum feature. | -| [Attribute highlighting (Enterprise add-on)](#attribute-highlighting-enterprise-add-on) | How to highlight certain attributes in the work package table. | -| [Save work package views](#save-work-package-views) | How to save a new work package view and how to change existing ones. | +| Topic | Content | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| [Add or remove columns](#add-or-remove-columns-in-the-work-package-table) | How to add or remove columns in the work package table. | +| [Filter work packages](#filter-work-packages) | How to filter in the work package table. | +| [Sort the work package table](#sort-the-work-package-table) | How to sort within the work package table. | +| [Display settings](#flat-list-hierarchy-mode-and-group-by) | Get to know the flat list, the hierarchy mode, the group by and the sum feature. | +| [Attribute highlighting (Enterprise add-on)](#attribute-highlighting-enterprise-add-on) | How to highlight certain attributes in the work package table. | +| [Save work package views](#save-work-package-views) | How to save a new work package view and how to change existing ones. | -You can configure the work package table view in OpenProject to display the information that you need in the list. +You can configure the work package table view in OpenProject to display the information that you need in the table. You can change the header in the table and add or remove columns, filter and group work packages or sort them according to specific criteria. Also, you can change between a flat list view, a hierarchy view and a grouped view. -Save the view to have it available directly from your project menu. A work package view is the sum of all modifications you made to the default list (e.g. filters you set). +Save the view to have it available directly from your project menu. A work package view is the sum of all modifications you made to the default table (e.g. filters you set). @@ -32,7 +32,7 @@ To open the work package table configuration, open the **Settings** icon with th ## Add or remove columns in the work package table -To configure the view of the work package table and have different attributes displayed in the list you can add or remove columns in the work package list. +To configure the view of the work package table and have different attributes displayed in the table you can add or remove columns in the work package table. First, [open the work package table configuration](#work-package-table-configuration). @@ -42,7 +42,7 @@ You can add columns by typing the name of the attribute which you would like to You can remove columns by clicking the **x** icon. -You order the attributes in the list with drag and drop. +You order the attributes via drag and drop. ![columns](1566395294543.png) @@ -52,7 +52,7 @@ Clicking the **Apply** button will save your changes and adapt the table accordi ## Filter work packages -In the work package list there will soon be quite a lot of work packages in a project. To filter the work packages in the list, click on the **Filter** button on top of the work packages view. The number next to it tells you how many filter criteria you have applied to a list. +In the work package table there will soon be quite a lot of work packages in a project. To filter the work packages in the table, click on the **Filter** button on top of the work packages view. The number next to it tells you how many filter criteria you have applied to a table. In this example one filter criterion is applied: Status = open. @@ -65,13 +65,13 @@ To add a filter criterion, choose one from the drop-down list next to **+ Add fi You can add as many filter criteria as needed. Also, you can filter by [custom fields](../../../system-admin-guide/custom-fields) if you set this in the custom field configuration. -> **Good to know**: Filtering a work packages list will temporarily change the default work package type and default status to the values used in the filters to make newly created work packages visible in the list. +> **Good to know**: Filtering a work package table will temporarily change the default work package type and default status to the values used in the filters to make newly created work packages visible in the table. ### Filter by text If you want to search for specific text in the subject, description or comments of a work package, type in the **Filter by text** the expression you want to filter for. -The results will be displayed accordingly in the work package list. +The results will be displayed accordingly in the work package table. ![filter-text](filter-text.png) @@ -84,12 +84,12 @@ If you only select work packages without children, no work packages will be show ### Include/exclude work packages from a specific project or subproject -It is possible to display the work packages from more than one project. To include, or exclude such work packages, use the **Include projects** button on top of the work packages list view, where you can select/unselect the appropriate projects and sub-projects you want to add. +It is possible to display the work packages from more than one project. To include, or exclude such work packages, use the **Include projects** button on top of the work package table view, where you can select/unselect the appropriate projects and sub-projects you want to add. To automatically include all sub-projects for each project you chose to select, check the **Include all sub-projects** box at the bottom of the dialog. ![work-package-filter-include-projects](work-package-filter-include-projects.png) -To view all work packages across all projects you could select everything, or use the [global work package list](../../projects/#global-work-packages-list). +To view all work packages across all projects you could select everything, or use the [global work package tables](../../projects/#global-work-package-tables). ### Filter by ID or work package name @@ -131,19 +131,19 @@ It will then display the corresponding work package with the attachment. ![openproject-search-work-package-attachments](openproject-search-work-package-attachments.png) -## Sort the work package list +## Sort the work package table -### Automatic sorting of the work package list -By default, the work package list will be sorted by work package ID. +### Automatic sorting of the work package table +By default, the work package table will be sorted by work package ID.The **ID** is unique for a work package within OpenProject. It will be set automatically from the system. With the ID you can reference a specific work package in OpenProject.-To sort the work package list view, open the [work package table configuration](#work-package-table-configuration) and select the tab **Sort by**. You can sort by up to three attributes, either ascending or descending. +To sort the work package table view, open the [work package table configuration](#work-package-table-configuration) and select the tab **Sort by**. You can sort by up to three attributes, either ascending or descending. ![work-package-table-configuration](work-package-table-configuration-4874227.png) -Clicking the blue **Apply** button will save your changes and display the results accordingly in the list view. +Clicking the blue **Apply** button will save your changes and display the results accordingly in the table view. ![sort-work-packages](sort-work-packages.png) @@ -157,11 +157,11 @@ The same filter applied in the hierarchy mode. ![sort-hierarchy-mode](sort-hierarchy-mode.png) -### Manual sorting of the work package list +### Manual sorting of the work package table -You can sort the work package list manually, using the icon with the 6 dots on the left of each work package to drag and drop it. +You can sort the work package table manually, using the icon with the 6 dots on the left of each work package to drag and drop it. -Moving a work package will change its attributes, depending on the kind of list displayed, e.g. hierarchy changes or priority. +Moving a work package will change its attributes, depending on the kind of table displayed, e.g. hierarchy changes or priority. To keep the sorting it is necessary to [save the work package view](#save-work-package-views). Please note: This has no effect on the "All open" view; you have to save your sorting with another name. @@ -169,35 +169,35 @@ Please note: This has no effect on the "All open" view; you have to save your so ## Flat list, Hierarchy mode and Group by -You have three different options to display results in the work package list. +You have three different options to display results in the work package table. * A **Flat list** (default), which contains all work packages in a list no matter how their parent-child-relation is. * A **Hierarchy**, which will display the filtered results within the parent-child-relation. -* **Group by** will group the list according to a defined attribute. +* **Group by** will group the table according to a defined attribute. To display the work package table you have to choose one of these options. -To switch between the different criteria, open the [work package table configuration](#work-package-table-configuration) and open the tab **Display settings**. Choose how to display the work packages in the list and click the blue **Apply** button. +To switch between the different criteria, open the [work package table configuration](#work-package-table-configuration) and open the tab **Display settings**. Choose how to display the work packages in the table and click the blue **Apply** button. ![display-settings](image-20210426164224748.png) -When you group the work package list by an attribute or by project a **button to collapse groups** shows up: +When you group the work package table by an attribute or by project a **button to collapse groups** shows up: ![collapse-button](collapse-all-expand-all.png) Use it to quickly collapse or expand all groups at the same time. Find out [here](../../gantt-chart/#aggregation-by-project) how to use this feature for a **quick overview of several projects** at once. -### Display sums in work package list +### Display sums in work package table -To display the sums of eligible work package attributes, go to the work package table configuration and click on the tab **Display settings** (see screenshot above). When you tick the box next to **Display sums** the sums of Estimated time and Remaining hours as well as custom fields of the type Integer or Float will be displayed at the bottom of the work package list. -If you group the work package list, sums will be shown for each group. +To display the sums of eligible work package attributes, go to the work package table configuration and click on the tab **Display settings** (see screenshot above). When you tick the box next to **Display sums** the sums of Estimated time and Remaining hours as well as custom fields of the type Integer or Float will be displayed at the bottom of the work package table. +If you group the work package table, sums will be shown for each group. ## Attribute highlighting (Enterprise add-on) -You can highlight attributes in the work package list to emphasize the importance of certain attributes and have important topics at a glance. +You can highlight attributes in the work package table to emphasize the importance of certain attributes and have important topics at a glance. -The following attributes can be highlighted in the list: +The following attributes can be highlighted in the table: * Priority * Status @@ -218,14 +218,14 @@ You can configure the colors for attribute highlighting in the system administra When you have configured your work package table, you can save the views to access them again and share them with your team. -1. Press the **Settings icon** with the three dots on the top right of the work packages list. +1. Press the **Settings icon** with the three dots on the top right corner of the work package table. 2. Choose **Save as...** ![Work-packages-save-view](Work-packages-save-view.png) 3. Enter a **Name** for your saved view (according to the criteria you have chosen in your work package table configuration). - In this example, the list was filtered for work packages assigned to me which have a high priority. + In this example, the table was filtered for work packages assigned to me which have a high priority. **Public views:** Check the public checkbox if you want to have this work package view accessible also for other users from this project. diff --git a/docs/user-guide/work-packages/work-package-views/README.md b/docs/user-guide/work-packages/work-package-views/README.md index 8feae9541760..4860a0239fd6 100644 --- a/docs/user-guide/work-packages/work-package-views/README.md +++ b/docs/user-guide/work-packages/work-package-views/README.md @@ -2,7 +2,7 @@ sidebar_navigation: title: Work packages views priority: 999 -description: Different ways of organising and viewing work packages, including list, split screen, board and Gantt. +description: Different ways of organising and viewing work packages, including table, split screen, board and Gantt. keywords: work packages views --- @@ -27,7 +27,7 @@ You can also create, save and modify your own work package views. Read about [wo The containing work packages in any view can be displayed a number of different ways. Each of these view modes display the same set of work packages but display them differently: -* [List view](#list-view) +* [Table view](#table-view) * [Split screen view](#split-screen-view) * [Details view](#full-screen-view) * [Card view](#card-view) @@ -35,29 +35,29 @@ The containing work packages in any view can be displayed a number of different * [Board view](../../../getting-started/boards-introduction/) -### List view +### Table view -The list view shows all work packages in a list with selected attributes in the columns. +The table view shows all work packages in a table with selected attributes in the columns. ![1566306576394](1566306576394.png) -Find out how to make changes to the work package list view, e.g. change the titles in the header, filter, group or add dependencies. +Find out how to make changes to the work package table view, e.g. change the titles in the header, filter, group or add dependencies. ### Split screen view -If you are in the work package list, click on the blue info icon at the right end of a work package row to open the split screen view. +If you are in the work package table, click on the blue info icon at the right end of a work package row to open the split screen view. -Also, the split screen view can be activated or de-activated with the **info button** at the top right of the work packages list, next to the Filter. +Also, the split screen view can be activated or de-activated with the **info button** at the top right corner of the work package table, next to the Filter. ![split-screen-icon](split-screen-icon.png) -Once the split screen is open, you can easily navigate through the work package list by clicking in a row of a work package and display the details in the split screen on the right. +Once the split screen is open, you can easily navigate through the work package table by clicking in a row of a work package and display the details in the split screen on the right. ![split-screen-view](1566307254418.png) ### Full screen view -To display a work package with all its details in full screen mode, double click on a row within the work package list. +To display a work package with all its details in full screen mode, double click on a row within the work package table. Also, you can use the full screen icon in the work package split screen view in the header at the right (next to Watcher). @@ -65,10 +65,10 @@ Also, you can use the full screen icon in the work package split screen view in Then, the work package with all its details will be displayed. -The arrow next to the subject will bring you back to the list view. +The arrow next to the subject will bring you back to the table view. ![back-to-list-view](image-20201217125332403.png) ### Card view -You can also display the work package list in a card view. To switch to the card view in the work package list, you must select the card icon at the top right of the work package list. +You can also display the work package table in a card view. To switch to the card view in the work package table, you must select the card icon at the top right corner of the work package table. diff --git a/docs/user-guide/work-packages/work-packages-faq/README.md b/docs/user-guide/work-packages/work-packages-faq/README.md index 7ac45a37fd51..bd4d9d643306 100644 --- a/docs/user-guide/work-packages/work-packages-faq/README.md +++ b/docs/user-guide/work-packages/work-packages-faq/README.md @@ -11,7 +11,7 @@ keywords: work packages FAQ, tickets, how to, task | Topic | Content | | --------------------------------------------------------- | ------------------------------------------------------------ | | [Working with work packages](#working-with-work-packages) | Work package attributes, work package form, relations | -| [Filters and queries](#filters-and-queries) | Work package list, saving and changing filters and views | +| [Filters and queries](#filters-and-queries) | Work package table, saving and changing filters and views | | [Status and type](#status-and-type) | Work package statuses and work package types | | [Move and copy](#move-and-copy) | Moving and copying work packages | | [Custom fields](#custom-fields) | Additional fields, self-defined attributes and values | @@ -30,13 +30,13 @@ If you want to manage your project alone (without informing other team members) ### How can I set workload, deadline and duration in a work package? -- Workload: Use "Estimated time" -- Deadline: Use the finish date -- Duration: Create a custom field or just set start date and finish date. +- Workload: Use the "Estimated time" field +- Deadline: Use the "Finish date" field +- Duration: Use the "Duration" field ### How can I see which work packages have been assigned to me as part of a group (e.g. "Marketing team")? -You can set the assignee filter in the work package list to "Assignee and belonging group" to see all work package directly and indirectly (through a group membership) assigned to you. [Save the view](../work-package-table-configuration/#save-work-package-views) to keep it for the future. +You can set the assignee filter in the work package table to "Assignee and belonging group" to see all work package directly and indirectly (through a group membership) assigned to you. [Save the view](../work-package-table-configuration/#save-work-package-views) to keep it for the future. ### How can I track the progress of my work package? @@ -86,7 +86,7 @@ As an inherited change is always commented ("Updated automatically by...") they ### How can I fill/populate the position field/column for work packages? The "Position" attribute is provided by the Backlogs plugin and shows the position of a work package in the backlog. -If you create e.g. a Feature and assign it to a sprint, the position of the feature in the sprint is shown in the "Position" attribute on the work package list. +If you create e.g. a Feature and assign it to a sprint, the position of the feature in the sprint is shown in the "Position" attribute on the work package table. ### Can I restore a deleted workpackage? @@ -94,12 +94,12 @@ There is no easy way to restore a deleted workpackage. Generally, you have the o ## Filters and queries -### How can I keep changed columns or filters for the work packages list? +### How can I keep changed columns or filters for the work package tables? Click on the three dots in the upper right corner and choose **Save** or **Save as**. The view's name will appear in the menu bar on the left. Please note: You can't change the default view "All open", clicking Save will have no effect. -### How can I set certain filters and columns in the work packages list for my colleagues? +### How can I set certain filters and columns in the work package tables for my colleagues? Tick the box next to "Public" when saving the work package view. We suggest ticking the box next to "Favored", too. @@ -109,16 +109,16 @@ This is not possible at the moment, but you can configure and save another view. A [feature request](../../../development/submit-feature-idea/) to change this can be found [here](https://community.openproject.com/projects/openproject/work_packages/31423/activity). -### I sorted my work package list and when I get back to my work package list it doesn't look the same way again. Why? +### I sorted my work package table and when I get back to my work package table it doesn't look the same way again. Why? -It is most likely that you did not save the view of your work package list after sorting it. Make sure you save it (top right menu -> **Save as** or **Save**). +It is most likely that you did not save the view of your work package table after sorting it. Make sure you save it (top right menu -> **Save as** or **Save**). -### In the global work packages list, not all custom fields are available for filters. Why? +### In the global work package tables, not all custom fields are available for filters. Why? -In the [global work packages list](../../projects/#global-work-packages-list), only the custom fields that apply to all projects are displayed in the filter area (setting "for all projects" in the administration). +In the [global work package tables](../../projects/#global-work-package-tables), only the custom fields that apply to all projects are displayed in the filter area (setting "for all projects" in the administration). There are two reasons for this: 1. Potentially, a lot of values are displayed in the global filter list - especially if a lot of custom fields are used in individual projects. This can impair usability and (in extreme cases) performance. 2. As the values in the filter area are displayed for all users, sensitive information (name of the custom fields and their values) could in principle be visible to users who do not have access to the respective project where the custom field is activated. -### I have a parent work package with multiple children. In the work package list I don't see all of the children below the parent. Why? How can I change this? +### I have a parent work package with multiple children. In the work package table I don't see all of the children below the parent. Why? How can I change this? Please increase the number of displayed work packages per page [in the administration](../../../system-admin-guide/system-settings/general-settings/#general-system-settings). Then the probability of this phenomenon happening is lower. This is a known behavior of OpenProject, but not trivial to solve. There's already a feature request for this [here](https://community.openproject.com/projects/openproject/work_packages/34925/activity). @@ -186,13 +186,13 @@ In the following view you have the possibility to change additional attributes o ### How can I move a work package to another project? -In the work package list: Right-click on the work package and choose **Change project**. +In the work package table: Right-click on the work package and choose **Change project**. In the details view of the work package: Click on **More** (button with three dots in the upper right hand corner) and the on **Change project**. ### Can I group tasks into folders? -There are no folders for work packages. To group work packages, such as tasks, you can use the [filter and grouping options](../work-package-table-configuration/#work-package-table-configuration) and [save the filters](../work-package-table-configuration/#save-work-package-views). You can also define all related work packages as children of the same parent work package (e.g. a phase). You can indent the hierarchy for work packages in the work packages list (with a right mouse click -> *Indent hierarchy*) to add them as children to another work package, for example a phase. This will then also be displayed in the Gantt chart. Alternatively, you can use the [work package categories](../../projects/project-settings/work-package-categories/#manage-work-package-categories) or a custom field to filter and group work packages. Also, you can create multiple projects to group different topics. +There are no folders for work packages. To group work packages, such as tasks, you can use the [filter and grouping options](../work-package-table-configuration/#work-package-table-configuration) and [save the filters](../work-package-table-configuration/#save-work-package-views). You can also define all related work packages as children of the same parent work package (e.g. a phase). You can indent the hierarchy for work packages in the work package tables (with a right mouse click -> *Indent hierarchy*) to add them as children to another work package, for example a phase. This will then also be displayed in the Gantt chart. Alternatively, you can use the [work package categories](../../projects/project-settings/work-package-categories/#manage-work-package-categories) or a custom field to filter and group work packages. Also, you can create multiple projects to group different topics. ## Custom fields @@ -200,13 +200,13 @@ There are no folders for work packages. To group work packages, such as tasks, y You can create a custom field for this that you add to the work package form. Please follow [these instructions](../../../system-admin-guide/custom-fields/). -### Will work package custom fields of the type "long text" be shown in the export of a work packages list? +### Will work package custom fields of the type "long text" be shown in the export of a work package tables? As custom fields of the type "long text" cannot be added as a column, they cannot be exported via the page-wide export. However, individual work packages can be exported. This can be done either via the "PDF Download" or (better) via the browser print function. ### Can I sum up custom fields? -Yes, you can display the sum of custom fields in the work packages list by checking the "Sum" option in [the work package display settings](../work-package-table-configuration/#display-sums-in-work-package-list). +Yes, you can display the sum of custom fields in the work package tables by checking the "Sum" option in [the work package display settings](../work-package-table-configuration/#display-sums-in-work-package-table). Calculating a sum across different attributes (e.g. Estimated time + added hours) is however not possible. diff --git a/frontend/src/app/core/current-user/current-user.service.ts b/frontend/src/app/core/current-user/current-user.service.ts index d495ad2680e0..cb8cc9272461 100644 --- a/frontend/src/app/core/current-user/current-user.service.ts +++ b/frontend/src/app/core/current-user/current-user.service.ts @@ -83,7 +83,7 @@ export class CurrentUserService { const filters:ApiV3ListFilter[] = [userFilter]; if (projectContext) { - filters.push(['context', '=', [projectContext === 'global' ? 'g' : `p${projectContext}`]]); + filters.push(['context', '=', [projectContext === 'global' || projectContext === 'projects' ? 'g' : `p${projectContext}`]]); } if (actions.length > 0) { diff --git a/frontend/src/app/core/setup/globals/global-listeners/preview-trigger.service.ts b/frontend/src/app/core/setup/globals/global-listeners/preview-trigger.service.ts index 448113d2f3a7..7cdf0f243e74 100644 --- a/frontend/src/app/core/setup/globals/global-listeners/preview-trigger.service.ts +++ b/frontend/src/app/core/setup/globals/global-listeners/preview-trigger.service.ts @@ -36,31 +36,37 @@ export class PreviewTriggerService { private mouseInModal = false; - constructor(readonly opModalService:OpModalService, + constructor( + readonly opModalService:OpModalService, readonly ngZone:NgZone, - readonly injector:Injector) { + readonly injector:Injector, + ) { } setupListener() { jQuery(document.body).on('mouseover', '.preview-trigger', (e) => { e.preventDefault(); e.stopPropagation(); - const el = jQuery(e.target); - const href = el.attr('href'); + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const el = e.target as HTMLElement; + if (el) { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const href = el.getAttribute('href'); - if (!href) { - return; - } + if (!href) { + return; + } - this.opModalService.show( - WpPreviewModalComponent, - this.injector, - { workPackageLink: href, event: e }, - true, - ).subscribe((previewModal) => { - this.modalElement = previewModal.elementRef.nativeElement as HTMLElement; - previewModal.reposition(jQuery(this.modalElement), el); - }); + this.opModalService.show( + WpPreviewModalComponent, + this.injector, + { workPackageLink: href, event: e }, + true, + ).subscribe((previewModal) => { + this.modalElement = previewModal.elementRef.nativeElement as HTMLElement; + void previewModal.reposition(this.modalElement, el); + }); + } }); jQuery(document.body).on('mouseleave', '.preview-trigger', () => { @@ -93,11 +99,12 @@ export class PreviewTriggerService { } const previewElement = jQuery(this.modalElement.children[0]); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion if (previewElement && previewElement.offset()) { - const horizontalHover = e.pageX >= Math.floor(previewElement.offset()!.left) - && e.pageX < previewElement.offset()!.left + previewElement.width()!; - const verticalHover = e.pageY >= Math.floor(previewElement.offset()!.top) - && e.pageY < previewElement.offset()!.top + previewElement.height()!; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const horizontalHover = e.pageX >= Math.floor(previewElement.offset()!.left) && e.pageX < previewElement.offset()!.left + previewElement.width()!; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const verticalHover = e.pageY >= Math.floor(previewElement.offset()!.top) && e.pageY < previewElement.offset()!.top + previewElement.height()!; return horizontalHover && verticalHover; } return false; diff --git a/frontend/src/app/shared/components/editor/components/ckeditor/ckeditor-setup.service.ts b/frontend/src/app/shared/components/editor/components/ckeditor/ckeditor-setup.service.ts index e4d5d7dfcddc..2adf852a0468 100644 --- a/frontend/src/app/shared/components/editor/components/ckeditor/ckeditor-setup.service.ts +++ b/frontend/src/app/shared/components/editor/components/ckeditor/ckeditor-setup.service.ts @@ -23,9 +23,16 @@ export class CKEditorSetupService { /** The language CKEditor was able to load, falls back to 'en' */ private loadedLocale = 'en'; + /** Prefetch ckeditor when browser is idle */ + private prefetch:Promise; + constructor(private PathHelper:PathHelperService) { } + public initialize() { + this.prefetch = this.load(); + } + /** * Create a CKEditor instance of the given type on the wrapper element. * Pass a ICKEditorContext object that will be used to decide active plugins. @@ -42,7 +49,7 @@ export class CKEditorSetupService { initialData:string|null = null, ):Promise { // Load the bundle and the matching locale, if found. - await this.load(); + await this.prefetch; const { type } = context; const editorClass = type === 'constrained' ? window.OPConstrainedEditor : window.OPClassicEditor; @@ -108,11 +115,11 @@ export class CKEditorSetupService { // untyped module cannot be dynamically imported // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - await import(/* webpackChunkName: "ckeditor" */ 'core-vendor/ckeditor/ckeditor.js'); + await import(/* webpackPrefetch: true; webpackChunkName: "ckeditor" */ 'core-vendor/ckeditor/ckeditor'); try { await import( - /* webpackChunkName: "ckeditor-translation" */ `../../../../../../vendor/ckeditor/translations/${I18n.locale}.js` + /* webpackPrefetch: true; webpackChunkName: "ckeditor-translation" */ `../../../../../../vendor/ckeditor/translations/${I18n.locale}.js` ) as unknown; this.loadedLocale = I18n.locale; } catch (e:unknown) { diff --git a/frontend/src/app/shared/components/editor/openproject-editor.module.ts b/frontend/src/app/shared/components/editor/openproject-editor.module.ts index b9e597bded29..dbfc575eb663 100644 --- a/frontend/src/app/shared/components/editor/openproject-editor.module.ts +++ b/frontend/src/app/shared/components/editor/openproject-editor.module.ts @@ -26,7 +26,11 @@ // See COPYRIGHT and LICENSE files for more details. //++ -import { NgModule } from '@angular/core'; +import { + APP_INITIALIZER, + Injector, + NgModule, +} from '@angular/core'; import { FormsModule } from '@angular/forms'; import { CommonModule } from '@angular/common'; import { OpenprojectAttachmentsModule } from 'core-app/shared/components/attachments/openproject-attachments.module'; @@ -40,6 +44,13 @@ import { WikiIncludePageMacroModalComponent } from 'core-app/shared/components/m import { ChildPagesMacroModalComponent } from 'core-app/shared/components/modals/editor/macro-child-pages-modal/child-pages-macro.modal'; import { CodeBlockMacroModalComponent } from 'core-app/shared/components/modals/editor/macro-code-block-modal/code-block-macro.modal'; +export function initializeServices(injector:Injector) { + return () => { + const ckeditorService = injector.get(CKEditorSetupService); + ckeditorService.initialize(); + }; +} + @NgModule({ imports: [ FormsModule, @@ -52,6 +63,9 @@ import { CodeBlockMacroModalComponent } from 'core-app/shared/components/modals/ EditorMacrosService, CKEditorSetupService, CKEditorPreviewService, + { + provide: APP_INITIALIZER, useFactory: initializeServices, deps: [Injector], multi: true, + }, ], exports: [ CkeditorAugmentedTextareaComponent, diff --git a/frontend/src/app/shared/components/modals/preview-modal/wp-preview-modal/wp-preview.modal.ts b/frontend/src/app/shared/components/modals/preview-modal/wp-preview-modal/wp-preview.modal.ts index 15509ffeea93..a808d2d0f810 100644 --- a/frontend/src/app/shared/components/modals/preview-modal/wp-preview-modal/wp-preview.modal.ts +++ b/frontend/src/app/shared/components/modals/preview-modal/wp-preview-modal/wp-preview.modal.ts @@ -27,7 +27,13 @@ //++ import { - ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Inject, OnInit, + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + ElementRef, + Inject, + OnInit, + Input, } from '@angular/core'; import { OpModalComponent } from 'core-app/shared/components/modal/modal.component'; import { OpModalLocalsToken, OpModalService } from 'core-app/shared/components/modal/modal.service'; @@ -37,6 +43,13 @@ import { WorkPackageResource } from 'core-app/features/hal/resources/work-packag import idFromLink from 'core-app/features/hal/helpers/id-from-link'; import { ApiV3Service } from 'core-app/core/apiv3/api-v3.service'; import { StateService } from '@uirouter/core'; +import { + computePosition, + flip, + limitShift, + Placement, + shift, +} from '@floating-ui/dom'; @Component({ templateUrl: './wp-preview.modal.html', @@ -50,20 +63,26 @@ export class WpPreviewModalComponent extends OpModalComponent implements OnInit created_by: this.i18n.t('js.label_created_by'), }; - constructor(readonly elementRef:ElementRef, + @Input() public alignment?:Placement = 'bottom-end'; + + @Input() public allowRepositioning? = true; + + constructor( + readonly elementRef:ElementRef, @Inject(OpModalLocalsToken) readonly locals:OpModalLocalsMap, readonly cdRef:ChangeDetectorRef, readonly i18n:I18nService, readonly apiV3Service:ApiV3Service, readonly opModalService:OpModalService, - readonly $state:StateService) { + readonly $state:StateService, + ) { super(locals, cdRef, elementRef); } ngOnInit() { super.ngOnInit(); const { workPackageLink } = this.locals; - const workPackageId = idFromLink(workPackageLink); + const workPackageId = idFromLink(workPackageLink as string|null); this .apiV3Service @@ -74,23 +93,37 @@ export class WpPreviewModalComponent extends OpModalComponent implements OnInit this.workPackage = workPackage; this.cdRef.detectChanges(); - const modal = jQuery(this.elementRef.nativeElement); - this.reposition(modal, this.locals.event.target); + const modal = this.elementRef.nativeElement as HTMLElement; + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-explicit-any + void this.reposition(modal, this.locals.event.target as HTMLElement); }); } - public reposition(element:JQuery , target:JQuery ) { - element.position({ - my: 'right top', - at: 'right bottom', - of: target, - collision: 'flipfit', + public async reposition(element:HTMLElement, target:HTMLElement) { + const floatingEl = element.children[0] as HTMLElement; + const { x, y } = await computePosition( + target, + floatingEl, + { + placement: this.alignment, + middleware: this.allowRepositioning ? [ + flip({ + mainAxis: true, + crossAxis: true, + fallbackAxisSideDirection: 'start', + }), + shift({ limiter: limitShift() }), + ] : [], + }, + ); + Object.assign(floatingEl.style, { + left: `${x}px`, + top: `${y}px`, }); } public openStateLink(event:{ workPackageId:string; requestedState:string }) { const params = { workPackageId: event.workPackageId }; - - this.$state.go(event.requestedState, params); + void this.$state.go(event.requestedState, params); } } diff --git a/frontend/src/global_styles/content/_datepicker.sass b/frontend/src/global_styles/content/_datepicker.sass index 122883df6fcc..e90afd9eee4b 100644 --- a/frontend/src/global_styles/content/_datepicker.sass +++ b/frontend/src/global_styles/content/_datepicker.sass @@ -237,11 +237,11 @@ $datepicker--selected-border-radius: 5px border-color: transparent !important color: $spot-color-basic-gray-1 !important - &.flatpickr-non-working-day + &.flatpickr-non-working-day:not(.today,.selected) background: $spot-color-basic-gray-6 !important color: $spot-color-basic-gray-3 !important - &.flatpickr-non-working-day_enabled + &.flatpickr-non-working-day_enabled:not(.today,.selected) background: $spot-color-basic-gray-6 !important color: $spot-color-basic-gray-1 !important @@ -255,15 +255,6 @@ $datepicker--selected-border-radius: 5px background: $spot-color-basic-gray-6 !important border-color: $spot-color-basic-gray-6 !important - &.today - color: $spot-color-basic-gray-1 !important - background: $spot-color-indication-current-date !important - border-color: $spot-color-indication-current-date !important - - &.today - background: $spot-color-indication-current-date !important - border-color: $spot-color-indication-current-date !important - .flatpickr-calendar:not(.inline) box-shadow: $spot-shadow-light-mid !important padding: $spot-spacing-0_5 !important diff --git a/frontend/src/main.ts b/frontend/src/main.ts index 5ddcf1a806cc..5ef76396785e 100644 --- a/frontend/src/main.ts +++ b/frontend/src/main.ts @@ -19,9 +19,13 @@ const ASSET_BASE_PATH = '/assets/frontend/'; // Sets the relative base path window.appBasePath = jQuery('meta[name=app_base_path]').attr('content') || ''; +// Get the asset host, if any +const initializer = document.querySelector('meta[name="openproject_initializer"]') as HTMLMetaElement; +const ASSET_HOST = initializer.dataset.assetHost ? `//${initializer.dataset.assetHost}` : ''; + // Ensure to set the asset base for dynamic code loading // https://webpack.js.org/guides/public-path/ -__webpack_public_path__ = window.appBasePath + ASSET_BASE_PATH; +__webpack_public_path__ = ASSET_HOST + window.appBasePath + ASSET_BASE_PATH; window.ErrorReporter = configureErrorReporter(); diff --git a/lib/api/v3/utilities/endpoints/delayed_modify.rb b/lib/api/v3/utilities/endpoints/delayed_modify.rb index 790ab60b7097..4b74b98c826d 100644 --- a/lib/api/v3/utilities/endpoints/delayed_modify.rb +++ b/lib/api/v3/utilities/endpoints/delayed_modify.rb @@ -42,6 +42,7 @@ def present_success(request, call) def redirect_to_status(request, job) request.redirect api_v3_paths.job_status(job.job_id) + request.content_type 'application/json' end end end diff --git a/lib/open_project/version.rb b/lib/open_project/version.rb index 4c7b872718a7..f940b211d75f 100644 --- a/lib/open_project/version.rb +++ b/lib/open_project/version.rb @@ -33,7 +33,7 @@ module OpenProject module VERSION # :nodoc: MAJOR = 12 MINOR = 5 - PATCH = 7 + PATCH = 8 class << self # Used by semver to define the special version (if any). diff --git a/modules/avatars/config/locales/crowdin/js-no.yml b/modules/avatars/config/locales/crowdin/js-no.yml index a46d62321840..8d1131b72d7a 100644 --- a/modules/avatars/config/locales/crowdin/js-no.yml +++ b/modules/avatars/config/locales/crowdin/js-no.yml @@ -2,7 +2,7 @@ "no": js: label_preview: 'Forhåndsvis' - button_update: 'Oppdatèr' + button_update: 'Oppdater' avatars: label_choose_avatar: "Velg Profilbilde fra fil" uploading_avatar: "Laster opp profilbildet ditt." diff --git a/modules/avatars/config/locales/crowdin/js-zh-TW.yml b/modules/avatars/config/locales/crowdin/js-zh-TW.yml index 4d8714e6e02d..decada470b8d 100644 --- a/modules/avatars/config/locales/crowdin/js-zh-TW.yml +++ b/modules/avatars/config/locales/crowdin/js-zh-TW.yml @@ -11,5 +11,5 @@ zh-TW: 選擇了圖像後,在上傳之前將顯示您的頭像預覽。 error_image_too_large: "圖片太大。" wrong_file_format: "允許的格式是jpg, png以及gif" - empty_file_error: "請上傳一個有效的圖片格式 (jpg, png, gif)" + empty_file_error: "請上傳一個有效的圖片 (jpg, png, gif)" diff --git a/modules/avatars/config/locales/crowdin/ka.yml b/modules/avatars/config/locales/crowdin/ka.yml index 9918f6b0566b..c434b483ee7f 100644 --- a/modules/avatars/config/locales/crowdin/ka.yml +++ b/modules/avatars/config/locales/crowdin/ka.yml @@ -1,8 +1,8 @@ #English strings go here ka: label_avatar: "Avatar" - label_avatar_plural: "Avatars" - label_current_avatar: "Current Avatar" + label_avatar_plural: "პროფილის ფოტოები" + label_current_avatar: "აქტუალური ავატარი" label_choose_avatar: "Choose Avatar from file" message_avatar_uploaded: "Avatar changed successfully." error_image_upload: "Error saving the image." diff --git a/modules/backlogs/config/locales/crowdin/bg.yml b/modules/backlogs/config/locales/crowdin/bg.yml index 476da3965f7a..4e5770b6aebf 100644 --- a/modules/backlogs/config/locales/crowdin/bg.yml +++ b/modules/backlogs/config/locales/crowdin/bg.yml @@ -78,7 +78,7 @@ bg: x_more: "%{count} more..." backlogs_active: "Активен" backlogs_any: "всякакви" - backlogs_card_specification: "Видове етикети за печат на карти" + backlogs_card_specification: "Label types for card printing" backlogs_inactive: "Проектът не показва активност" backlogs_points_burn_direction: "Точки на изгаряне нагоре/надолу" backlogs_product_backlog: "Натрупване на продукти" diff --git a/modules/backlogs/config/locales/crowdin/es.yml b/modules/backlogs/config/locales/crowdin/es.yml index d9c826a2a0e3..105458b31834 100644 --- a/modules/backlogs/config/locales/crowdin/es.yml +++ b/modules/backlogs/config/locales/crowdin/es.yml @@ -130,13 +130,13 @@ es: label_sprint_velocity: "Velocidad %{velocity}, basada en %{sprints} sprints con una media de %{days} días" label_stories: "Historias" label_stories_tasks: "Historias/tareas" - label_task_board: "Panel de tareas" + label_task_board: "Tablero de tareas" label_version_setting: "Versiones" label_version: 'Versión' label_webcal: "Webcal Feed" label_wiki: "Wiki" permission_view_master_backlog: "Ver backlog maestro" - permission_view_taskboards: "Ver paneles de tareas" + permission_view_taskboards: "Ver tablero de tareas" permission_select_done_statuses: "Seleccionar estados de finalización" permission_update_sprints: "Actualizar sprints" points_accepted: "puntos aceptados" diff --git a/modules/backlogs/config/locales/crowdin/hi.yml b/modules/backlogs/config/locales/crowdin/hi.yml index ce9c87b5bd30..f2a733b2437c 100644 --- a/modules/backlogs/config/locales/crowdin/hi.yml +++ b/modules/backlogs/config/locales/crowdin/hi.yml @@ -92,7 +92,7 @@ hi: backlogs_story: "कहानी" backlogs_story_type: "Story types" backlogs_task: "कार्य" - backlogs_task_type: "Task type" + backlogs_task_type: "कार्य प्रकार" backlogs_velocity_missing: "No velocity could be calculated for this project" backlogs_velocity_varies: "Velocity varies significantly over sprints" backlogs_wiki_template: "Template for sprint wiki page" diff --git a/modules/backlogs/config/locales/crowdin/ka.yml b/modules/backlogs/config/locales/crowdin/ka.yml index 4ff25c6ee8ca..ea7d0ec1d904 100644 --- a/modules/backlogs/config/locales/crowdin/ka.yml +++ b/modules/backlogs/config/locales/crowdin/ka.yml @@ -132,7 +132,7 @@ ka: label_stories_tasks: "Stories/Tasks" label_task_board: "Task board" label_version_setting: "Versions" - label_version: 'Version' + label_version: 'ვერსია' label_webcal: "Webcal Feed" label_wiki: "Wiki" permission_view_master_backlog: "View master backlog" diff --git a/modules/backlogs/config/locales/crowdin/no.yml b/modules/backlogs/config/locales/crowdin/no.yml index 454b415a6bd0..a55e81bb9821 100644 --- a/modules/backlogs/config/locales/crowdin/no.yml +++ b/modules/backlogs/config/locales/crowdin/no.yml @@ -95,67 +95,67 @@ backlogs_task_type: "Oppgavetype" backlogs_velocity_missing: "Ingen hastighet kan beregnes for dette prosjektet" backlogs_velocity_varies: "Hastigheten varierer betydelig over sprinter" - backlogs_wiki_template: "Template for sprint wiki page" - backlogs_empty_title: "No versions are defined to be used in backlogs" - backlogs_empty_action_text: "To get started with backlogs, create a new version and assign it to a backlogs column." - button_edit_wiki: "Edit wiki page" - error_backlogs_task_cannot_be_story: "The settings are invalid. The selected task type can not also be a story type." - error_intro_plural: "The following errors were encountered:" - error_intro_singular: "The following error was encountered:" - error_outro: "Please correct the above errors before submitting again." + backlogs_wiki_template: "Mal for sprint wiki-side" + backlogs_empty_title: "Ingen versjoner er definert til å brukes i backlogs" + backlogs_empty_action_text: "For å komme i gang med backlogs, lag en ny versjon og legg den til i en backlog-kolonne" + button_edit_wiki: "Rediger Wiki-sider" + error_backlogs_task_cannot_be_story: "Instillingene er ugyldige. Den valgte oppgavetypen kan ikke også være en historietype." + error_intro_plural: "Møtte på følgende feil:" + error_intro_singular: "Møtte på følgende feil:" + error_outro: "Venligst rett feilene over før du sender inn igjen." event_sprint_description: "%{summary}: %{url}\n%{description}" event_sprint_summary: "%{project}: %{summary}" - ideal: "ideal" + ideal: "Ideell" inclusion: "er ikke inkludert i listen" - label_back_to_project: "Back to project page" + label_back_to_project: "Tilbake til projektsiden" label_backlog: "Backlog" label_backlogs: "Backlogs" - label_backlogs_unconfigured: "You have not configured Backlogs yet. Please go to %{administration} > %{plugins}, then click on the %{configure} link for this plugin. Once you have set the fields, come back to this page to start using the tool." + label_backlogs_unconfigured: "Du har ikke konfigurert Backlogs enda. Gå til %{administration} > %{plugins}og klikk deretter på %{configure} linken for denne utvidelsen. Når du har angitt felter, kom du tilbake til denne siden for å begynne å bruke verktøyet." label_blocks_ids: "IDer for blokkerte arbeidspakker" - label_burndown: "Burndown" - label_column_in_backlog: "Column in backlog" + label_burndown: "Gjenstående" + label_column_in_backlog: "Kolonne i backlog" label_hours: " timer" - label_work_package_hierarchy: "Work package Hierarchy" + label_work_package_hierarchy: "Hierarki for arbeidspakker" label_master_backlog: "Master Backlog" - label_not_prioritized: "not prioritized" - label_points: "points" - label_points_burn_down: "Down" - label_points_burn_up: "Up" - label_product_backlog: "product backlog" - label_select_all: "Select all" + label_not_prioritized: "ikke prioritert" + label_points: "punkter" + label_points_burn_down: "Ned" + label_points_burn_up: "Opp" + label_product_backlog: "Produkt-backlog" + label_select_all: "Velg alle" label_sprint_backlog: "sprint backlog" - label_sprint_cards: "Export cards" - label_sprint_impediments: "Sprint Impediments" + label_sprint_cards: "Eksporter kort" + label_sprint_impediments: "Sprint hindring" label_sprint_name: "Sprint \"%{name}\"" - label_sprint_velocity: "Velocity %{velocity}, based on %{sprints} sprints with an average %{days} days" - label_stories: "Stories" - label_stories_tasks: "Stories/Tasks" - label_task_board: "Task board" + label_sprint_velocity: "Hastighet %{velocity}, basert på %{sprints} sprints med gjennomsnittlig %{days} dager" + label_stories: "Historier" + label_stories_tasks: "Historier/Oppgaver" + label_task_board: "Oppgavetavle" label_version_setting: "Versjoner" label_version: 'Versjon' label_webcal: "Webcal Feed" label_wiki: "Wiki" - permission_view_master_backlog: "View master backlog" - permission_view_taskboards: "View taskboards" - permission_select_done_statuses: "Select done statuses" - permission_update_sprints: "Update sprints" - points_accepted: "points accepted" - points_committed: "points committed" - points_resolved: "points resolved" - points_to_accept: "points not accepted" - points_to_resolve: "points not resolved" + permission_view_master_backlog: "Vis master backlog" + permission_view_taskboards: "Vis oppgavetavler" + permission_select_done_statuses: "Velg ferdige statuser" + permission_update_sprints: "Oppdater sprinter" + points_accepted: "poeng akseptert" + points_committed: "Poeng investert" + points_resolved: "Poeng løst" + points_to_accept: "Poeng ikke akseptert" + points_to_resolve: "Poeng ikke løst" project_module_backlogs: "Backlogs" - rb_label_copy_tasks: "Copy work packages" - rb_label_copy_tasks_all: "All" + rb_label_copy_tasks: "Kopier arbeidspakker" + rb_label_copy_tasks_all: "Alle" rb_label_copy_tasks_none: "Ingen" rb_label_copy_tasks_open: "Åpne" - rb_label_link_to_original: "Include link to original story" - remaining_hours: "remaining hours" - required_burn_rate_hours: "required burn rate (hours)" - required_burn_rate_points: "required burn rate (points)" + rb_label_link_to_original: "Inkluder lenke til den originale historien" + remaining_hours: "Gjenstående timer" + required_burn_rate_hours: "Nødvendig brennetid (timer)" + required_burn_rate_points: "Nødvendig brennetid (poeng)" todo_work_package_description: "%{summary}: %{url}\n%{description}" todo_work_package_summary: "%{type}: %{summary}" - version_settings_display_label: "Column in backlog" - version_settings_display_option_left: "left" + version_settings_display_label: "Kolonne i backlog" + version_settings_display_option_left: "venstre" version_settings_display_option_none: "ingen" - version_settings_display_option_right: "right" + version_settings_display_option_right: "høyre" diff --git a/modules/bim/config/locales/crowdin/id.yml b/modules/bim/config/locales/crowdin/id.yml index c80865eaf39f..91e6800f704f 100644 --- a/modules/bim/config/locales/crowdin/id.yml +++ b/modules/bim/config/locales/crowdin/id.yml @@ -15,7 +15,7 @@ id: file_invalid: "File BCF tidak valid" x_bcf_issues: zero: 'Tidak ada masalah BCF' - one: 'One BCF issue' + one: 'Satu masalah BCF' other: 'Terdapat %{count} masalah BCF' bcf_xml: xml_file: 'File BCF XML' @@ -23,7 +23,7 @@ id: export: 'Ekspor' import_update_comment: '(import BCF diperbarui)' import_failed: 'Tidak bisa mengimport file BCF: %{error}' - import_failed_unsupported_bcf_version: 'Failed to read the BCF file: The BCF version is not supported. Please ensure the version is at least %{minimal_version} or higher.' + import_failed_unsupported_bcf_version: 'Gagal membaca file BCF: Versi BCF tidak didukung. Pastikan versinya minimal %{minimal_version} atau lebih tinggi.' import_successful: '%{count} masalah BCF di import' import_canceled: 'import BCF-XML dibatalkan.' type_not_active: "Jenis masalah tidak di aktifkan dalam proyek ini." @@ -31,7 +31,7 @@ id: num_issues_found: '%{x_bcf_issues} terdapat pada file BCF-XML, lebih jelasnya tercantum dibawah ini.' button_prepare: 'Persiapan import' button_perform_import: 'Konfirmasi import' - button_proceed: 'Proceed with import' + button_proceed: 'Lanjutkan dengan impor' button_back_to_list: 'Kembali ke daftar' no_permission_to_add_members: 'Anda tidak memiliki izin untuk menambah mereka sebagai anggota kedalam proyek.' contact_project_admin: 'Hubungi admin proyek anda untuk menambah mereka sebagai anggota dan mulai lagi.' @@ -57,7 +57,7 @@ id: import_as_system_user: 'Import mereka sebaga pengguna "System".' what_to_do: "Apa yang ingin Anda lakukan?" work_package_has_newer_changes: "Kadaluarsa! Topik ini tidak diperbarui sebagai perubahan terakhir dalam server lebih baru dari \"ModifiedDate\" pada topik yang di import. Namun, komentar dan topik tersebut telah di import." - bcf_file_not_found: "Failed to locate BCF file. Please start the upload process again." + bcf_file_not_found: "Gagal menemukan berkas BCF. Silakan mulai proses pengunggahan lagi." export: format: bcf: "BCF-XML" @@ -67,7 +67,7 @@ id: project_module_bim: "BCF" permission_view_linked_issues: "Lihat masalah BCF" permission_manage_bcf: "Import dan atur masalah BCF" - permission_delete_bcf: "Delete BCF issues" + permission_delete_bcf: "Hapus masalah BCF" oauth: scopes: bcf_v2_1: "Akses penuh kepada API BCF v2.1" @@ -77,16 +77,16 @@ id: bim/ifc_models/ifc_model: "Model IFC" attributes: bim/ifc_models/ifc_model: - ifc_attachment: "IFC file" - is_default: "Default model" - attachments: "IFC file" + ifc_attachment: "berkas IFC" + is_default: "Model bawaan" + attachments: "berkas IFC" errors: models: bim/ifc_models/ifc_model: attributes: base: - ifc_attachment_missing: "No ifc file attached." - invalid_ifc_file: "The provided file is not a valid IFC file." + ifc_attachment_missing: "Tidak ada file ifc yang dilampirkan." + invalid_ifc_file: "File yang disediakan bukan file IFC yang valid." bim/bcf/viewpoint: bitmaps_not_writable: "bitmap tidak bisa ditulis karena belum dilakukan." index_not_integer: "index bukan sebuah integer." @@ -101,7 +101,7 @@ id: snapshot_data_blank: "snapshot_data harus disediakan." unsupported_key: "Properti json yang tidak support dimasukan." bim/bcf/issue: - uuid_already_taken: "Can't import this BCF issue as there already is another with the same GUID. Could it be that this BCF issue had already been imported into a different project?" + uuid_already_taken: "Tidak dapat mengimpor masalah BCF ini karena sudah ada masalah lain dengan GUID yang sama. Mungkinkah masalah BCF ini sudah diimpor ke proyek lain?" ifc_models: label_ifc_models: 'Model IFC' label_new_ifc_model: 'New IFC model' diff --git a/modules/bim/config/locales/crowdin/js-zh-TW.yml b/modules/bim/config/locales/crowdin/js-zh-TW.yml index f6fbfd2271f6..746fad495048 100644 --- a/modules/bim/config/locales/crowdin/js-zh-TW.yml +++ b/modules/bim/config/locales/crowdin/js-zh-TW.yml @@ -4,24 +4,24 @@ zh-TW: bcf: label_bcf: 'BCF' import: '匯入' - import_bcf_xml_file: 'Import BCF XML file (BCF version 2.1)' + import_bcf_xml_file: '匯出 BCF XML 檔案 (BCF version 2.1)' export: '匯出' - export_bcf_xml_file: 'Export BCF XML file (BCF version 2.1)' - viewpoint: 'Viewpoint' - add_viewpoint: 'Add viewpoint' - show_viewpoint: 'Show viewpoint' - delete_viewpoint: 'Delete viewpoint' - management: 'BCF management' - refresh: 'Refresh' - refresh_work_package: 'Refresh work package' + export_bcf_xml_file: '匯出 BCF XML 檔案 (BCF version 2.1)' + viewpoint: '視點' + add_viewpoint: '新增視點' + show_viewpoint: '顯示視點' + delete_viewpoint: '刪除視點' + management: 'BCF 管理' + refresh: '重新整理' + refresh_work_package: '刷新工作項目' ifc_models: - empty_warning: "This project does not yet have any IFC models." - use_this_link_to_manage: "Use this link to upload and manage your IFC models" + empty_warning: "此專案沒有任何 IFC 模型" + use_this_link_to_manage: "用此連結來上載及管理您的 IFC 模型" keyboard_input_disabled: "Viewer does not have keyboard controls. Click on the viewer to give keyboard control to the viewer." models: ifc_models: 'IFC 模型' views: - viewer: 'Viewer' + viewer: '檢視器' split: 'Viewer and table' split_cards: 'Viewer and cards' revit: diff --git a/modules/boards/config/locales/crowdin/es.yml b/modules/boards/config/locales/crowdin/es.yml index 7b8d1f4714d6..bc6a00c1442d 100644 --- a/modules/boards/config/locales/crowdin/es.yml +++ b/modules/boards/config/locales/crowdin/es.yml @@ -1,7 +1,7 @@ #English strings go here es: - permission_show_board_views: "Ver paneles" - permission_manage_board_views: "Administrar paneles" + permission_show_board_views: "Ver tableros" + permission_manage_board_views: "Administrar tableros" project_module_board_view: "Tableros" boards: label_board: "Tablero" diff --git a/modules/boards/config/locales/crowdin/js-ar.yml b/modules/boards/config/locales/crowdin/js-ar.yml index f9257c3d18e6..d2ede28c458d 100644 --- a/modules/boards/config/locales/crowdin/js-ar.yml +++ b/modules/boards/config/locales/crowdin/js-ar.yml @@ -62,7 +62,7 @@ ar: status: الحالة version: الإصدار subproject: مشروع فرعي - subtasks: Parent-child + subtasks: الاصل والفرع basic: Basic select_attribute: "Action attribute" add_list_modal: diff --git a/modules/boards/config/locales/crowdin/js-ca.yml b/modules/boards/config/locales/crowdin/js-ca.yml index 7b4ddfdc72f5..d8e6bdf35c04 100644 --- a/modules/boards/config/locales/crowdin/js-ca.yml +++ b/modules/boards/config/locales/crowdin/js-ca.yml @@ -7,7 +7,7 @@ ca: label_unnamed_list: 'Llista sense nom' label_board_type: 'Tipus de taulell' upsale: - teaser_text: 'T''agradaria automatitzar els teus processos de treball amb taulells? Els taulells avançats són un add-on de l''edició Enterprise. Si us plau, actualitza a un pla de pagament.' + teaser_text: 'T''agradaria automatitzar els teus processos de treball amb taulells? Els taulells avançats són una extensió de l''edició Enterprise. Si us plau, actualitza a un pla de pagament.' upgrade: 'Actualitzeu ara' lists: delete: 'Suprimeix la llista' diff --git a/modules/boards/config/locales/crowdin/js-es.yml b/modules/boards/config/locales/crowdin/js-es.yml index 59cb3d65e634..bbd62c1ec5ed 100644 --- a/modules/boards/config/locales/crowdin/js-es.yml +++ b/modules/boards/config/locales/crowdin/js-es.yml @@ -2,12 +2,12 @@ es: js: boards: - create_new: 'Crear panel' - label_unnamed_board: 'Panel sin nombre' + create_new: 'Crear tablero' + label_unnamed_board: 'Tablero sin nombre' label_unnamed_list: 'Lista sin nombre' - label_board_type: 'Tipo de panel' + label_board_type: 'Tipo de tablero' upsale: - teaser_text: '¿Quieres automatizar tus flujos de trabajo con Paneles? Los paneles avanzados son un add-on de la edición Enterprise. Por favor, actualice a un plan de pago.' + teaser_text: '¿Quieres automatizar tus flujos de trabajo con tableros? Los tableros avanzados son una extensión de Enterprise. Por favor, actualice a un plan de pago.' upgrade: 'Actualizar ahora' lists: delete: 'Eliminar lista' @@ -22,8 +22,8 @@ es: show_version: 'Mostrar versión' locked: 'Bloqueado' closed: 'Cerrado' - new_board: 'Nuevo panel' - add_list: 'Añadir lista al panel' + new_board: 'Nuevo tablero' + add_list: 'Añadir lista al tablero' add_card: 'Agregar tarjeta' error_attribute_not_writable: "No se puede mover el paquete de trabajo porque %{attribute} no permite la escritura." error_loading_the_list: "Error al cargar la lista: %{error_message}" @@ -32,23 +32,23 @@ es: text_hidden_list_warning: "No todas las listas son desplegadas debido a su falta de permiso. Contacte a su administrador para más información." click_to_remove_list: "Haga clic para quitar esta lista" board_type: - text: 'Tipo de panel' + text: 'Tipo de tablero' free: 'básico' select_board_type: 'Por favor elija el tipo de tablero que necesite.' free_text: > - Empiece desde cero con un panel en blanco. Añada de forma manual tarjetas y columnas a este panel. - action: 'Panel de acciones' - action_by_attribute: 'Panel de acciones (%{attribute})' + Empiece desde cero con un tablero en blanco. Añada de forma manual tarjetas y columnas a este tablero. + action: 'Tablero de acciones' + action_by_attribute: 'Tablero de acciones (%{attribute})' action_text: > - Un panel con listas filtradas en el atributo %{attribute}. Al mover paquetes de trabajo a otras listas, se actualizará su atributo. + Un tablero con listas filtradas en el atributo %{attribute}. Al mover paquetes de trabajo a otras listas, se actualizará su atributo. action_text_subprojects: > - Panel con columnas automáticas para subproyectos. Al arrastrar paquetes de trabajo a otras listas, se actualizan los (sub)proyectos en consecuencia. + Tablero con columnas automáticas para subproyectos. Al arrastrar paquetes de trabajo a otras listas, se actualizan los (sub)proyectos en consecuencia. action_text_subtasks: > - Panel con columnas automáticas para subelementos. Al arrastrar paquetes de trabajo a otras listas, se actualizan los elementos principales en consecuencia. + Tablero con columnas automáticas para subelementos. Al arrastrar paquetes de trabajo a otras listas, se actualizan los elementos principales en consecuencia. action_text_status: > - Panel básico estilo kanban con columnas para indicar el estado, como «Tarea pendiente», «En curso» y «Listo». + Tablero básico estilo kanban con columnas para indicar el estado, como «Tarea pendiente», «En curso» y «Listo». action_text_assignee: > - Panel con columnas automáticas basadas en los usuarios asignados. Ideal para enviar paquetes de trabajo. + Tablero con columnas automáticas basadas en los usuarios asignados. Ideal para enviar paquetes de trabajo. action_text_version: > Tablero con columnas automatizadas basadas en el atributo de la versión. Ideal para planificar el desarrollo de productos. action_type: @@ -75,12 +75,12 @@ es: warning: status: | No hay estados disponibles actualmente.
- Puede que no haya ninguno, o bien ya se añadieron todos al panel. + Puede que no haya ninguno, o bien ya se añadieron todos al tablero. assignee: No hay ningún miembro que coincida con el valor de filtro.
no_member: El proyecto no tiene actualmente ningún miembro que pueda añadirse.
add_members: Añada un miembro a este proyecto para volver a seleccionar usuarios. configuration_modal: - title: 'Configurar este panel' + title: 'Configurar este tablero' display_settings: card_mode: "Mostrar como tarjetas" table_mode: "Mostrar como tabla" diff --git a/modules/boards/config/locales/crowdin/js-id.yml b/modules/boards/config/locales/crowdin/js-id.yml index 4e42399e82b3..d89bb4203b55 100644 --- a/modules/boards/config/locales/crowdin/js-id.yml +++ b/modules/boards/config/locales/crowdin/js-id.yml @@ -63,7 +63,7 @@ id: version: Versi subproject: Sub-Project subtasks: Parent-child - basic: Basic + basic: Dasar select_attribute: "Aksi atribut" add_list_modal: labels: diff --git a/modules/boards/config/locales/crowdin/js-ka.yml b/modules/boards/config/locales/crowdin/js-ka.yml index 1b65ab033b57..90bda857a7db 100644 --- a/modules/boards/config/locales/crowdin/js-ka.yml +++ b/modules/boards/config/locales/crowdin/js-ka.yml @@ -8,7 +8,7 @@ ka: label_board_type: 'Board type' upsale: teaser_text: 'Would you like to automate your workflows with Boards? Advanced boards are an Enterprise add-on. Please upgrade to a paid plan.' - upgrade: 'Upgrade now' + upgrade: 'ახლავე განაახლე' lists: delete: 'Delete list' version: @@ -24,7 +24,7 @@ ka: closed: 'Closed' new_board: 'New board' add_list: 'Add list to board' - add_card: 'Add card' + add_card: 'ბარათის დამატება' error_attribute_not_writable: "Cannot move the work package, %{attribute} is not writable." error_loading_the_list: "Error loading the list: %{error_message}" error_permission_missing: "The permission to create public queries is missing" @@ -54,16 +54,16 @@ ka: action_type: assignee: assignee status: status - version: version + version: ვერსია subproject: subproject subtasks: parent-child board_type_title: assignee: Assignee - status: Status - version: Version + status: სტატუსი + version: ვერსია subproject: Subproject subtasks: Parent-child - basic: Basic + basic: ძირითადი select_attribute: "Action attribute" add_list_modal: labels: diff --git a/modules/boards/config/locales/crowdin/js-lt.yml b/modules/boards/config/locales/crowdin/js-lt.yml index ead406c6a1d5..ab6ecc367a1d 100644 --- a/modules/boards/config/locales/crowdin/js-lt.yml +++ b/modules/boards/config/locales/crowdin/js-lt.yml @@ -7,7 +7,7 @@ lt: label_unnamed_list: 'Bevardis sąrašas' label_board_type: 'Lentos tipas' upsale: - teaser_text: 'Would you like to automate your workflows with Boards? Advanced boards are an Enterprise add-on. Please upgrade to a paid plan.' + teaser_text: 'Ar norite automatizuoti jūsų procesus su Lentomis? Išmaniosios lentos yra Enterprise priedas. Prašome pasikeisti į mokamą planą.' upgrade: 'Užsisakykite dabar' lists: delete: 'Pašalinti sąrašą' @@ -62,7 +62,7 @@ lt: status: Būsena version: Versija subproject: Sub-projektas - subtasks: Parent-child + subtasks: Tėvo-vaiko basic: Pagrindinis select_attribute: "Veiksmo atributas" add_list_modal: diff --git a/modules/boards/config/locales/crowdin/js-nl.yml b/modules/boards/config/locales/crowdin/js-nl.yml index 4c3a44dd07b4..df8f4f034cd2 100644 --- a/modules/boards/config/locales/crowdin/js-nl.yml +++ b/modules/boards/config/locales/crowdin/js-nl.yml @@ -62,7 +62,7 @@ nl: status: Status version: Versie subproject: Subproject - subtasks: Parent-child + subtasks: Ouder-kind basic: Basis select_attribute: "Actie attribuut" add_list_modal: diff --git a/modules/boards/config/locales/crowdin/js-zh-TW.yml b/modules/boards/config/locales/crowdin/js-zh-TW.yml index f91e9b44c6cb..1e34843280d2 100644 --- a/modules/boards/config/locales/crowdin/js-zh-TW.yml +++ b/modules/boards/config/locales/crowdin/js-zh-TW.yml @@ -27,9 +27,9 @@ zh-TW: add_card: '新增卡片' error_attribute_not_writable: "無法移動該工作項目, %{attribute} 不可寫入" error_loading_the_list: "列表讀取錯誤: %{error_message}" - error_permission_missing: "The permission to create public queries is missing" - error_cannot_move_into_self: "You can not move a work package into its own column." - text_hidden_list_warning: "Not all lists are displayed because you lack the permission. Contact your admin for more information." + error_permission_missing: "缺少建立公開查詢的權限" + error_cannot_move_into_self: "不可將任務移至自己的欄位" + text_hidden_list_warning: "因權限限制,清單無法全部顯示,請聯絡管理員。" click_to_remove_list: "移除列表" board_type: text: '看板類型' @@ -37,8 +37,8 @@ zh-TW: select_board_type: '選擇您需要的看板類型' free_text: > 從空白看板開始使用,添加新的卡片和列表到這個看板 - action: 'Action board' - action_by_attribute: 'Action board (%{attribute})' + action: '行動項看板' + action_by_attribute: '行動項看板 (%{attribute})' action_text: > A board with filtered lists on %{attribute} attribute. Moving work packages to other lists will update their attribute. action_text_subprojects: > @@ -56,7 +56,7 @@ zh-TW: status: 狀態 version: 版本 subproject: 子專案 - subtasks: parent-child + subtasks: 父-子 board_type_title: assignee: 負責執行者 status: 狀態 @@ -64,23 +64,22 @@ zh-TW: subproject: 子專案 subtasks: Parent-child basic: 基本 - select_attribute: "Action attribute" + select_attribute: "動作屬性" add_list_modal: labels: assignee: 選擇使用者至新的指派列表 - status: Select status to add as a new list - version: Select version to add as a new list - subproject: Select subproject to add as a new list - subtasks: Select work package to add as a new list + status: 依選擇狀態新增清單 + version: 依選擇版本新增清單 + subproject: 依選擇子專案新增清單 + subtasks: 依選擇任務新增清單 warning: status: | - There is currently no status available.
- Either there are none or they have all already been added to the board. - assignee: There isn't any member matched with your filter value.
- no_member: This project currently does not have any members that can be added.
- add_members: Add a new member to this project to select users again. + 目前無可用狀態 + assignee: 沒有任何符合您設定篩選值的人員 + no_member: 此專案目前沒有任何可以加入的人員 + add_members: 新增人員至此專案 來再次選擇使用者。 configuration_modal: - title: 'Configure this board' + title: '設定此看板' display_settings: - card_mode: "Display as cards" - table_mode: "Display as table" + card_mode: "顯示為卡片" + table_mode: "顯示為預覽圖" diff --git a/modules/budgets/config/locales/crowdin/ar.yml b/modules/budgets/config/locales/crowdin/ar.yml index d23df67b0fee..82701e14ddcd 100644 --- a/modules/budgets/config/locales/crowdin/ar.yml +++ b/modules/budgets/config/locales/crowdin/ar.yml @@ -66,7 +66,7 @@ ar: label_example_placeholder: 'مثال، %{decimal}' label_view_all_budgets: "عرض جميع الميزانيات" label_yes: "نعم" - notice_budget_conflict: "Work packages must be of the same project." + notice_budget_conflict: "مجموعات العمل يجب أن تكون لنفس المشروع." notice_no_budgets_available: "لا يوجد ميزانيات متاحة." permission_edit_budgets: "تحرير الميزانية" permission_view_budgets: "عرض الميزانيات" diff --git a/modules/budgets/config/locales/crowdin/ka.yml b/modules/budgets/config/locales/crowdin/ka.yml index 1e904171eaff..738bf4c80bc8 100644 --- a/modules/budgets/config/locales/crowdin/ka.yml +++ b/modules/budgets/config/locales/crowdin/ka.yml @@ -29,7 +29,7 @@ ka: budget_ratio: "Spent (ratio)" description: "Description" spent: "Spent" - status: "Status" + status: "სტატუსი" subject: "Subject" type: "Cost type" labor_budget: "Planned labor costs" diff --git a/modules/budgets/config/locales/crowdin/lt.yml b/modules/budgets/config/locales/crowdin/lt.yml index de03d5ceb0ae..38ee2628247a 100644 --- a/modules/budgets/config/locales/crowdin/lt.yml +++ b/modules/budgets/config/locales/crowdin/lt.yml @@ -66,7 +66,7 @@ lt: label_example_placeholder: 't.y., %{decimal}' label_view_all_budgets: "Peržiūrėti visus biudžetus" label_yes: "Taip" - notice_budget_conflict: "Work packages must be of the same project." + notice_budget_conflict: "Darbų paketai turi būti tame pačiame projekte." notice_no_budgets_available: "Nėra biudžetų." permission_edit_budgets: "Redaguoti biudžetus" permission_view_budgets: "Peržiūrėti biudžetus" diff --git a/modules/budgets/config/locales/crowdin/zh-TW.yml b/modules/budgets/config/locales/crowdin/zh-TW.yml index 7a9ad4aa2ce4..8c17232de7e1 100644 --- a/modules/budgets/config/locales/crowdin/zh-TW.yml +++ b/modules/budgets/config/locales/crowdin/zh-TW.yml @@ -59,7 +59,7 @@ zh-TW: help_currency_format: "Format of displayed currency values. %n is replaced with the currency value, %u ist replaced with the currency unit." help_override_rate: "Enter a value here to override the default rate." label_budget: "預算" - label_budget_new: "新增預算" + label_budget_new: "新預算" label_budget_plural: "預算" label_budget_id: "預算 #%{id}" label_deliverable: "預算" diff --git a/modules/calendar/config/locales/crowdin/js-zh-TW.yml b/modules/calendar/config/locales/crowdin/js-zh-TW.yml index 59c0f13d770d..09a9307b70b1 100644 --- a/modules/calendar/config/locales/crowdin/js-zh-TW.yml +++ b/modules/calendar/config/locales/crowdin/js-zh-TW.yml @@ -2,7 +2,7 @@ zh-TW: js: calendar: - create_new: 'Create new calendar' + create_new: '建立行事曆' title: '行事曆' too_many: '總共有 %{count} 個工作項目,但只有 %{max} 個可以顯示。' - unsaved_title: 'Unnamed calendar' + unsaved_title: '未命名的行事曆' diff --git a/modules/calendar/config/locales/crowdin/zh-TW.yml b/modules/calendar/config/locales/crowdin/zh-TW.yml index dded6ec6740b..07dd59d45cb1 100644 --- a/modules/calendar/config/locales/crowdin/zh-TW.yml +++ b/modules/calendar/config/locales/crowdin/zh-TW.yml @@ -1,6 +1,6 @@ #English strings go here zh-TW: - label_calendar_plural: "Calendars" - permission_view_calendar: "View calendars" - permission_manage_calendars: "Manage calendars" + label_calendar_plural: "行事曆" + permission_view_calendar: "檢視行事曆" + permission_manage_calendars: "管理行事曆" project_module_calendar_view: "行事曆" diff --git a/modules/costs/config/locales/crowdin/js-zh-TW.yml b/modules/costs/config/locales/crowdin/js-zh-TW.yml index bc5bb7b49cc2..ec2185f58ad0 100644 --- a/modules/costs/config/locales/crowdin/js-zh-TW.yml +++ b/modules/costs/config/locales/crowdin/js-zh-TW.yml @@ -23,10 +23,10 @@ zh-TW: js: work_packages: property_groups: - costs: "Costs" + costs: "費用" properties: - overallCosts: "Overall costs" - spentUnits: "Spent units" - button_log_costs: "Log unit costs" + overallCosts: "總計" + spentUnits: "支出單位" + button_log_costs: "紀錄支出單位" label_hour: "小時" label_hours: "小時" diff --git a/modules/costs/config/locales/crowdin/no.yml b/modules/costs/config/locales/crowdin/no.yml index fdb57500d700..9ddbcc149447 100644 --- a/modules/costs/config/locales/crowdin/no.yml +++ b/modules/costs/config/locales/crowdin/no.yml @@ -24,72 +24,72 @@ attributes: cost_entry: work_package: "Arbeidspakke" - overridden_costs: "Overridden costs" + overridden_costs: "Overstyrte kostnader" spent: "Brukt" spent_on: "Dato" cost_type: - unit: "Unit name" - unit_plural: "Pluralized unit name" + unit: "Enhetsnavn" + unit_plural: "Flertallsnavn på enhet" work_package: - costs_by_type: "Spent units" - labor_costs: "Labor costs" - material_costs: "Unit costs" - overall_costs: "Overall costs" - spent_costs: "Spent costs" - spent_units: "Spent units" + costs_by_type: "Brukte enheter" + labor_costs: "Arbeidskostnad" + material_costs: "Enhetskostnader" + overall_costs: "Samlede kostnader" + spent_costs: "Brukte kostnader" + spent_units: "Brukte enheter" rate: - rate: "Rate" + rate: "Sats" user: - default_rates: "Default rates" + default_rates: "Standard satser" models: cost_type: one: "Type kostnader" other: "Cost types" - rate: "Rate" + rate: "Sats" errors: models: work_package: - is_not_a_valid_target_for_cost_entries: "Work package #%{id} is not a valid target for reassigning the cost entries." - nullify_is_not_valid_for_cost_entries: "Cost entries can not be assigned to a project." + is_not_a_valid_target_for_cost_entries: "Arbeidspakke #%{id} er ikke et gyldig mål for nytildeling av kostnadsoppføringer." + nullify_is_not_valid_for_cost_entries: "Kostnadsoppføringer kan ikke tilordnes et prosjekt." attributes: comment: "Kommentar" cost_type: "Type kostnader" - costs: "Costs" - current_rate: "Current rate" + costs: "Kostnader" + current_rate: "Nåværende sats" hours: "Timer" units: "Enheter" - valid_from: "Valid from" - fixed_date: "Fixed date" - button_add_rate: "Add rate" - button_log_costs: "Log unit costs" - caption_booked_on_project: "Booked on project" + valid_from: "Gyldig fra" + fixed_date: "Fast dato" + button_add_rate: "Legg til sats" + button_log_costs: "Loggfør enhetskostnader" + caption_booked_on_project: "Bestilt i prosjektet" caption_default: "Standard" - caption_default_rate_history_for: "Default rate history for %{user}" - caption_locked_on: "Locked on" + caption_default_rate_history_for: "Standardratehistorikk for %{user}" + caption_locked_on: "Låst på" caption_materials: "Enheter" - caption_rate_history: "Rate history" - caption_rate_history_for: "Rate history for %{user}" - caption_rate_history_for_project: "Rate history for %{user} in project %{project}" - caption_save_rate: "Save rate" - caption_set_rate: "Set current rate" - caption_show_locked: "Show locked types" - description_date_for_new_rate: "Date for new rate" - group_by_others: "not in any group" + caption_rate_history: "Satshistorikk" + caption_rate_history_for: "Satshistorikk for %{user}" + caption_rate_history_for_project: "Satshistorikk for %{user} i prosjektet %{project}" + caption_save_rate: "Lagre sats" + caption_set_rate: "Angi gjeldende sats" + caption_show_locked: "Vis låste typer" + description_date_for_new_rate: "Dato for ny sats" + group_by_others: "ikke i noen grupper" label_between: "mellom" - label_cost_filter_add: "Add cost entry filter" - label_costlog: "Logged unit costs" - label_cost_plural: "Costs" - label_cost_type_plural: "Cost types" - label_cost_type_specific: "Cost type #%{id}: %{name}" #%{id}: %{name}" - label_costs_per_page: "Costs per page" - label_currency: "Currency" - label_currency_format: "Format of currency" - label_current_default_rate: "Current default rate" + label_cost_filter_add: "Legg til filter for kostnadspost" + label_costlog: "Loggførte enhetskostnader" + label_cost_plural: "Kostnader" + label_cost_type_plural: "Kostnadstyper" + label_cost_type_specific: "Kostnadstype #%{id}: %{name}" #%{id}: %{name}" + label_costs_per_page: "Kostnader per side" + label_currency: "Valuta" + label_currency_format: "Formatet på valuta" + label_current_default_rate: "Nåværende standardsats" label_date_on: "på" - label_deleted_cost_types: "Deleted cost types" - label_locked_cost_types: "Locked cost types" - label_display_cost_entries: "Display unit costs" - label_display_time_entries: "Display reported hours" + label_deleted_cost_types: "Slettede kostnadstyper" + label_locked_cost_types: "Låste kostnadstyper" + label_display_cost_entries: "Vis enhetskostnader" + label_display_time_entries: "Vis rapporterte timer" label_display_types: "Display types" label_edit: "Rediger" label_generic_user: "Generic user" diff --git a/modules/costs/config/locales/crowdin/zh-TW.yml b/modules/costs/config/locales/crowdin/zh-TW.yml index 2cfc81c15cd4..be5e4cdc7985 100644 --- a/modules/costs/config/locales/crowdin/zh-TW.yml +++ b/modules/costs/config/locales/crowdin/zh-TW.yml @@ -28,39 +28,39 @@ zh-TW: spent: "花費" spent_on: "日期" cost_type: - unit: "Unit name" - unit_plural: "Pluralized unit name" + unit: "單位名稱" + unit_plural: "複數單位名稱" work_package: - costs_by_type: "Spent units" - labor_costs: "Labor costs" - material_costs: "Unit costs" - overall_costs: "Overall costs" - spent_costs: "Spent costs" - spent_units: "Spent units" + costs_by_type: "支出單位" + labor_costs: "工資" + material_costs: "單位花費" + overall_costs: "總計" + spent_costs: "支出成本" + spent_units: "支出單位" rate: - rate: "Rate" + rate: "費率" user: - default_rates: "Default rates" + default_rates: "預設費率" models: cost_type: - other: "Cost types" - rate: "Rate" + other: "費用類別" + rate: "費率" errors: models: work_package: - is_not_a_valid_target_for_cost_entries: "Work package #%{id} is not a valid target for reassigning the cost entries." - nullify_is_not_valid_for_cost_entries: "Cost entries can not be assigned to a project." + is_not_a_valid_target_for_cost_entries: "工作項目 #%{id} 不是重新分配支出的有效目標" + nullify_is_not_valid_for_cost_entries: "支出項目無法分配至專案" attributes: comment: "評論" cost_type: "費用類別" - costs: "Costs" - current_rate: "Current rate" + costs: "費用" + current_rate: "目前費率" hours: "小時" units: "單位" - valid_from: "Valid from" - fixed_date: "Fixed date" - button_add_rate: "Add rate" - button_log_costs: "Log unit costs" + valid_from: "有效期從" + fixed_date: "固定日期" + button_add_rate: "新增費率" + button_log_costs: "紀錄支出單位" caption_booked_on_project: "Booked on project" caption_default: "預設" caption_default_rate_history_for: "Default rate history for %{user}" @@ -77,8 +77,8 @@ zh-TW: label_between: "介於" label_cost_filter_add: "Add cost entry filter" label_costlog: "Logged unit costs" - label_cost_plural: "Costs" - label_cost_type_plural: "Cost types" + label_cost_plural: "費用" + label_cost_type_plural: "費用類別" label_cost_type_specific: "Cost type #%{id}: %{name}" #%{id}: %{name}" label_costs_per_page: "Costs per page" label_currency: "貨幣" @@ -100,17 +100,17 @@ zh-TW: label_work_package_filter_add: "新增工作項目篩選器" label_kind: "類型" label_less_or_equal: "<=" - label_log_costs: "Log unit costs" + label_log_costs: "紀錄支出單位" label_no: "否" label_option_plural: "選項" - label_overall_costs: "Overall costs" - label_rate: "Rate" + label_overall_costs: "總計" + label_rate: "費率" label_rate_plural: "Rates" label_status_finished: "已完成" label_units: "Cost units" label_user: "使用者" label_until: "until" - label_valid_from: "Valid from" + label_valid_from: "有效期從" label_yes: "是" notice_something_wrong: "Something went wrong. Please try again." notice_successful_restore: "Successful restore." diff --git a/modules/dashboards/config/locales/crowdin/es.yml b/modules/dashboards/config/locales/crowdin/es.yml index 369c63a12cfb..d91f2c5123b0 100644 --- a/modules/dashboards/config/locales/crowdin/es.yml +++ b/modules/dashboards/config/locales/crowdin/es.yml @@ -1,4 +1,4 @@ es: dashboards: - label: 'Paneles' - project_module_dashboards: 'Paneles' + label: 'Paneles de control' + project_module_dashboards: 'Paneles de control' diff --git a/modules/dashboards/config/locales/crowdin/js-es.yml b/modules/dashboards/config/locales/crowdin/js-es.yml index 56bec7f95c93..6b14cbe606cd 100644 --- a/modules/dashboards/config/locales/crowdin/js-es.yml +++ b/modules/dashboards/config/locales/crowdin/js-es.yml @@ -1,4 +1,4 @@ es: js: dashboards: - label: 'Paneles' + label: 'Panel de control' diff --git a/modules/github_integration/config/locales/crowdin/js-cs.yml b/modules/github_integration/config/locales/crowdin/js-cs.yml index 2563a8df7afa..e9aae1de867d 100644 --- a/modules/github_integration/config/locales/crowdin/js-cs.yml +++ b/modules/github_integration/config/locales/crowdin/js-cs.yml @@ -28,13 +28,13 @@ cs: title: "Pull Requesty" copy_menu: label: Git snippets - description: Kopírovat snippety gitu do schránky + description: Kopírovat úryvky gitu do schránky git_actions: branch_name: Název pobočky commit_message: Commit message cmd: Vytvořit větev s prázdným commitem title: Rychlé snippety pro Git - copy_success: '✅ Zkopírováno!' + copy_success: '✅ zkopírováno!' copy_error: '❌ Kopírování selhalo!' tab_prs: empty: 'There are no pull requests linked yet. Link an existing PR by using the codeOP#%{wp_id}
in the PR description or create a new PR.' diff --git a/modules/github_integration/config/locales/crowdin/js-es.yml b/modules/github_integration/config/locales/crowdin/js-es.yml index fa9b72b89440..6593e5be59ec 100644 --- a/modules/github_integration/config/locales/crowdin/js-es.yml +++ b/modules/github_integration/config/locales/crowdin/js-es.yml @@ -38,4 +38,4 @@ es: copy_error: '❌ Error al copiar' tab_prs: empty: 'Aún no hay solicitudes de incorporación de cambios vinculadas. Vincule una solicitud de incorporación de cambios existente con el códigoOP#%{wp_id}
en la descripción, o bien cree una nueva solicitud de incorporación de cambios.' - github_actions: Acciones + github_actions: Comportamiento diff --git a/modules/github_integration/config/locales/crowdin/js-uk.yml b/modules/github_integration/config/locales/crowdin/js-uk.yml index 6c40a479d890..b3e3e7155e47 100644 --- a/modules/github_integration/config/locales/crowdin/js-uk.yml +++ b/modules/github_integration/config/locales/crowdin/js-uk.yml @@ -37,5 +37,5 @@ uk: copy_success: '✅ Скопійовано!' copy_error: '❌ Не скопійовано!' tab_prs: - empty: 'Немає прив’язаних запитів на включення. Прив''яжіть наявний PR за допомогою кодуOP#%{wp_id}
в описі PR або створіть новий PR.' + empty: 'Немає прив’язаних запитів на включення. Прив’яжіть наявний PR за допомогою кодуOP#%{wp_id}
в описі PR або створіть новий PR.' github_actions: Дії diff --git a/modules/grids/config/locales/crowdin/js-ar.yml b/modules/grids/config/locales/crowdin/js-ar.yml index c9b9679b45f3..d7b66a474fd1 100644 --- a/modules/grids/config/locales/crowdin/js-ar.yml +++ b/modules/grids/config/locales/crowdin/js-ar.yml @@ -5,8 +5,8 @@ ar: remove: 'إزالة الأداة' configure: 'Configure widget' upsale: - text: "Some widgets, like the work package graph widget, are only available in the Enterprise edition." - link: 'Enterprise edition.' + text: "بعض الأدوات، مثل أداة الرسم البياني لحزمة العمل، متوفرة فقط في النسخة المدفوعة." + link: 'طبعة المؤسسة.' widgets: custom_text: title: 'نص مخصص' diff --git a/modules/grids/config/locales/crowdin/js-de.yml b/modules/grids/config/locales/crowdin/js-de.yml index 93e317b3ab8e..88f4cfd954e1 100644 --- a/modules/grids/config/locales/crowdin/js-de.yml +++ b/modules/grids/config/locales/crowdin/js-de.yml @@ -20,7 +20,7 @@ de: add: 'Mitglied' too_many: 'Zeigt %{count} von %{total} Mitgliedern an.' news: - title: 'Nachrichten' + title: 'Neuigkeiten' at: 'um' no_results: 'Nichts Neues zu berichten.' project_description: diff --git a/modules/grids/config/locales/crowdin/js-es.yml b/modules/grids/config/locales/crowdin/js-es.yml index dd3ac7fe93dc..872cdd3dbb04 100644 --- a/modules/grids/config/locales/crowdin/js-es.yml +++ b/modules/grids/config/locales/crowdin/js-es.yml @@ -5,8 +5,8 @@ es: remove: 'Quitar widget' configure: 'Configurar widget' upsale: - text: "Algunos widgets, como el widget de gráfico de paquetes de trabajo, solo están disponibles en la edición Enterprise." - link: 'Edición Enterprise.' + text: "Algunos widgets, como el widget de gráfico de paquetes de trabajo, solo están disponibles con Enterprise." + link: 'Enterprise.' widgets: custom_text: title: 'Texto personalizado' diff --git a/modules/grids/config/locales/crowdin/js-id.yml b/modules/grids/config/locales/crowdin/js-id.yml index 601003db7420..686b5c3c9ba0 100644 --- a/modules/grids/config/locales/crowdin/js-id.yml +++ b/modules/grids/config/locales/crowdin/js-id.yml @@ -31,13 +31,13 @@ id: no_results: 'No custom fields have been defined for projects.' project_status: title: 'Project status' - not_started: 'Not started' - on_track: 'On track' - off_track: 'Off track' - at_risk: 'At risk' + not_started: 'Belum mulai' + on_track: 'Di jalur' + off_track: 'Keluar dari jalur' + at_risk: 'Berisiko' not_set: 'Not set' finished: 'Selesai' - discontinued: 'Discontinued' + discontinued: 'Dihentikan' subprojects: title: 'Sub Project' no_results: 'No subprojects.' diff --git a/modules/grids/config/locales/crowdin/js-ja.yml b/modules/grids/config/locales/crowdin/js-ja.yml index 0c3ac3d31562..c7199ef21b34 100644 --- a/modules/grids/config/locales/crowdin/js-ja.yml +++ b/modules/grids/config/locales/crowdin/js-ja.yml @@ -31,13 +31,13 @@ ja: no_results: 'プロジェクトにカスタムフィールドが定義されていません。' project_status: title: 'プロジェクトの進捗状況' - not_started: 'Not started' + not_started: '未着手' on_track: '順調' off_track: '脱線' at_risk: 'リスクあり' not_set: '未設定' finished: '完了しました' - discontinued: 'Discontinued' + discontinued: '中止' subprojects: title: '子プロジェクト' no_results: '子プロジェクトはありません。' diff --git a/modules/grids/config/locales/crowdin/js-lt.yml b/modules/grids/config/locales/crowdin/js-lt.yml index 2925a8a8ab5e..ef1ccf6060f0 100644 --- a/modules/grids/config/locales/crowdin/js-lt.yml +++ b/modules/grids/config/locales/crowdin/js-lt.yml @@ -5,8 +5,8 @@ lt: remove: 'Išimti valdiklį' configure: 'Valdiklio nustatymai' upsale: - text: "Some widgets, like the work package graph widget, are only available in the Enterprise edition." - link: 'Enterprise edition.' + text: "Kai kurie valdikliai, pavyzdžiui darbo paketų grafo valdiklis, galimi tik Enterprise versijoje." + link: 'Enterprise versija.' widgets: custom_text: title: 'Pritaikytas tekstas' diff --git a/modules/ldap_groups/config/locales/crowdin/id.yml b/modules/ldap_groups/config/locales/crowdin/id.yml index 3e4141577634..d6f817e0c36b 100644 --- a/modules/ldap_groups/config/locales/crowdin/id.yml +++ b/modules/ldap_groups/config/locales/crowdin/id.yml @@ -51,21 +51,17 @@ id: info: "Catatan: Grup OpenProject itu sendiri dan anggota yang ditambahkan di luar sinkronisasi LDAP ini tidak akan dihapus." verification: "Masukkan nama grup %{name} untuk memverifikasi penghapusan." help_text_html: | - This module allows you to set up a synchronization between LDAP and OpenProject groups. - It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. -
- Groups are synchronized hourly through a cron job. - Please see our documentation on this topic. - no_results: 'No synchronized groups found.' - no_members: 'This group has no synchronized members yet.' - plural: 'Synchronized LDAP groups' + Modul ini memungkinkan Anda mengatur sinkronisasi antara grup LDAP dan OpenProject. Itu tergantung pada grup LDAP yang perlu menggunakan atribut groupOfNames / memberOf yang disetel untuk bekerja dengan OpenProject.
Grup disinkronkan setiap jam melalui tugas cron. Lihat dokumentasi kami tentang topik ini. + no_results: 'Tidak ditemukan grup tersinkronisasi.' + no_members: 'Grup ini belum memiliki anggota yang disinkronkan.' + plural: 'Grup LDAP tersinkronisasi' singular: 'Grup LDAP tersinkronisasi' form: - auth_source_text: 'Select which LDAP connection should be used.' + auth_source_text: 'Pilih koneksi LDAP mana yang harus digunakan.' sync_users_text: > - If you enable this option, found users will also be automatically created in OpenProject. Without it, only existing accounts in OpenProject will be added to groups. - dn_text: 'Enter the full DN of the group in LDAP' - group_text: 'Select an existing OpenProject group that members of the LDAP group shall be synchronized with' + Jika Anda mengaktifkan opsi ini, pengguna yang ditemukan juga akan dibuat secara otomatis di OpenProject. Tanpanya, hanya akun yang ada di OpenProject yang akan ditambahkan ke grup. + dn_text: 'Masukkan DN lengkap grup di LDAP' + group_text: 'Pilih grup OpenProject yang ada yang akan disinkronkan dengan anggota grup LDAP' upsale: - description: 'Take advantage of synchronised LDAP groups to manage users, change their permissions and facilitate user management across groups.' + description: 'Manfaatkan grup LDAP tersinkronisasi untuk mengelola pengguna, mengubah izin mereka, dan memfasilitasi pengelolaan pengguna di seluruh grup.' diff --git a/modules/meeting/app/views/meeting_contents/_form.html.erb b/modules/meeting/app/views/meeting_contents/_form.html.erb index 40ce71936fc2..be0b55304eaf 100644 --- a/modules/meeting/app/views/meeting_contents/_form.html.erb +++ b/modules/meeting/app/views/meeting_contents/_form.html.erb @@ -48,6 +48,8 @@ See COPYRIGHT and LICENSE files for more details. <% path = send("preview_#{content_type}_path", content.meeting) %><%= f.text_field :journal_notes, label: :comments %>
-<%= styled_button_tag t(:button_save), class: '-highlight -with-icon icon-checkmark button--save-agenda' %> + <%= styled_button_tag t(:button_save), + class: '-highlight -with-icon icon-checkmark button--save-agenda', + data: { disable_with: I18n.t(:label_loading) } %> <%= link_to t(:button_cancel), "#", data: { 'content-type': content_type }, class: 'button -with-icon icon-cancel button--cancel-agenda' %> <% end %> diff --git a/modules/meeting/config/locales/crowdin/cs.yml b/modules/meeting/config/locales/crowdin/cs.yml index 105062a41b23..fab5deda6fe4 100644 --- a/modules/meeting/config/locales/crowdin/cs.yml +++ b/modules/meeting/config/locales/crowdin/cs.yml @@ -85,7 +85,7 @@ cs: text_duration_in_hours: "Doba trvání v hodinách" text_in_hours: "v hodinách" text_meeting_agenda_for_meeting: 'Agenda schůzky "%{meeting}"' - text_meeting_closing_are_you_sure: "Are you sure you want to close the agenda?" + text_meeting_closing_are_you_sure: "Opravdu chcete tuto schůzku zavřít?" text_meeting_agenda_open_are_you_sure: "Toto přepíše všechny změny v zápisech! Chcete pokračovat?" text_meeting_minutes_for_meeting: 'zápis pro schůzku "%{meeting}"' text_review_meeting_agenda: "%{author} dal %{link} na revizi." diff --git a/modules/meeting/config/locales/crowdin/id.yml b/modules/meeting/config/locales/crowdin/id.yml index fa47aa158186..661265d68330 100644 --- a/modules/meeting/config/locales/crowdin/id.yml +++ b/modules/meeting/config/locales/crowdin/id.yml @@ -85,7 +85,7 @@ id: text_duration_in_hours: "Durasi dalam jam" text_in_hours: "dalam jam" text_meeting_agenda_for_meeting: 'agenda untuk rapat "%{meeting}"' - text_meeting_closing_are_you_sure: "Are you sure you want to close the agenda?" + text_meeting_closing_are_you_sure: "Yakin ingin menutup agenda?" text_meeting_agenda_open_are_you_sure: "Ini akan mengganti semua perubahan dalam beberapa menit! Apakah anda ingin lanjut?" text_meeting_minutes_for_meeting: 'laporan untuk rapat "%{meeting}"' text_review_meeting_agenda: "%{author} telah memberikan %{link} untuk diulas." diff --git a/modules/meeting/config/locales/crowdin/ka.yml b/modules/meeting/config/locales/crowdin/ka.yml index d9d418ae2327..01fc575161bd 100644 --- a/modules/meeting/config/locales/crowdin/ka.yml +++ b/modules/meeting/config/locales/crowdin/ka.yml @@ -63,7 +63,7 @@ ka: label_meeting_diff: "Diff" label_notify: "Send for review" label_icalendar: "Send iCalendar" - label_version: "Version" + label_version: "ვერსია" label_time_zone: "Time zone" label_start_date: "Start date" meeting: diff --git a/modules/meeting/config/locales/crowdin/nl.yml b/modules/meeting/config/locales/crowdin/nl.yml index 351c235b3f9e..1e79d2d523f7 100644 --- a/modules/meeting/config/locales/crowdin/nl.yml +++ b/modules/meeting/config/locales/crowdin/nl.yml @@ -85,7 +85,7 @@ nl: text_duration_in_hours: "Duur in uren" text_in_hours: "in uren" text_meeting_agenda_for_meeting: 'agenda voor de vergadering "%{meeting}"' - text_meeting_closing_are_you_sure: "Are you sure you want to close the agenda?" + text_meeting_closing_are_you_sure: "Weet u zeker dat u de agenda wilt afsluiten?" text_meeting_agenda_open_are_you_sure: "Dit overschrijft alle wijzigingen in de aantekeningen! Wilt u doorgaan?" text_meeting_minutes_for_meeting: 'minuten voor de vergadering "%{meeting}"' text_review_meeting_agenda: "%{author} heeft de %{link} geselecteerd voor herziening." diff --git a/modules/openid_connect/config/locales/crowdin/id.yml b/modules/openid_connect/config/locales/crowdin/id.yml index 15729b50ba7e..79e3998d8651 100644 --- a/modules/openid_connect/config/locales/crowdin/id.yml +++ b/modules/openid_connect/config/locales/crowdin/id.yml @@ -1,14 +1,14 @@ id: logout_warning: > - You have been logged out. The contents of any form you submit may be lost. Please [log in]. + Anda telah keluar. Isi formulir apa pun yang Anda kirim mungkin akan hilang. Silahkan [log in]. activemodel: attributes: openid_connect/provider: name: Nama - display_name: Display name + display_name: Nama tampilan identifier: Pengenal - secret: Secret - scope: Scope + secret: Rahasia + scope: Cakupan limit_self_registration: Limit self registration openid_connect: menu_title: penyedia OpenID diff --git a/modules/openid_connect/config/locales/crowdin/lt.yml b/modules/openid_connect/config/locales/crowdin/lt.yml index 0d8333b6be7d..73f5e353e67f 100644 --- a/modules/openid_connect/config/locales/crowdin/lt.yml +++ b/modules/openid_connect/config/locales/crowdin/lt.yml @@ -9,7 +9,7 @@ lt: identifier: Identifikatorius secret: Paslaptis scope: Apimtis - limit_self_registration: Limit self registration + limit_self_registration: Riboti savarankišką registraciją openid_connect: menu_title: OpenID tiekėjai providers: @@ -20,4 +20,4 @@ lt: singular: OpenID tiekėjas setting_instructions: limit_self_registration: > - If enabled users can only register using this provider if the self registration setting allows for it. + Įjungus, naudotojai gali registruotis naudodami šį tiekėją, tik jei savarankiškos registracijos nustatymas tai leidžia. diff --git a/modules/reporting/app/controllers/cost_reports_controller.rb b/modules/reporting/app/controllers/cost_reports_controller.rb index d6a9e247770d..a1c0d490cca5 100644 --- a/modules/reporting/app/controllers/cost_reports_controller.rb +++ b/modules/reporting/app/controllers/cost_reports_controller.rb @@ -82,6 +82,15 @@ def index format.html do session[report_engine.name.underscore.to_sym].try(:delete, :name) end + + format.xls do + job_id = ::CostQuery::ScheduleExportService + .new(user: current_user) + .call(filter_params:, project: @project, cost_types: @cost_types) + .result + + redirect_to job_status_path(job_id) + end end end end diff --git a/modules/reporting/app/models/cost_query/export.rb b/modules/reporting/app/models/cost_query/export.rb new file mode 100644 index 000000000000..029a248569dc --- /dev/null +++ b/modules/reporting/app/models/cost_query/export.rb @@ -0,0 +1,10 @@ +class CostQuery::Export < Export + acts_as_attachable view_permission: :export_work_packages, + add_permission: :export_work_packages, + delete_permission: :export_work_packages, + only_user_allowed: true + + def ready? + attachments.any? + end +end diff --git a/modules/reporting/app/services/cost_query/schedule_export_service.rb b/modules/reporting/app/services/cost_query/schedule_export_service.rb new file mode 100644 index 000000000000..059732e89ad5 --- /dev/null +++ b/modules/reporting/app/services/cost_query/schedule_export_service.rb @@ -0,0 +1,53 @@ +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) 2012-2023 the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +class CostQuery::ScheduleExportService + attr_accessor :user + + def initialize(user:) + self.user = user + end + + def call(filter_params:, project:, cost_types:) + export_storage = ::CostQuery::Export.create + job = schedule_export(export_storage, filter_params, project, cost_types) + + ServiceResult.success result: job.job_id + end + + private + + def schedule_export(export_storage, filter_params, project, cost_types) + ::CostQuery::ExportJob.perform_later(export: export_storage, + user:, + mime_type: :xls, + query: filter_params, + project:, + cost_types:) + end +end diff --git a/modules/reporting/app/views/cost_reports/index.html.erb b/modules/reporting/app/views/cost_reports/index.html.erb index de858e902f89..4f9dc1a15c9f 100644 --- a/modules/reporting/app/views/cost_reports/index.html.erb +++ b/modules/reporting/app/views/cost_reports/index.html.erb @@ -43,6 +43,16 @@ See COPYRIGHT and LICENSE files for more details.
diff --git a/modules/reporting/app/workers/cost_query/export_job.rb b/modules/reporting/app/workers/cost_query/export_job.rb new file mode 100644 index 000000000000..90472f7add9c --- /dev/null +++ b/modules/reporting/app/workers/cost_query/export_job.rb @@ -0,0 +1,61 @@ +require 'active_storage/filename' + +class CostQuery::ExportJob < Exports::ExportJob + self.model = ::CostQuery + + def title + I18n.t('export.cost_reports.title') + end + + def project + options[:project] + end + + def cost_types + options[:cost_types] + end + + private + + def prepare! + self.query = build_query(query) + end + + def export! + # Build an xls file from a cost report. + # We only support extracting a simple xls table, so grouping is ignored. + handle_export_result(export, xls_report_result) + end + + def xls_report_result + params = { query:, project:, cost_types: } + content = ::OpenProject::Reporting::CostEntryXlsTable.generate(params).xls + time = Time.zone.now.strftime('%d-%m-%Y-T-%H-%M-%S') + export_title = "cost-report-#{time}.xls" + + ::Exports::Result.new(format: :xls, + title: export_title, + mime_type: 'application/vnd.ms-excel', + content:) + end + + # rubocop:disable Metrics/AbcSize + def build_query(filters, groups = {}) + query = CostQuery.new(project:) + query.tap do |q| + filters[:operators].each do |filter, operator| + unless filters[:values][filter] == ['<>'] + values = Array(filters[:values][filter]).map { |v| v == '< >' ? nil : v } + q.filter(filter.to_sym, + operator:, + values:) + end + end + end + groups[:columns].try(:reverse_each) { |c| query.column(c) } + groups[:rows].try(:reverse_each) { |r| query.row(r) } + query + end + + # rubocop:enable Metrics/AbcSize +end diff --git a/modules/reporting/config/locales/crowdin/af.yml b/modules/reporting/config/locales/crowdin/af.yml index 715b272d8531..8e89a6cd5541 100644 --- a/modules/reporting/config/locales/crowdin/af.yml +++ b/modules/reporting/config/locales/crowdin/af.yml @@ -81,6 +81,9 @@ af: units: "Units" validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/ar.yml b/modules/reporting/config/locales/crowdin/ar.yml index c77878da5eab..9638245c29a6 100644 --- a/modules/reporting/config/locales/crowdin/ar.yml +++ b/modules/reporting/config/locales/crowdin/ar.yml @@ -81,6 +81,9 @@ ar: units: "الوحدات" validation_failure_date: "ليس تاريخًا صالحًا" validation_failure_integer: "ليس عددًا صحيحًا صالحًا" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "الاعمدة المحددة" diff --git a/modules/reporting/config/locales/crowdin/az.yml b/modules/reporting/config/locales/crowdin/az.yml index d9ecadcdc406..33f90d77555c 100644 --- a/modules/reporting/config/locales/crowdin/az.yml +++ b/modules/reporting/config/locales/crowdin/az.yml @@ -81,6 +81,9 @@ az: units: "Units" validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/be.yml b/modules/reporting/config/locales/crowdin/be.yml index 9b171d607858..1f14beadde5e 100644 --- a/modules/reporting/config/locales/crowdin/be.yml +++ b/modules/reporting/config/locales/crowdin/be.yml @@ -81,6 +81,9 @@ be: units: "Units" validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/bg.yml b/modules/reporting/config/locales/crowdin/bg.yml index f47e120affdf..4d75740b68a6 100644 --- a/modules/reporting/config/locales/crowdin/bg.yml +++ b/modules/reporting/config/locales/crowdin/bg.yml @@ -81,6 +81,9 @@ bg: units: "Units" validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/ca.yml b/modules/reporting/config/locales/crowdin/ca.yml index ae858057b727..8969a87b5c0d 100644 --- a/modules/reporting/config/locales/crowdin/ca.yml +++ b/modules/reporting/config/locales/crowdin/ca.yml @@ -81,6 +81,9 @@ ca: units: "Unitats" validation_failure_date: "no és una data vàlida" validation_failure_integer: "no és un enter vàlid" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Columnes seleccionades" diff --git a/modules/reporting/config/locales/crowdin/ckb-IR.yml b/modules/reporting/config/locales/crowdin/ckb-IR.yml index a5f0a19bb5fe..1b0a63e1a716 100644 --- a/modules/reporting/config/locales/crowdin/ckb-IR.yml +++ b/modules/reporting/config/locales/crowdin/ckb-IR.yml @@ -81,6 +81,9 @@ ckb-IR: units: "Units" validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/cs.yml b/modules/reporting/config/locales/crowdin/cs.yml index 215c57f18d94..f70406474779 100644 --- a/modules/reporting/config/locales/crowdin/cs.yml +++ b/modules/reporting/config/locales/crowdin/cs.yml @@ -81,6 +81,9 @@ cs: units: "Jednotky" validation_failure_date: "není platné datum" validation_failure_integer: "není platné číslo" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Vybrané sloupce" diff --git a/modules/reporting/config/locales/crowdin/da.yml b/modules/reporting/config/locales/crowdin/da.yml index d1bae85b258a..be2773f643fa 100644 --- a/modules/reporting/config/locales/crowdin/da.yml +++ b/modules/reporting/config/locales/crowdin/da.yml @@ -81,6 +81,9 @@ da: units: "Enheder" validation_failure_date: "er en ugyldig dato" validation_failure_integer: "er et ugyldigt heltal" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/de.yml b/modules/reporting/config/locales/crowdin/de.yml index bf10e5cda6e4..1cbcfec79b3e 100644 --- a/modules/reporting/config/locales/crowdin/de.yml +++ b/modules/reporting/config/locales/crowdin/de.yml @@ -81,6 +81,9 @@ de: units: "Einheiten" validation_failure_date: "ist kein gültiges Datum" validation_failure_integer: "ist keine ganze Zahl" + export: + cost_reports: + title: "Kostenbericht als XLS-Export" reporting: group_by: selected_columns: "Ausgewählte Spalten" diff --git a/modules/reporting/config/locales/crowdin/el.yml b/modules/reporting/config/locales/crowdin/el.yml index dc3836e12ca7..cbc4a06641c1 100644 --- a/modules/reporting/config/locales/crowdin/el.yml +++ b/modules/reporting/config/locales/crowdin/el.yml @@ -81,6 +81,9 @@ el: units: "Μονάδες" validation_failure_date: "δεν είναι έγκυρη ημερομηνία" validation_failure_integer: "δεν είναι έγκυρος ακέραιος αριθμός" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Επιλεγμένες στήλες" diff --git a/modules/reporting/config/locales/crowdin/eo.yml b/modules/reporting/config/locales/crowdin/eo.yml index f8fa5d1cddcc..f59fb6135782 100644 --- a/modules/reporting/config/locales/crowdin/eo.yml +++ b/modules/reporting/config/locales/crowdin/eo.yml @@ -81,6 +81,9 @@ eo: units: "Units" validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/es.yml b/modules/reporting/config/locales/crowdin/es.yml index 8c76c61eea53..2925262edf25 100644 --- a/modules/reporting/config/locales/crowdin/es.yml +++ b/modules/reporting/config/locales/crowdin/es.yml @@ -81,6 +81,9 @@ es: units: "Unidades" validation_failure_date: "no es una fecha válida" validation_failure_integer: "no es un entero válido" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Columnas seleccionadas" diff --git a/modules/reporting/config/locales/crowdin/et.yml b/modules/reporting/config/locales/crowdin/et.yml index 79680059a669..d17531a6a17b 100644 --- a/modules/reporting/config/locales/crowdin/et.yml +++ b/modules/reporting/config/locales/crowdin/et.yml @@ -81,6 +81,9 @@ et: units: "Ühikud" validation_failure_date: "pole korrektne kuupäev" validation_failure_integer: "pole täisarv" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/eu.yml b/modules/reporting/config/locales/crowdin/eu.yml index fa3f0eb91b66..7038ebcd9146 100644 --- a/modules/reporting/config/locales/crowdin/eu.yml +++ b/modules/reporting/config/locales/crowdin/eu.yml @@ -81,6 +81,9 @@ eu: units: "Units" validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/fa.yml b/modules/reporting/config/locales/crowdin/fa.yml index e0aa24960a6d..11f7433d806c 100644 --- a/modules/reporting/config/locales/crowdin/fa.yml +++ b/modules/reporting/config/locales/crowdin/fa.yml @@ -81,6 +81,9 @@ fa: units: "واحدها" validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/fi.yml b/modules/reporting/config/locales/crowdin/fi.yml index 3c65c0f8cd36..92b447acfaba 100644 --- a/modules/reporting/config/locales/crowdin/fi.yml +++ b/modules/reporting/config/locales/crowdin/fi.yml @@ -81,6 +81,9 @@ fi: units: "Yksiköt" validation_failure_date: "ei ole kelvollinen päivämäärä" validation_failure_integer: "ei ole kelvollinen kokonaisluku" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Valitut sarakkeet" diff --git a/modules/reporting/config/locales/crowdin/fil.yml b/modules/reporting/config/locales/crowdin/fil.yml index 8ce56c2c90d0..c1a41d6149a4 100644 --- a/modules/reporting/config/locales/crowdin/fil.yml +++ b/modules/reporting/config/locales/crowdin/fil.yml @@ -81,6 +81,9 @@ fil: units: "Units" validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/fr.yml b/modules/reporting/config/locales/crowdin/fr.yml index 94120ba3e353..29dcd8556337 100644 --- a/modules/reporting/config/locales/crowdin/fr.yml +++ b/modules/reporting/config/locales/crowdin/fr.yml @@ -81,6 +81,9 @@ fr: units: "Unités" validation_failure_date: "n'est pas une date valide" validation_failure_integer: "n'est pas un nombre entier valide" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Colonnes sélectionnées" diff --git a/modules/reporting/config/locales/crowdin/he.yml b/modules/reporting/config/locales/crowdin/he.yml index 3ef5ff0b48fe..734983b3e8fb 100644 --- a/modules/reporting/config/locales/crowdin/he.yml +++ b/modules/reporting/config/locales/crowdin/he.yml @@ -81,6 +81,9 @@ he: units: "יחידות" validation_failure_date: "אינו תאריך בר תוקף" validation_failure_integer: "אינו מספר שלם חוקי" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/hi.yml b/modules/reporting/config/locales/crowdin/hi.yml index 3c8d0858cc2f..05f5eb836873 100644 --- a/modules/reporting/config/locales/crowdin/hi.yml +++ b/modules/reporting/config/locales/crowdin/hi.yml @@ -81,6 +81,9 @@ hi: units: "Units" validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/hr.yml b/modules/reporting/config/locales/crowdin/hr.yml index 379aba0806e5..089b514ca94f 100644 --- a/modules/reporting/config/locales/crowdin/hr.yml +++ b/modules/reporting/config/locales/crowdin/hr.yml @@ -81,6 +81,9 @@ hr: units: "Jedinice" validation_failure_date: "nije valjan datum" validation_failure_integer: "nije valjan cijeli broj" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/hu.yml b/modules/reporting/config/locales/crowdin/hu.yml index c81fba4750ba..efe06a79d11a 100644 --- a/modules/reporting/config/locales/crowdin/hu.yml +++ b/modules/reporting/config/locales/crowdin/hu.yml @@ -81,6 +81,9 @@ hu: units: "Egységek" validation_failure_date: "nem érvényes dátum" validation_failure_integer: "nem érvényes egész szám" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "A kijelölt oszlopok" diff --git a/modules/reporting/config/locales/crowdin/id.yml b/modules/reporting/config/locales/crowdin/id.yml index f09816c947b7..97cbe8251d54 100644 --- a/modules/reporting/config/locales/crowdin/id.yml +++ b/modules/reporting/config/locales/crowdin/id.yml @@ -81,6 +81,9 @@ id: units: "Unit" validation_failure_date: "validasi tanggal gagal" validation_failure_integer: "validasi bilangan bulat gagal" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Kolom terpilih" diff --git a/modules/reporting/config/locales/crowdin/it.yml b/modules/reporting/config/locales/crowdin/it.yml index f93921339ccd..99543dd4b367 100644 --- a/modules/reporting/config/locales/crowdin/it.yml +++ b/modules/reporting/config/locales/crowdin/it.yml @@ -81,6 +81,9 @@ it: units: "Unità di misura" validation_failure_date: "non è una data valida" validation_failure_integer: "non è un numero intero valido" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Colonne selezionate" diff --git a/modules/reporting/config/locales/crowdin/ja.yml b/modules/reporting/config/locales/crowdin/ja.yml index aa6512950916..fe5f4dc64b59 100644 --- a/modules/reporting/config/locales/crowdin/ja.yml +++ b/modules/reporting/config/locales/crowdin/ja.yml @@ -81,6 +81,9 @@ ja: units: "単位" validation_failure_date: "は有効な日付ではありません。" validation_failure_integer: "は有効な整数ではありません。" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "選択された列" diff --git a/modules/reporting/config/locales/crowdin/ka.yml b/modules/reporting/config/locales/crowdin/ka.yml index fa02b2e2f757..2979a81d554b 100644 --- a/modules/reporting/config/locales/crowdin/ka.yml +++ b/modules/reporting/config/locales/crowdin/ka.yml @@ -81,6 +81,9 @@ ka: units: "Units" validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/ko.yml b/modules/reporting/config/locales/crowdin/ko.yml index eabae6ef10a2..7c9dde7708d4 100644 --- a/modules/reporting/config/locales/crowdin/ko.yml +++ b/modules/reporting/config/locales/crowdin/ko.yml @@ -81,6 +81,9 @@ ko: units: "단위" validation_failure_date: "은(는) 유효한 날짜가 아닙니다." validation_failure_integer: "은(는) 유효한 정수가 아닙니다." + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "선택된 열" diff --git a/modules/reporting/config/locales/crowdin/lol.yml b/modules/reporting/config/locales/crowdin/lol.yml index ffe66a0bfb9f..b699ad4a55c3 100644 --- a/modules/reporting/config/locales/crowdin/lol.yml +++ b/modules/reporting/config/locales/crowdin/lol.yml @@ -81,6 +81,9 @@ lol: units: "crwdns547095:0crwdne547095:0" validation_failure_date: "crwdns547097:0crwdne547097:0" validation_failure_integer: "crwdns547099:0crwdne547099:0" + export: + cost_reports: + title: "crwdns859141:0crwdne859141:0" reporting: group_by: selected_columns: "crwdns547101:0crwdne547101:0" diff --git a/modules/reporting/config/locales/crowdin/lt.yml b/modules/reporting/config/locales/crowdin/lt.yml index 77f7616e5cb6..1756cae23ed6 100644 --- a/modules/reporting/config/locales/crowdin/lt.yml +++ b/modules/reporting/config/locales/crowdin/lt.yml @@ -81,6 +81,9 @@ lt: units: "Vienetai" validation_failure_date: "nėra tinkama data" validation_failure_integer: "nėra tinkamas sveikas skaičius" + export: + cost_reports: + title: "Jūsų kainos ataskaitų XLS eksportas" reporting: group_by: selected_columns: "Pasirinkti stulpeliai" diff --git a/modules/reporting/config/locales/crowdin/lv.yml b/modules/reporting/config/locales/crowdin/lv.yml index 26b880686494..bcca57b35b69 100644 --- a/modules/reporting/config/locales/crowdin/lv.yml +++ b/modules/reporting/config/locales/crowdin/lv.yml @@ -81,6 +81,9 @@ lv: units: "Units" validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/mn.yml b/modules/reporting/config/locales/crowdin/mn.yml index ff837e06611e..28c4b8653f7f 100644 --- a/modules/reporting/config/locales/crowdin/mn.yml +++ b/modules/reporting/config/locales/crowdin/mn.yml @@ -81,6 +81,9 @@ mn: units: "Units" validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/ne.yml b/modules/reporting/config/locales/crowdin/ne.yml index 321bab0ccb6a..dff5fbbd9521 100644 --- a/modules/reporting/config/locales/crowdin/ne.yml +++ b/modules/reporting/config/locales/crowdin/ne.yml @@ -81,6 +81,9 @@ ne: units: "Units" validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/nl.yml b/modules/reporting/config/locales/crowdin/nl.yml index 7bc4059b7842..d02f447e1a7e 100644 --- a/modules/reporting/config/locales/crowdin/nl.yml +++ b/modules/reporting/config/locales/crowdin/nl.yml @@ -81,6 +81,9 @@ nl: units: "Eenheden" validation_failure_date: "is geen geldige datum" validation_failure_integer: "is geen geldig geheel getal" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Geselecteerde kolommen" diff --git a/modules/reporting/config/locales/crowdin/no.yml b/modules/reporting/config/locales/crowdin/no.yml index 49146627b1d5..789f6673d149 100644 --- a/modules/reporting/config/locales/crowdin/no.yml +++ b/modules/reporting/config/locales/crowdin/no.yml @@ -81,6 +81,9 @@ units: "Enheter" validation_failure_date: "er ikke en gyldig dato" validation_failure_integer: "er ikke et gyldig heltall" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Valgte kolonner" diff --git a/modules/reporting/config/locales/crowdin/pl.yml b/modules/reporting/config/locales/crowdin/pl.yml index 7d6cfd0d7995..f8428c1f6eb4 100644 --- a/modules/reporting/config/locales/crowdin/pl.yml +++ b/modules/reporting/config/locales/crowdin/pl.yml @@ -81,6 +81,9 @@ pl: units: "Jednostki" validation_failure_date: "nie jest poprawną datą" validation_failure_integer: "nie jest prawidłową liczbą całkowitą" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Wybrane kolumny" diff --git a/modules/reporting/config/locales/crowdin/pt.yml b/modules/reporting/config/locales/crowdin/pt.yml index 00fc076cb013..a6caf4a34b43 100644 --- a/modules/reporting/config/locales/crowdin/pt.yml +++ b/modules/reporting/config/locales/crowdin/pt.yml @@ -81,6 +81,9 @@ pt: units: "Unidades" validation_failure_date: "não é uma data válida" validation_failure_integer: "não é um valor inteiro válido" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Colunas selecionadas" diff --git a/modules/reporting/config/locales/crowdin/ro.yml b/modules/reporting/config/locales/crowdin/ro.yml index dfd54f869702..5d71aa6ebdf8 100644 --- a/modules/reporting/config/locales/crowdin/ro.yml +++ b/modules/reporting/config/locales/crowdin/ro.yml @@ -81,6 +81,9 @@ ro: units: "Unități" validation_failure_date: "nu e o dată validă" validation_failure_integer: "nu e un întreg valid" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Coloane selectate" diff --git a/modules/reporting/config/locales/crowdin/ru.yml b/modules/reporting/config/locales/crowdin/ru.yml index 6b3c3b575fc7..e88012c588d7 100644 --- a/modules/reporting/config/locales/crowdin/ru.yml +++ b/modules/reporting/config/locales/crowdin/ru.yml @@ -81,6 +81,9 @@ ru: units: "Модули" validation_failure_date: "не является допустимой датой" validation_failure_integer: "не является допустимым целым числом" + export: + cost_reports: + title: "Экспорт ваших отчетов о затратах в XLS" reporting: group_by: selected_columns: "Выбранные столбцы" diff --git a/modules/reporting/config/locales/crowdin/rw.yml b/modules/reporting/config/locales/crowdin/rw.yml index 4533b109bf75..b193a3340c0e 100644 --- a/modules/reporting/config/locales/crowdin/rw.yml +++ b/modules/reporting/config/locales/crowdin/rw.yml @@ -81,6 +81,9 @@ rw: units: "Units" validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/si.yml b/modules/reporting/config/locales/crowdin/si.yml index e06fedf6110f..46e03f8d87d4 100644 --- a/modules/reporting/config/locales/crowdin/si.yml +++ b/modules/reporting/config/locales/crowdin/si.yml @@ -81,6 +81,9 @@ si: units: "Units" validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/sk.yml b/modules/reporting/config/locales/crowdin/sk.yml index ba356636540a..c1d101c1f0bf 100644 --- a/modules/reporting/config/locales/crowdin/sk.yml +++ b/modules/reporting/config/locales/crowdin/sk.yml @@ -81,6 +81,9 @@ sk: units: "Jednotky" validation_failure_date: "nie je platný dátum" validation_failure_integer: "nie je platné celé číslo" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Vybrané stĺpce" diff --git a/modules/reporting/config/locales/crowdin/sl.yml b/modules/reporting/config/locales/crowdin/sl.yml index cb041440b37a..430c8fb86ee2 100644 --- a/modules/reporting/config/locales/crowdin/sl.yml +++ b/modules/reporting/config/locales/crowdin/sl.yml @@ -81,6 +81,9 @@ sl: units: "Enote" validation_failure_date: "ni veljaven datum" validation_failure_integer: "ni veljavno število" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Izbrani stolpci" diff --git a/modules/reporting/config/locales/crowdin/sr.yml b/modules/reporting/config/locales/crowdin/sr.yml index 4bd43d6d5db7..a383352a85ac 100644 --- a/modules/reporting/config/locales/crowdin/sr.yml +++ b/modules/reporting/config/locales/crowdin/sr.yml @@ -81,6 +81,9 @@ sr: units: "Units" validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/sv.yml b/modules/reporting/config/locales/crowdin/sv.yml index 7319fc1c03ad..f7d5b6b49297 100644 --- a/modules/reporting/config/locales/crowdin/sv.yml +++ b/modules/reporting/config/locales/crowdin/sv.yml @@ -81,6 +81,9 @@ sv: units: "Enheter" validation_failure_date: "inte är ett giltigt datum" validation_failure_integer: "är inte ett giltigt heltal" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Valda kolumner" diff --git a/modules/reporting/config/locales/crowdin/th.yml b/modules/reporting/config/locales/crowdin/th.yml index c6c98825be98..d15d3a6d5c61 100644 --- a/modules/reporting/config/locales/crowdin/th.yml +++ b/modules/reporting/config/locales/crowdin/th.yml @@ -81,6 +81,9 @@ th: units: "Units" validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/tr.yml b/modules/reporting/config/locales/crowdin/tr.yml index 550173683d5e..5e8914746731 100644 --- a/modules/reporting/config/locales/crowdin/tr.yml +++ b/modules/reporting/config/locales/crowdin/tr.yml @@ -81,6 +81,9 @@ tr: units: "Birimler" validation_failure_date: "geçerli bir tarih değil" validation_failure_integer: "geçerli bir tamsayı değil" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Seçilen sütunlar" diff --git a/modules/reporting/config/locales/crowdin/uk.yml b/modules/reporting/config/locales/crowdin/uk.yml index 72bbc606d736..494245621b2e 100644 --- a/modules/reporting/config/locales/crowdin/uk.yml +++ b/modules/reporting/config/locales/crowdin/uk.yml @@ -81,6 +81,9 @@ uk: units: "Одиниці" validation_failure_date: "є недійсною датою" validation_failure_integer: "не є дійсним цілим числом" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Вибрані стовпці" diff --git a/modules/reporting/config/locales/crowdin/vi.yml b/modules/reporting/config/locales/crowdin/vi.yml index 71df19b1a5d1..37e466b28b30 100644 --- a/modules/reporting/config/locales/crowdin/vi.yml +++ b/modules/reporting/config/locales/crowdin/vi.yml @@ -81,6 +81,9 @@ vi: units: "Units" validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/reporting/config/locales/crowdin/zh-TW.yml b/modules/reporting/config/locales/crowdin/zh-TW.yml index 022791238538..0c595b087156 100644 --- a/modules/reporting/config/locales/crowdin/zh-TW.yml +++ b/modules/reporting/config/locales/crowdin/zh-TW.yml @@ -81,6 +81,9 @@ zh-TW: units: "單位" validation_failure_date: "不是一個有效日期" validation_failure_integer: "不是一個有效的整數" + export: + cost_reports: + title: "Your Cost Reports XLS export" reporting: group_by: selected_columns: "選擇列" diff --git a/modules/reporting/config/locales/en.yml b/modules/reporting/config/locales/en.yml index 62e391dbe0be..a59d5d0826de 100644 --- a/modules/reporting/config/locales/en.yml +++ b/modules/reporting/config/locales/en.yml @@ -99,6 +99,10 @@ en: validation_failure_date: "is not a valid date" validation_failure_integer: "is not a valid integer" + export: + cost_reports: + title: "Your Cost Reports XLS export" + reporting: group_by: selected_columns: "Selected columns" diff --git a/modules/xls_export/lib/open_project/xls_export/xls_views/cost_entry_table.rb b/modules/reporting/lib/open_project/reporting/cost_entry_xls_table.rb similarity index 96% rename from modules/xls_export/lib/open_project/xls_export/xls_views/cost_entry_table.rb rename to modules/reporting/lib/open_project/reporting/cost_entry_xls_table.rb index 1b80420e5e94..11851766e81f 100644 --- a/modules/xls_export/lib/open_project/xls_export/xls_views/cost_entry_table.rb +++ b/modules/reporting/lib/open_project/reporting/cost_entry_xls_table.rb @@ -1,4 +1,4 @@ -class OpenProject::XlsExport::XlsViews::CostEntryTable < OpenProject::XlsExport::XlsViews +class OpenProject::Reporting::CostEntryXlsTable < OpenProject::XlsExport::XlsViews def generate @spreadsheet = OpenProject::XlsExport::SpreadsheetBuilder.new(I18n.t(:label_money)) default_query = serialize_query_without_hidden(@query) diff --git a/modules/reporting/spec/features/export_cost_report_spec.rb b/modules/reporting/spec/features/export_cost_report_spec.rb new file mode 100644 index 000000000000..49d38d7a363b --- /dev/null +++ b/modules/reporting/spec/features/export_cost_report_spec.rb @@ -0,0 +1,76 @@ +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) 2012-2023 the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require_relative '../spec_helper' +require_relative 'support/pages/cost_report_page' + +describe "Cost reports XLS export", js: true do + shared_let(:project) { create(:project) } + shared_let(:user) { create(:admin) } + shared_let(:cost_type) { create(:cost_type, name: 'Post-war', unit: 'cap', unit_plural: 'caps') } + shared_let(:work_package) { create(:work_package, project:, subject: 'Some task') } + shared_let(:cost_entry) { create(:cost_entry, user:, work_package:, project:, cost_type:) } + let(:report_page) { Pages::CostReportPage.new project } + let(:sheet) { @download_list.refresh_from(page).latest_downloaded_content } # rubocop:disable RSpec/InstanceVariable + + subject do + io = StringIO.new sheet + Spreadsheet.open(io).worksheets.first + end + + before do + @download_list = DownloadList.new + login_as(user) + end + + after do + DownloadList.clear + end + + it 'can download and open the XLS' do + report_page.visit! + click_on 'Export XLS' + + expect(page).to have_content I18n.t('js.job_status.generic_messages.in_queue'), + wait: 10 + perform_enqueued_jobs + + expect(page).to have_text("The export has completed successfully") + + title, _, entry, = subject.rows + expect(title.first).to include("Cost reports (#{Time.zone.today.strftime('%m/%d/%Y')})") + date, user_ref, _, wp_ref, _, project_ref, costs, type, = entry + + expect(date).to eq(Time.zone.today.iso8601) + expect(user_ref).to eq(user.name) + expect(wp_ref).to include 'Some task' + expect(project_ref).to eq project.name + expect(costs).to eq 1.0 + expect(type).to eq 'Post-war' + end +end diff --git a/modules/storages/config/locales/crowdin/cs.yml b/modules/storages/config/locales/crowdin/cs.yml index 72c1bc19696f..cf170a29f03d 100644 --- a/modules/storages/config/locales/crowdin/cs.yml +++ b/modules/storages/config/locales/crowdin/cs.yml @@ -51,7 +51,7 @@ cs: type_link_text: "„Integration OpenProject“" name: "Dejte svému úložišti jméno, aby uživatelé mohli rozlišovat mezi více úložišti." host: "Přidejte prosím adresu hostitele vašeho úložiště obsahující https://. Nemělo by být delší než 255 znaků." - no_storage_set_up: "There are no file storages set up yet." + no_storage_set_up: "Dosud nejsou nastaveny žádné úložiště souborů." setting_up_additional_storages: "Pro nastavení dalších úložišť souborů navštivte prosím" setting_up_additional_storages_non_admin: "Administrátoři mohou nastavit další úložiště souborů v administraci / Úložiště souborů." setting_up_storages: "Pro nastavení úložišť souborů navštivte prosím" diff --git a/modules/storages/config/locales/crowdin/js-cs.yml b/modules/storages/config/locales/crowdin/js-cs.yml index 60a625e4b9bd..c8533af20269 100644 --- a/modules/storages/config/locales/crowdin/js-cs.yml +++ b/modules/storages/config/locales/crowdin/js-cs.yml @@ -3,7 +3,7 @@ cs: js: storages: link_files_in_storage: "Prolinkovat soubory v" - link_existing_files: "Link existing files" + link_existing_files: "Odkaz na existující soubory" upload_files: "Nahrát soubory" drop_files: "Přetáhněte soubory pro jejich nahrání na %{name}." drop_or_click_files: "Drop files here or click to upload them to %{name}." diff --git a/modules/storages/config/locales/crowdin/js-lt.yml b/modules/storages/config/locales/crowdin/js-lt.yml index 0a865f2cf79e..c4953a801c2d 100644 --- a/modules/storages/config/locales/crowdin/js-lt.yml +++ b/modules/storages/config/locales/crowdin/js-lt.yml @@ -2,74 +2,74 @@ lt: js: storages: - link_files_in_storage: "Link files in %{storageType}" - link_existing_files: "Link existing files" - upload_files: "Upload files" - drop_files: "Drop files here to upload them to %{name}." - drop_or_click_files: "Drop files here or click to upload them to %{name}." - login: "%{storageType} login" - login_to: "Login to %{storageType}" - no_connection: "No %{storageType} connection" - open_storage: "Open %{storageType}" - select_location: "Select location" - choose_location: "Choose location" + link_files_in_storage: "Susieti failus %{storageType}" + link_existing_files: "Susieti esamus failus" + upload_files: "Įkelti failus" + drop_files: "Įkelkite failus čia, norėdami įkelti juos į %{name}." + drop_or_click_files: "Įkelkite failus čia arba spauskite pele, norėdami įkelti juos į %{name}." + login: "%{storageType} prisijungimas" + login_to: "Prisijungti prie %{storageType}" + no_connection: "Nėra %{storageType} jungties" + open_storage: "Atverti %{storageType}" + select_location: "Pažymėti vietą" + choose_location: "Parinkite vietą" types: nextcloud: "Nextcloud" information: connection_error: > - Some %{storageType} settings are not working. Please contact your %{storageType} administrator. - live_data_error: "Error fetching file details" + Kai kurie %{storageType} nustatymai neveikia. Prašome susisiekti su jūsų %{storageType} administratoriumi. + live_data_error: "Klaida ištraukiant failo detales" live_data_error_description: > - Some %{storageType} data could not be fetched. Please try to reload this page or contact your %{storageType} administrator. - no_file_links: "In order to link files to this work package please do it via %{storageType}." + Dalies %{storageType} duomenų nepavyko ištraukti. Prašome pabandyti iš naujo įkelti šį puslapį arba susisiekti su jūsų %{storageType} administratoriumi. + no_file_links: "Norėdami susieti failus su šiuo darbo paketu, prašome daryti tai per %{storageType}." not_logged_in: > - To add a link, see or upload files related to this work package, please login to %{storageType}. + Norėdami pridėti nuorodą, žiūrėti ar įkelkiti failus, susijusius su šiuo darbo paketu, prašome prisijungti prie %{storageType}. files: - already_existing_header: "This file already exists" + already_existing_header: "Toks failas jau yra" already_existing_body: > - A file with the name "%{fileName}" already exists in the location where you are trying to upload this file. What would you like to do? - directory_not_writeable: "You do not have permission to add files to this folder." - dragging_many_files: "The upload to %{storageType} supports only one file at once." - empty_folder: "This folder is empty." - empty_folder_location_hint: "Click the button below to upload the file to this location." - file_not_selectable_location: "Selecting a file is not possible in the process of choosing a location." - upload_keep_both: "Keep both" + Failas pavadinimu „%{fileName}“ jau yra vietoje, į kurią bandote jį įkelti. Ką norėtumėte padaryti? + directory_not_writeable: "Jūs neturite teisių pridėti failų į šį aplanką." + dragging_many_files: "Įkėlimas į %{storageType} galimas tik po vieną failą vienu metu." + empty_folder: "Šis aplankas yra tuščias." + empty_folder_location_hint: "Spauskite mygtuką žemiau, jei norite įkelti failą į šią vietą." + file_not_selectable_location: "Vietos pasirinkimo metu negalima parinkti failo." + upload_keep_both: "Pasilikti abu" upload_replace: "Pakeisti" file_links: empty: > - Currently there are no linked files to this work package. Start linking files with the action below or from within %{storageType}. - download: "Download %{fileName}" - no_permission: "You have no permission to see this file." - open: "Open file on storage" - open_location: "Open file in location" - remove: "Remove file link" + Šio metu nėra failų, susietų su šiuo darbo paketu. Pradėkite susieti failus naudodami veiksmą apačioje arba iš %{storageType}. + download: "Atsisiųsti %{fileName}" + no_permission: "Jūs neturite teisės žiūrėti šį failą." + open: "Atverti failą saugykloje" + open_location: "Atverti failą vietoje" + remove: "Pašalinti nuorodą" remove_confirmation: > - Are you sure you want to unlink the file from this work package? Unlinking does not affect the original file and only removes the connection to this work package. - remove_short: "Remove link" - select: "Select files" + Ar tikrai norite atsieti failą nuo šio darbo paketo? Atsiejimas neįtakoja originalaus failo, tik pašalina jungtį su dabartiniu darbo paketu. + remove_short: "Pašalinti nuorodą" + select: "Pasirinkite failus" select_all: "Pasirinkti viską" selection: zero: "Pasirinkite failus susiejimui" - one: "Link 1 file" - few: "Link %{count} files" - many: "Link %{count} files" - other: "Link %{count} files" + one: "Susieti 1 failą" + few: "Susieti %{count} failus" + many: "Susieti %{count} failų" + other: "Susieti %{count} failus" success_create: - one: "Successfully created 1 file link." - few: "Successfully created %{count} file links." - many: "Successfully created %{count} file links." - other: "Successfully created %{count} file links." + one: "Sėkmingai sukurta 1 failo nuoroda" + few: "Sėkmingai sukurtos %{count} failų nuorodos." + many: "Sėkmingai sukurta %{count} failų nuorodų." + other: "Sėkmingai sukurtos %{count} failų nuorodos." upload_error: default: > - Your file (%{fileName}) could not be uploaded. Please check that the latest version of the Nextcloud App "OpenProject Integration" is installed and contact your administrator for more information. + Jūsų failo (%{fileName}) nepavyko įkelti. Prašome patikrinti, kad įdiegta paskutinė Nextcloud aplikacijos „OpenProject Integration“ versija ir susisiekti su jūsų administratoriumi, kad gautumėte daugiau informacijos. 403: > - Your file (%{fileName}) could not be uploaded due to system restrictions. Please contact your administrator for more information. + Jūsų failas (%{fileName}) negalėjo būti įkeltas dėl sistemos apribojimų. Prašome susiekti su jūsų administratoriumi, kad gautumėte daugiau informacijos. 413: > - Your file (%{fileName}) is bigger than what OpenProject can upload to %{storageType}. You can upload it directly to %{storageType} first and then link the file. + Jūsų failas (%{fileName}) per didelis, kad OpenProject galėtų įkelti jį į %{storageType}. Jūs galite įkelti tiesiai į %{storageType} ir tada susieti failą. 507: > - Your file (%{fileName}) is bigger than the storage quota allows. Contact your administrator to modify this quota. + Jūsų failas (%{fileName}) yra didesnis nei leidžia saugyklos apribojimai. Susisiekite su jūsų administratoriumi, kad padidintumėte šį apribojimą. link_uploaded_file_error: > - An error occurred linking the recently uploaded file '%{fileName}' to the work package %{workPackageId}. - not_allowed_tooltip: "Please log in to Nextcloud to access this file" - already_linked_file: "This file is already linked to this work package." - already_linked_directory: "This directory is already linked to this work package." + Susiejant neseniai įkeltą failą „%{fileName}“ su darbo paketu %{workPackageId} įvyko klaida. + not_allowed_tooltip: "Prašome prisijungti prie Nextcloud, kad pasiektumėte failą" + already_linked_file: "Šis failas jau susietas su šiuo darbo paketu." + already_linked_directory: "Šis aplankas jau susietas su šiuo darbo paketu." diff --git a/modules/storages/config/locales/crowdin/js-no.yml b/modules/storages/config/locales/crowdin/js-no.yml index 6d1a9d170fee..47ed472a3851 100644 --- a/modules/storages/config/locales/crowdin/js-no.yml +++ b/modules/storages/config/locales/crowdin/js-no.yml @@ -47,7 +47,7 @@ Are you sure you want to unlink the file from this work package? Unlinking does not affect the original file and only removes the connection to this work package. remove_short: "Remove link" select: "Select files" - select_all: "Select all" + select_all: "Velg alle" selection: zero: "Select files to link" one: "Link 1 file" diff --git a/modules/storages/config/locales/crowdin/lt.yml b/modules/storages/config/locales/crowdin/lt.yml index 8cfc7c930850..97e9298fa118 100644 --- a/modules/storages/config/locales/crowdin/lt.yml +++ b/modules/storages/config/locales/crowdin/lt.yml @@ -25,9 +25,9 @@ lt: minimal_nextcloud_version_unmet: "neatitinka minimalių versijos reikalavimų (turi būti Nextcloud 23 ar aukštesnis)" not_nextcloud_server: "nėra Nextcloud serveris" op_application_not_installed: > - appears to not have the app "OpenProject integration" installed. Please install it first and then try again. + panašu neturi įdiegtos „OpenProject integracijos“ aplikacijos. Prašome ją įdiegti ir bandyti dar kartą. authorization_header_missing: > - is not fully set up. The Nextcloud instance does not receive the "Authorization" header, which is necessary for a Bearer token based authorization of API requests. Please double check your HTTP server configuration. + nėra pilnai nustatytas. Nextcloud egzempliorius negauna „Autorizacijos“ antraštės, kuri būtina Turėtojo žetonu paremtoms autorizacijos API užklausoms. Prašome patikrinti jūsų HTTP serverio konfigūraciją. storages/file_link: attributes: origin_id: @@ -37,29 +37,29 @@ lt: too_many_elements_created_at_once: "Per daug elementu vienu metu. Tikėtasi daugiausia %{max}, gauta %{actual}." storages: buttons: - done_continue_setup: "Done. Continue setup" - replace_openproject_oauth: "Replace OpenProject OAuth" - replace_provider_type_oauth: "Replace %{provider_type} OAuth" - save_and_continue_setup: "Save and continue setup" - save_and_complete_setup: "Save and complete setup" + done_continue_setup: "Atlikta. Tęsti nustatymą" + replace_openproject_oauth: "Keisti OpenProject OAuth" + replace_provider_type_oauth: "Keisti %{provider_type} OAuth" + save_and_continue_setup: "Įrašyti r tęsti nustatymą" + save_and_complete_setup: "Įrašyti ir baigti nustatymą" page_titles: project_settings: index: "Šiame projekte prieinamos failų saugyklos." - new: "Add a file storage to this project" + new: "Pridėti failų saugyklą šiam projektui" instructions: - type: "Please make sure you have administration privileges in your Nextcloud instance and have the following application installed before doing the setup:" - type_link_text: "“Integration OpenProject”" - name: "Give your storage a name so that users can differentiate between multiple storages." - host: "Please add the host address of your storage including the https://. It should not be longer than 255 characters." - no_storage_set_up: "There are no file storages set up yet." + type: "Prašome įsitikinti, kad turite administratoriaus teises jūsų Nextcloud egzemplioriuje bei kad įdiegtos šios aplikacijos, prieš tęsiant nustatymą:" + type_link_text: "„Integration OpenProject“" + name: "Suteikite jūsų saugyklai pavadinimą, kad naudotojai galėtų atskirti tarp skirtingų saugyklų." + host: "Prašome pridėti jūsų saugyklos stoties adresą, įskaitant https://. Jis turi būti ne ilgesnis už 255 simbolius." + no_storage_set_up: "Dar nėra nustatyta nei viena failų saugykla." setting_up_additional_storages: "Norėdami sukurti papildomas failų saugyklas, prašome aplankyti" setting_up_additional_storages_non_admin: "Administratoriai gali sukurti papildomas failų saugyklas: Administravimas / Failų saugyklos." setting_up_storages: "Norėdami nustatyti failų saugyklas aplankykite" setting_up_storages_non_admin: "Administratoriai gali nustatyti failų saugyklas: Administravimas / Failų saugyklos" all_available_storages_already_added: "Visos galimos failų saugyklos jau pridėtos į projektą." - copy_from: "Copy this value from" + copy_from: "Kopijuoti reikšmę iš" nextcloud: - integration: "Nextcloud Administration / OpenProject" + integration: "Nextclout Administravimas / OpenProject" delete_warning: storage: > Ar tikrai norite ištrinti šią failų saugyklą? Saugykla taipogi bus ištrinta iš visų projektų, kur ji naudojama. Taipogi tai ištrins visus ryšius iš darbo paketų į failus, esančius šioje saugykloje. @@ -69,24 +69,24 @@ lt: label_file_link: "Failo nuoroda" label_file_links: "Failo nuorodos" label_name: "Pavadinimas" - label_host: "Host URL" + label_host: "Stoties URL" label_oauth_breadcrumb: openproject: "OpenProject OAuth" nextcloud: "Nextcloud OAuth" - label_oauth_application_details: "OAuth application details" - label_oauth_client_details: "OAuth client details" + label_oauth_application_details: "OAuth aplikacijos detalės" + label_oauth_client_details: "OAuth kliento detalės" label_provider_type: "Tiekėjo tipas" label_new_storage: "Nauja saugykla" label_storage: "Saugykla" label_storages: "Saugyklos" - no_results: "No storages set up yet." + no_results: "Dar nenustatyta jokia saugykla." provider_types: label: "Tiekėjo tipas" nextcloud: name: "Nextcloud" - name_placeholder: "e.g. Nextcloud" - default_name: "My Nextcloud" - confirm_replace_oauth_application: "Are you sure? All users will have to authorize again against OpenProject." - confirm_replace_oauth_client: "Are you sure? All users will have to authorize again against the storage." - oauth_client_details_missing: "To complete the setup, please add OAuth client credentials from your storage." - notice_oauth_application_replaced: "The OpenProject OAuth application was successfully replaced." + name_placeholder: "pvz. Nextcloud" + default_name: "Mano Nextcloud" + confirm_replace_oauth_application: "Ar jūs įsitikinę? Visi naudotojai turės iš naujo autorizuotis su OpenProject." + confirm_replace_oauth_client: "Ar jūs įsitikinę? Visi naudotojai turės iš naujo autorizuotis su saugykla." + oauth_client_details_missing: "Norėdami baigti nustatymą, prašome pridėti OAuth kliento prisijungimo duomenis iš jūsų saugyklos." + notice_oauth_application_replaced: "OpenProject OAuth aplikacija buvo sėkmingai pakeista." diff --git a/modules/team_planner/config/locales/crowdin/js-nl.yml b/modules/team_planner/config/locales/crowdin/js-nl.yml index 6196aac9d8d4..cd415ca5f839 100644 --- a/modules/team_planner/config/locales/crowdin/js-nl.yml +++ b/modules/team_planner/config/locales/crowdin/js-nl.yml @@ -12,7 +12,7 @@ nl: remove_assignee: 'Verwijder verantwoordelijke' two_weeks: '2-week' one_week: '1-week' - work_week: 'Work week' + work_week: 'Werkweek' today: 'Vandaag' drag_here_to_remove: 'Sleep hierheen om taakontvanger en start- en einddata te verwijderen.' cannot_drag_here: 'Kan het werkpakket niet verwijderen vanwege machtigingen of bewerkingsbeperkingen.' diff --git a/modules/webhooks/config/locales/crowdin/id.yml b/modules/webhooks/config/locales/crowdin/id.yml index 8d3f9f707db3..61b2c5c0dfc7 100644 --- a/modules/webhooks/config/locales/crowdin/id.yml +++ b/modules/webhooks/config/locales/crowdin/id.yml @@ -2,62 +2,62 @@ id: activerecord: attributes: webhooks/webhook: - url: 'Payload URL' - secret: 'Signature secret' - events: 'Events' + url: 'URL muatan' + secret: 'Rahasia tanda tangan' + events: 'Acara' projects: 'Proyek-proyek yang diaktifkan' webhooks/log: - event_name: 'Event name' - url: 'Payload URL' - response_code: 'Response code' - response_body: 'Response' + event_name: 'Nama acara' + url: 'URL muatan' + response_code: 'Kode respon' + response_body: 'Tanggapan' models: - webhooks/outgoing_webhook: "Outgoing webhook" + webhooks/outgoing_webhook: "Webhook keluar" webhooks: singular: Webhook - plural: Webhooks + plural: Webhook resources: time_entry: - name: "Time entry" + name: "Entri waktu" outgoing: - no_results_table: No webhooks have been defined yet. - label_add_new: Add new webhook - label_edit: Edit webhook - label_event_resources: Event resources + no_results_table: Belum ada webhook yang ditentukan. + label_add_new: Tambahkan webhook baru + label_edit: Ubah webhook + label_event_resources: Sumber acara events: created: "Dibuat" - updated: "Updated" + updated: "Diperbarui" explanation: text: > - Upon the occurrence of an event like the creation of a work package or an update on a project, OpenProject will send a POST request to the configured web endpoints. Oftentimes, the event is sent after the %{link} has passed. - link: configured aggregation period + Setelah kejadian seperti pembuatan paket kerja atau pembaruan proyek, OpenProject akan mengirimkan permintaan POST ke titik akhir web yang dikonfigurasi. Sering kali, acara dikirim setelah %{link} lewat. + link: periode agregasi yang dikonfigurasi status: - enabled: 'Webhook is enabled' - disabled: 'Webhook is disabled' - enabled_text: 'The webhook will emit payloads for the defined events below.' - disabled_text: 'Click the edit button to activate the webhook.' + enabled: 'Webhook diaktifkan' + disabled: 'Webhook dinonaktifkan' + enabled_text: 'Webhook akan mengeluarkan payload untuk peristiwa yang ditentukan di bawah.' + disabled_text: 'Klik tombol ubah untuk mengaktifkan webhook.' deliveries: - no_results_table: No deliveries have been made for this webhook in the past days. - title: 'Recent deliveries' - time: 'Delivery time' + no_results_table: Tidak ada pengiriman yang dilakukan untuk webhook ini dalam beberapa hari terakhir. + title: 'Pengiriman terbaru' + time: 'Waktu pengiriman' form: introduction: > - Send a POST request to the payload URL below for any event in the project you're subscribed to. Payload will correspond to the APIv3 representation of the object being modified. - apiv3_doc_url: For more information, visit the API documentation + Kirim permintaan POST ke URL payload di bawah ini untuk acara apa pun dalam proyek langganan Anda. Muatan akan sesuai dengan representasi APIv3 dari objek yang sedang dimodifikasi. + apiv3_doc_url: Untuk informasi lebih lanjut, kunjungi dokumentasi API description: - placeholder: 'Optional description for the webhook.' + placeholder: 'Deskripsi opsional untuk webhook.' enabled: description: > - When checked, the webhook will trigger on the selected events. Uncheck to disable the webhook. + Jika dicentang, webhook akan dipicu pada peristiwa yang dipilih. Hapus centang untuk menonaktifkan webhook. events: - title: 'Enabled events' + title: 'Acara yang diaktifkan' project_ids: title: 'Proyek-proyek yang diaktifkan' - description: 'Select for which projects this webhook should be executed for.' - all: 'All projects' - selected: 'Selected projects only' + description: 'Pilih untuk project mana webhook ini harus dijalankan.' + all: 'Semua proyek' + selected: 'Proyek yang dipilih saja' selected_project_ids: - title: 'Selected projects' + title: 'Proyek terpilih' secret: description: > - If set, this secret value is used by OpenProject to sign the webhook payload. + Jika disetel, nilai rahasia ini digunakan oleh OpenProject untuk menandatangani payload webhook. diff --git a/modules/xls_export/app/views/hooks/xls_report/_view_cost_report_toolbar.html.erb b/modules/xls_export/app/views/hooks/xls_report/_view_cost_report_toolbar.html.erb index 518faed2ebd8..e69de29bb2d1 100644 --- a/modules/xls_export/app/views/hooks/xls_report/_view_cost_report_toolbar.html.erb +++ b/modules/xls_export/app/views/hooks/xls_report/_view_cost_report_toolbar.html.erb @@ -1,10 +0,0 @@ -<% if User.current.allowed_to? :export_work_packages, @project, global: @project.nil? %> - - <%= link_to(t(:export_to_excel), - { controller: "cost_reports" , - action: :index, - format: 'xls', - project_id: @project }, - class: "button icon-export-xls-descr") %> - -<% end %> diff --git a/modules/xls_export/config/locales/crowdin/zh-TW.yml b/modules/xls_export/config/locales/crowdin/zh-TW.yml index 38bb14e9874d..7c671dc8d240 100644 --- a/modules/xls_export/config/locales/crowdin/zh-TW.yml +++ b/modules/xls_export/config/locales/crowdin/zh-TW.yml @@ -1,7 +1,7 @@ zh-TW: export_to_excel: "匯出到 XLS" print_with_description: "預覽列印(帶描述)" - sentence_separator_or: "或者" + sentence_separator_or: "或" different_formats: 不同格式 export: format: diff --git a/modules/xls_export/lib/open_project/xls_export/engine.rb b/modules/xls_export/lib/open_project/xls_export/engine.rb index d63be150d3b6..884d18c94076 100644 --- a/modules/xls_export/lib/open_project/xls_export/engine.rb +++ b/modules/xls_export/lib/open_project/xls_export/engine.rb @@ -8,10 +8,7 @@ class Engine < ::Rails::Engine author_url: 'https://www.openproject.org', bundled: true - patches %i[CostReportsController] - config.to_prepare do - OpenProject::XlsExport::Hooks::CostReportHook OpenProject::XlsExport::Hooks::WorkPackageHook end diff --git a/modules/xls_export/lib/open_project/xls_export/hooks/cost_report_hook.rb b/modules/xls_export/lib/open_project/xls_export/hooks/cost_report_hook.rb deleted file mode 100644 index 7b8508dea468..000000000000 --- a/modules/xls_export/lib/open_project/xls_export/hooks/cost_report_hook.rb +++ /dev/null @@ -1,5 +0,0 @@ -module OpenProject::XlsExport::Hooks - class CostReportHook < OpenProject::Hook::ViewListener - render_on :view_cost_report_toolbar, partial: 'hooks/xls_report/view_cost_report_toolbar' - end -end diff --git a/modules/xls_export/lib/open_project/xls_export/patches/cost_reports_controller_patch.rb b/modules/xls_export/lib/open_project/xls_export/patches/cost_reports_controller_patch.rb deleted file mode 100644 index e7e78d6329a6..000000000000 --- a/modules/xls_export/lib/open_project/xls_export/patches/cost_reports_controller_patch.rb +++ /dev/null @@ -1,45 +0,0 @@ -module OpenProject::XlsExport::Patches - module CostReportsControllerPatch - def self.included(base) # :nodoc: - base.prepend InstanceMethods - end - - module InstanceMethods - def excel_export? - (params["action"] == "index" or params[:action] == "all") && params["format"] == "xls" - end - - def ensure_project_scope? - !excel_export? && super - end - - # If the index action is called, hook the xls format into the cost report - def respond_to - if excel_export? - super do |format| - yield format - format.xls do - report = report_to_xls - time = Time.now.strftime('%d-%m-%Y-T-%H-%M-%S') - send_data(report, type: :xls, filename: "export-#{time}.xls") if report - end - end - else - super - end - end - - # Build an xls file from a cost report. - # We only support extracting a simple xls table, so grouping is ignored. - def report_to_xls - export_query = build_query(filter_params) - - options = { query: export_query, project: @project, cost_types: @cost_types } - - ::OpenProject::XlsExport::XlsViews::CostEntryTable.generate(options).xls - end - end - end -end - -CostReportsController.include OpenProject::XlsExport::Patches::CostReportsControllerPatch diff --git a/modules/xls_export/openproject-xls_export.gemspec b/modules/xls_export/openproject-xls_export.gemspec index 8ae8d44e04e4..bdd739ea5e0a 100644 --- a/modules/xls_export/openproject-xls_export.gemspec +++ b/modules/xls_export/openproject-xls_export.gemspec @@ -4,8 +4,7 @@ Gem::Specification.new do |s| s.authors = "OpenProject GmbH" s.email = "info@openproject.com" s.summary = 'OpenProject XLS Export' - s.description = 'Export issue lists as Excel spreadsheets (.xls). Support for exporting - cost entries and cost reports is not yet migrated to Rails 3 and disabled.' + s.description = 'Export issue lists as Excel spreadsheets (.xls)' s.license = "GPLv3" s.files = Dir["{app,config,db,lib}/**/*"] + %w(CHANGELOG.md README.md) diff --git a/modules/xls_export/spec/patches/cost_reports_controller_patch_spec.rb b/modules/xls_export/spec/patches/cost_reports_controller_patch_spec.rb deleted file mode 100644 index d2b24bbfea46..000000000000 --- a/modules/xls_export/spec/patches/cost_reports_controller_patch_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require 'spec_helper' - -describe 'CostReportsController', "rendering to xls" do - skip 'XlsExport: CostReports support not yet migrated to Rails 3' - - it "responds with the xls if requested in the index" do - skip - render action: :index - expect(response).to be_redirect - end - - it "does not respond with the xls if requested in a detail view" do - skip - render action: :show - expect(response).to be_redirect - end - - it "generates xls from issues" do - skip - end -end diff --git a/spec/controllers/account_controller_spec.rb b/spec/controllers/account_controller_spec.rb index 283433d4d1db..0e03eed4edaa 100644 --- a/spec/controllers/account_controller_spec.rb +++ b/spec/controllers/account_controller_spec.rb @@ -98,6 +98,32 @@ def reset! end end + describe 'GET #internal_login' do + shared_let(:admin) { create(:admin) } + + context 'when direct login enabled', with_config: { omniauth_direct_login_provider: 'some_provider' } do + it 'allows to login internally using a special route' do + get :internal_login + + expect(response).to render_template 'account/login' + end + + it 'allows to post to login' do + post :login, params: { username: admin.login, password: 'adminADMIN!' } + expect(response).to redirect_to '/my/page' + end + end + + context 'when direct login disabled' do + it 'allows to login internally using a special route' do + get :internal_login + + expect(response).to have_http_status(:not_found) + expect(session[:internal_login]).not_to be_present + end + end + end + context 'POST #login' do shared_let(:admin) { create(:admin) } @@ -295,7 +321,7 @@ def reset! let(:user) { build_stubbed(:user, login: 'bob', identity_url: 'saml:foo') } let(:slo_callback) { nil } let(:sso_provider) do - { name: 'saml', single_sign_out_callback: slo_callback } + { name: 'saml', single_sign_out_callback: slo_callback } end before do @@ -456,10 +482,11 @@ def reset! end describe 'POST' do - it 'redirects to some_provider' do - post :login, params: { username: 'foo', password: 'bar' } + shared_let(:admin) { create(:admin) } - expect(response).to redirect_to '/auth/some_provider' + it 'allows to login internally still' do + post :login, params: { username: admin.login, password: 'adminADMIN!' } + expect(response).to redirect_to "/my/page" end end end @@ -795,9 +822,7 @@ def reset! end it 'preserves the back url' do - expect(response).to redirect_to( - '/login?back_url=https%3A%2F%2Fexample.net%2Fsome_back_url' - ) + expect(response).to redirect_to('/login?back_url=https%3A%2F%2Fexample.net%2Fsome_back_url') end it 'calls the user_registered callback' do diff --git a/spec/features/groups/group_memberships_spec.rb b/spec/features/groups/group_memberships_spec.rb index 215c92838162..f68e8fe54e6d 100644 --- a/spec/features/groups/group_memberships_spec.rb +++ b/spec/features/groups/group_memberships_spec.rb @@ -167,5 +167,29 @@ expect(members_page2).not_to have_group 'A-Team' expect(members_page2).not_to have_user 'Hannibal Smith' end + + context 'with an archived project' do + let!(:archived_project) do + create(:project, + name: 'Archived project', + identifier: 'archived_project', + active: false) + end + + let!(:other_project) do + create(:project, + name: 'Other project', + identifier: 'other_project') + end + + it 'can only a add the group to active projects in which the group is not yet a member' do + group_page.visit! + group_page.open_projects_tab! + + target_dropdown = group_page.search_for_project 'project' + expect(target_dropdown).to have_selector(".ng-option", text: 'Other project') + expect(target_dropdown).not_to have_selector(".ng-option", text: 'Archived project') + end + end end end diff --git a/spec/features/projects/projects_custom_fields_spec.rb b/spec/features/projects/projects_custom_fields_spec.rb index e33db0bb3ee5..af9d0f0941b9 100644 --- a/spec/features/projects/projects_custom_fields_spec.rb +++ b/spec/features/projects/projects_custom_fields_spec.rb @@ -275,5 +275,17 @@ cv = project.custom_values.find_by(custom_field_id: custom_field.id).typed_value expect(cv).to eq invisible_user end + + it 'does not show invite user button when there is no project selected' do + visit new_project_path + + name_field.set_value 'My project name' + + find('.op-fieldset--toggle', text: 'ADVANCED SETTINGS').click + + cf_field.expect_visible + cf_field.expect_no_option invisible_user + expect(page).not_to have_selector('.ng-dropdown-footer button', text: 'Invite') + end end end diff --git a/spec/support/pages/groups.rb b/spec/support/pages/groups.rb index 2edd3295bf41..21d4124e5087 100644 --- a/spec/support/pages/groups.rb +++ b/spec/support/pages/groups.rb @@ -106,6 +106,13 @@ def remove_from_project!(name) find_project(name).find('a[data-method=delete]').click end + def search_for_project(query) + autocomplete = page.find('[data-qa-selector="membership_project_id"]') + search_autocomplete autocomplete, + query:, + results_selector: 'body' + end + def find_project(name) find('tr', text: name) end diff --git a/spec/workers/copy_project_job_spec.rb b/spec/workers/copy_project_job_spec.rb index 992f9aa5854e..d58e6d7cdeb6 100644 --- a/spec/workers/copy_project_job_spec.rb +++ b/spec/workers/copy_project_job_spec.rb @@ -92,6 +92,7 @@ "#{WorkPackage.model_name.human} '#{work_package.type.name} ##{work_package.id}: #{work_package.subject}': #{custom_field.name} #{I18n.t('errors.messages.blank')}." end + # rubocop:disable RSpec/InstanceVariable before do source_project.work_package_custom_fields << custom_field type.custom_fields << custom_field @@ -110,8 +111,12 @@ expect(copy_job.job_status).to be_present expect(copy_job.job_status[:status]).to eq 'success' expect(copy_job.job_status[:payload]['redirect']).to include '/projects/copy' + + expected_link = { 'href' => "/api/v3/projects/#{@copied_project.id}", 'title' => @copied_project.name } + expect(copy_job.job_status[:payload]['_links']['project']).to eq(expected_link) end end + # rubocop:enable RSpec/InstanceVariable describe 'project has an invalid repository' do let(:admin) { create(:admin) }