Merge branch 'release/11.4' into dev

This commit is contained in:
Markus Kahl
2021-10-20 13:44:48 +01:00
64 changed files with 546 additions and 263 deletions
+1 -1
View File
@@ -41,7 +41,7 @@ installer: https://github.com/pkgr/installer.git
wizards:
- https://github.com/pkgr/addon-legacy-installer.git
- ./packaging/addons/openproject-edition
- https://github.com/opf/addon-postgres#pg13
- https://github.com/pkgr/addon-postgres
- https://github.com/pkgr/addon-apache2.git
- ./packaging/addons/repositories
- https://github.com/pkgr/addon-smtp.git
@@ -37,5 +37,24 @@ module Attachments
def validate_direct_uploads_active
errors.add :base, :not_available unless OpenProject::Configuration.direct_uploads?
end
##
# The browser hasn't given a specific content type.
# So we don't check the content type here during the prepare_upload step yet.
#
# We'll do it again later in the FinishDirectUploadJob where the normal create contract
# without this opt-out is used, and where a more specific content type may be
# determined.
def validate_content_type
return if pending_content_type?
super
end
def pending_content_type?
return false unless OpenProject::Configuration.direct_uploads?
model.content_type == OpenProject::ContentTypeDetector::SENSIBLE_DEFAULT
end
end
end
+3
View File
@@ -32,4 +32,7 @@ class GroupUser < ApplicationRecord
belongs_to :group,
touch: true
belongs_to :user
validates_presence_of :group
validates_presence_of :user
end
@@ -50,9 +50,9 @@ module Attachments
model.extend(OpenProject::ChangedBySystem)
model.change_by_system do
model.downloads = -1
# Set a content type as the file is not present
# The real content type will be set by FinishDirectUploadJob
model.content_type = params[:content_type] || OpenProject::ContentTypeDetector::SENSIBLE_DEFAULT
# Set a preliminary content type as the file is not present
# The content type will be updated by the FinishDirectUploadJob if necessary.
model.content_type = params[:content_type].presence || OpenProject::ContentTypeDetector::SENSIBLE_DEFAULT
end
end
+7 -1
View File
@@ -32,7 +32,7 @@ class Groups::UpdateService < ::BaseServices::Update
protected
def persist(call)
removed_users = call.result.group_users.select(&:marked_for_destruction?).map(&:user)
removed_users = groups_removed_users(call.result)
member_roles = member_roles_to_prune(removed_users)
project_ids = member_roles.pluck(:project_id)
member_role_ids = member_roles.pluck(:id)
@@ -59,6 +59,10 @@ class Groups::UpdateService < ::BaseServices::Update
call
end
def groups_removed_users(group)
group.group_users.select(&:marked_for_destruction?).map(&:user).compact
end
def remove_member_roles(member_role_ids)
::Groups::CleanupInheritedRolesService
.new(model, current_user: user)
@@ -66,6 +70,8 @@ class Groups::UpdateService < ::BaseServices::Update
end
def member_roles_to_prune(users)
return MemberRole.none if users.empty?
MemberRole
.includes(member: :member_roles)
.where(inherited_from: model.members.joins(:member_roles).select('member_roles.id'))
@@ -42,31 +42,53 @@ class Attachments::FinishDirectUploadJob < ApplicationJob
return Rails.logger.error("File for attachment #{attachment_id} was not uploaded.")
end
begin
set_attributes_from_file(attachment, local_file)
save_attachment(attachment)
journalize_container(attachment)
attachment_created_event(attachment)
ensure
File.unlink(local_file.path) if File.exist?(local_file.path)
User.execute_as(attachment.author) do
attach_uploaded_file(attachment, local_file)
end
end
private
def attach_uploaded_file(attachment, local_file)
set_attributes_from_file(attachment, local_file)
validate_attachment(attachment)
save_attachment(attachment)
journalize_container(attachment)
attachment_created_event(attachment)
rescue StandardError => e
::OpenProject.logger.error e
attachment.destroy
ensure
File.unlink(local_file.path) if File.exist?(local_file.path)
end
def set_attributes_from_file(attachment, local_file)
attachment.downloads = 0
attachment.set_file_size local_file
attachment.set_content_type local_file
attachment.set_digest local_file
attachment.extend(OpenProject::ChangedBySystem)
attachment.change_by_system do
attachment.downloads = 0
attachment.set_file_size local_file
attachment.set_content_type local_file
attachment.set_digest local_file
end
end
def save_attachment(attachment)
User.execute_as(attachment.author) do
attachment.save! if attachment.changed?
attachment.save! if attachment.changed?
end
def validate_attachment(attachment)
contract = create_contract attachment
unless contract.valid?
errors = contract.errors.full_messages.join(", ")
raise "Failed to validate attachment #{attachment.id}: #{errors}"
end
end
def create_contract(attachment)
::Attachments::CreateContract.new(attachment, attachment.author)
end
def journalize_container(attachment)
journable = attachment.container
+2 -2
View File
@@ -290,7 +290,7 @@ ar:
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "تفعيل"
@@ -862,7 +862,7 @@ ar:
no_results:
title: لا يوجد مجموعات عمل لعرضها.
description: إما أنه لا يوجد ما تم إنشاؤه أو أن جميع مجموعات العمل قد تمت فلترتها.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "تفاصيل"
people: "الناس"
+2 -2
View File
@@ -290,7 +290,7 @@ bg:
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Activate"
@@ -858,7 +858,7 @@ bg:
no_results:
title: Няма работни пакети за показване.
description: Или никакви работни пакети не са създадени, или всички са филтрирани.
limited_results: В режим ръчно сортиране могат да се показват само %{count} работни пакети. Моля, намалете резултатите чрез филтриране.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Подробности"
people: "Участници"
+2 -2
View File
@@ -290,7 +290,7 @@ ca:
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Activar"
@@ -858,7 +858,7 @@ ca:
no_results:
title: Cap paquet de treball a visualitzar.
description: No se n'ha creat cap o tots els paquets de treball s'han filtrat.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Detalls"
people: "Persones"
+2 -2
View File
@@ -290,7 +290,7 @@ cs:
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Aktivovat"
@@ -860,7 +860,7 @@ cs:
no_results:
title: Žádné pracovní balíčky k zobrazení.
description: Buď nebyly vytvořeny nebo jsou všechny pracovní balíčky odfiltrovány.
limited_results: Pouze %{count} pracovních balíčků může být zobrazeno v ručním režimu. Snížte prosím výsledky filtrováním.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Podrobnosti"
people: "Lidé"
+2 -2
View File
@@ -289,7 +289,7 @@ da:
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Aktivér"
@@ -857,7 +857,7 @@ da:
no_results:
title: No work packages to display.
description: Either none have been created or all work packages are filtered out.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Detaljer"
people: "Personer"
+2 -2
View File
@@ -289,7 +289,7 @@ de:
current_new_feature_html: >
Das Release enthält zahlreiche neue Funktionen und Verbesserungen: <br> <ul class="%{list_styling_class}"> <li>Neuer Button in der Header-Navigation zum Anlegen von Projekten, Benutzern und Arbeitspaketen.</li> <li>Ein neues Modalfenster zum Einladen für Benutzer, Gruppen und Platzhalter-Benutzer ermöglicht das einfache Hinzufügen neuer Benutzer und deren Zuweisung zu Arbeitspaketen. </li> <li>GitHub-Integration in OpenProject.</li> <li>API v3-Erweiterungen für Gruppen und mehr, insb. Erstellen, Lesen, Aktualisieren und Löschen von Gruppen und Gruppenmitgliedern über die API.</li> <li>Mehrfachauswahl für projektspezifische Felder vom Typ Liste.</li> <li>Erstellung von Backups über die Web-Oberfläche.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
Dieses Release enthält eine Reihe neuer Funktionen und Verbesserungen: <br> <ul class="%{list_styling_class}"> <li>Probieren Sie unser <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a>! Damit können Sie direkt in Revit BCF-Arbeitspakete erstellen, koordinieren und abarbeiten.</li> <li>Das Erkunden und Kopieren von einzelnen Elementen im IFC-Modell war nie einfacher. Denn IFC-Attribute haben nun ihren eigenen Platz erhalten.</li> <li>Bei Anlegen von Schnitten im Modell haben wir im darunterliegenden Datenmodell (BCF-Viewpoint) die Seiten vertauscht, sodass nun die andere Seite versteckt wird. Damit ist OpenProject in dem Punkt mit dem neuen BCF 3.0 Standard konform, was übrigens auch bereits der gelebte Standard bei Anbietern wie Solibri ist. <li>Die Bedienung des IFC-Modell-Viewers mit dem Mobiltelefon wurde massiv überarbeitet.</li> <li>Der Export von Arbeitspaket-Ansichten mit der Spalte "BCF-Snapshot" wurde gefixt.</li> </ul>
label_activate: "Aktiviere"
@@ -857,7 +857,7 @@ de:
no_results:
title: Keine Arbeitspakete anzuzeigen.
description: Es wurden entweder keine Arbeitspakete erzeugt oder alle Arbeitspakete wurden ausgefiltert.
limited_results: Nur %{count} Arbeitspakete können im manuellen Sortiermodus angezeigt werden. Bitte reduzieren Sie die Ergebnisse durch Filtern.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Details"
people: "Personen"
+2 -2
View File
@@ -289,7 +289,7 @@ el:
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Ενεργοποίηση"
@@ -857,7 +857,7 @@ el:
no_results:
title: Δεν υπάρχουν πακέτα εργασίας για εμφάνιση.
description: Είτε δεν έχει δημιουργηθεί κανένα ή όλα τα πακέτα εργασίας έχουν φιλτραριστεί.
limited_results: Μόνο %{count} πακέτα εργασίας μπορούν να εμφανιστούν στην λειτουργία χειροκίνητης ταξινόμησης. Παρακαλούν μειώστε τα αποτελέσματα με φίλτρα.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Λεπτομέρειες"
people: "Άτομα"
+2 -2
View File
@@ -290,7 +290,7 @@ es:
current_new_feature_html: >
Esta versión contiene nuevas mejoras y características: <br> <ul class="%{list_styling_class}"> <li>Nuevo botón en el menú de navegación del encabezado para crear proyectos, usuarios y paquetes de trabajo.</li> <li>Un nuevo cuadro de diálogo modal para invitar a usuarios, grupos y usuarios de marcador de posición que permite añadir o invitar fácilmente a nuevos usuarios y asignarlos a paquetes de trabajo.</li> <li>Integración de GitHub con OpenProject.</li> <li>Extensiones de la API v3 para grupos y más (por ejemplo, para crear, leer, actualizar y eliminar grupos y miembros del grupo mediante la API).</li> <li>Selección múltiple para campos personalizados del proyecto de tipo lista.</li> <li>Creación de copias de seguridad desde la interfaz web.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Activar"
@@ -858,7 +858,7 @@ es:
no_results:
title: No hay paquetes de trabajo para mostrar.
description: O bien no se han creado o se filtran todos los paquetes de trabajo.
limited_results: En el modo de ordenación manual, solo puede mostrarse un máximo de %{count} paquetes de trabajo. Filtre para reducir el número de resultados.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Detalles"
people: "Participantes"
+2 -2
View File
@@ -290,7 +290,7 @@ fi:
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Aktivoi"
@@ -858,7 +858,7 @@ fi:
no_results:
title: Ei tehtäviä.
description: Yhtään ei ole luotu tai sitten kaikki on suodatettu pois.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Yksityiskohdat"
people: "Henkilöresurssit"
+2 -2
View File
@@ -290,7 +290,7 @@ fil:
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Aktibo"
@@ -858,7 +858,7 @@ fil:
no_results:
title: Walang mga work package ang i-displey.
description: Alinman sa walang ang nilikha o mga work package ay naka-filter out.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Mga detalye"
people: "Mga tao"
+2 -2
View File
@@ -290,7 +290,7 @@ fr:
current_new_feature_html: >
Cette version contient diverses nouvelles fonctionnalités et améliorations : <br> <ul class="%{list_styling_class}"> <li>Nouveau bouton dans la navigation d'en-tête pour créer des projets, des utilisateurs et des paquets de travail.</li> <li>Une nouvelle modale d'invitation pour les utilisateurs, les groupes et les utilisateurs fictifs permet d'ajouter ou d'inviter facilement de nouveaux utilisateurs et de les affecter à des lots de travaux.</li> <li>Intégration de GitHub dans OpenProject. </li> <li>Extensions de l'API v3 pour les groupes et plus encore pour créer, lire, mettre à jour et supprimer des groupes et des membres de groupes par le biais de l'API, entre autres.</li> <li>Sélection multiple pour les champs personnalisés du projet de liste de type.</li> <li>Création de sauvegardes à partir de l'interface web.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Activer"
@@ -858,7 +858,7 @@ fr:
no_results:
title: Aucun lot de travaux à afficher.
description: Soit aucun n'a été créé, soit tous les lots de travaux sont filtrés.
limited_results: Seuls %{count} lots de travaux peuvent être affichés en mode de tri manuel. Veuillez réduire les résultats en filtrant.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Détails"
people: "Participants"
+2 -2
View File
@@ -290,7 +290,7 @@ hr:
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Aktiviraj"
@@ -859,7 +859,7 @@ hr:
no_results:
title: Nema radnih paketa za prikaz.
description: Either none have been created or all work packages are filtered out.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Pojedinosti"
people: "Osobe"
+2 -2
View File
@@ -294,7 +294,7 @@ hu:
A kiadás számos új funkciót és fejlesztést tartalmaz: <br> <ul class = "%{list_styling_class}"> <li> Új gomb a fejléc navigációjában projektek, felhasználók és munkacsomagok létrehozásához. </li> <li> Új meghívó a modális felhasználóknak, csoportoknak és teszt felhasználóknak lehetővé teszi új felhasználók hozzáadását vagy meghívását, valamint munkacsomagok hozzárendelését. </li> <li> GitHub integráció az OpenProject -be. </li> <li> API v3 kiterjesztések csoportokhoz és egyebek, azaz csoportokat és csoporttagokat hozhat létre, olvashat, frissíthet és törölhet az API-n keresztül. </li> <li> Többszörös kiválasztás a projekt egyedi típusmezői mezőihez. </li> <li> Biztonsági mentés létrehozása a webes felületről. < /li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Aktivál"
@@ -864,7 +864,7 @@ hu:
no_results:
title: Nincs megjelenítendő munkacsomag.
description: Vagy nincs még ilyen munkacsomag, vagy a szűrők miatt nem jeleníthető meg.
limited_results: Csak %{count} munkacsomag jeleníthető meg kézi rendezés módban. Kérjük, szűréssel csökkentse az eredményeket.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Részletek"
people: "Személyek"
+2 -2
View File
@@ -290,7 +290,7 @@ id:
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Aktifkan"
@@ -857,7 +857,7 @@ id:
no_results:
title: No work packages to display.
description: Either none have been created or all work packages are filtered out.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Detil"
people: "Orang"
+2 -2
View File
@@ -290,7 +290,7 @@ it:
current_new_feature_html: >
Il rilascio contiene varie nuove funzionalità e miglioramenti: <br> <ul class="%{list_styling_class}"> <li>Nuovo pulsante nella navigazione dell'intestazione per creare progetti, utenti e macro attività.</li> <li>Un nuovo invito per utenti, gruppi e utenti segnaposto che permette di aggiungere o invitare facilmente nuovi utenti e assegnarli a macro attività.</li> <li>Integrazione di GitHub in OpenProject.</li> <li>Estensioni API v3 per gruppi e altro, come creare, leggere, aggiornare ed eliminare i gruppi e i membri del gruppo attraverso le API.</li> <li>Selezione multipla di campi personalizzati di progetto di per il tipo lista.</li> <li>Creazione di backup dall'interfaccia web.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Attiva"
@@ -858,7 +858,7 @@ it:
no_results:
title: Nessuna macro-attività da visualizzare.
description: E' possibile che non ne sia stata creata alcuna o che tutte le macro-attività vengano filtrate.
limited_results: Solo %{count} macro-attività possono essere visualizzate nella modalità di ordinamento manuale. Riduci i risultati filtrando.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Dettagli"
people: "Persone"
+2 -2
View File
@@ -291,7 +291,7 @@ ja:
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "有効にする"
@@ -860,7 +860,7 @@ ja:
no_results:
title: 表示できるワークパッケージがありません。
description: ワークパッケージが作成されていないかすべてのワークパッケージが除外されています。
limited_results: 手動並び替えモードで表示できるのは %{count} のワークパッケージだけです。 フィルタリングして結果を減らしてください。
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "詳細"
people: "人"
+2 -2
View File
@@ -290,7 +290,7 @@ ko:
current_new_feature_html: >
이 릴리스에는 다양한 새로운 기능과 개선 사항이 포함되어 있습니다: <br> <ul class="%{list_styling_class}"> <li>프로젝트, 사용자 및 작업 패키지를 생성하기 위한 헤더 탐색의 새로운 버튼.</li> <li>사용자, 그룹 및 자리 표시자 사용자에 대한 새로운 초대 모달을 사용하면 새로운 사용자를 쉽게 추가하거나 초대하고 작업 패키지에 할당할 수 있습니다.</li> <li>OpenProject에 GitHub 통합.</li> <li>그룹용 API v3 확장 기능 등. 예: API를 통해 그룹 및 그룹 구성원 생성, 읽기, 업데이트 및 삭제.</li> <li>유형 목록의 프로젝트 사용자 지정 필드에 대한 다중 선택.</li> <li>웹 인터페이스에서 백업 생성.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "활성화"
@@ -857,7 +857,7 @@ ko:
no_results:
title: 표시할 작업 패키지가 없습니다.
description: 만든 작업 패키지가 없거나 모든 작업 패키지가 필터링에서 제외되었습니다.
limited_results: 수동 정렬 모드에서는 %{count}개 작업 패키지만 표시할 수 있습니다. 필터링으로 결과를 줄이십시오.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "세부 정보"
people: "사용자"
+2 -2
View File
@@ -290,7 +290,7 @@ lt:
current_new_feature_html: >
Šioje laidoje yra įvairios naujos galimybės ir patobulinimai: <br> <ul class="%{list_styling_class}"> <li>Naujas mygtukas navigacijos antraštėje skirtas kurti naujus projektus, naudotojus ir darbų paketus.</li> <li>Naujas modalinis langas naudotojams, grupėms ir statytiniams naudotojams kurti leidžia lengvai pridėti naudotojus ir priskirti juos darbų paketams.</li> <li>GitHub integracija į OpenProject.</li> <li>API v3 praplėtimai grupėms ir ne tik, t.y. realizuota galimybė kurti, skaityti, atnaujinti ir pašalinti grupes ir grupių narius naudojant API.</li> <li>Galimybė pasirinkti daugiau nei vieną naudotoją projekto sąrašo tipo naudotojo laukuose.</li> <li>Atsarginės kopijos kūrimas iš web sąsajos.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
Šioje laidoje rasite įvairias naujas funkcijas ir patobulinimus: <br> <ul class="%{list_styling_class}"> <li>Pasidomėkite mūsų <a href="https://github.com/opf/openproject-revit-add-in">priedu Revit</a>, kuris leidžia dirbti su BCF darbo paketais tiesiai Revit'e.</li> <li>IFC savybės gavo savo atskirą skydelį. GUID kopijavimas niekada nebuvo lengvesnis.</li> <li>Atgalinės plokštumos karpymo krypties BCF vaizdas ir suderinamumas su būsima BCF 3.0 (Dabar tokia patik kryptis, kaip ir Solibri). <li>Pataisyta IFC modelių peržiūra mobiliuose.</li> <li>Pataisytas darbo paketų vaizdo su BCF nuotraukų stulpeliu eksportas.</li> </ul>
label_activate: "Aktyvuoti"
@@ -860,7 +860,7 @@ lt:
no_results:
title: Nėra rodytinų darbų paketų.
description: Arba nebuvo niekas sukurta, arba visi darbų paketai buvo išfiltruoti.
limited_results: Rankinio rikiavimo režime gali būti rodomi tik %{count} darbo paketai. Prašome sumažinti rezultatų skaičių filtruojant.
limited_results: Rankinio rikiavimo režime gali būti rodomi tik %{count} darbų paketai. Prašome sumažinti rezultatų skaičių filtrais arba persijungti į automatinį rikiavimą.
property_groups:
details: "Detali informacija"
people: "Žmonės"
+1 -1
View File
@@ -290,7 +290,7 @@ nl:
current_new_feature_html: >
De release bevat verschillende nieuwe functies en verbeteringen: <br> <ul class="%{list_styling_class}"> <li>Nieuwe knop in de koptekstnavigatie om projecten, gebruikers en werkpakketten te creëren.</li> <li>Een nieuwe uitnodigingsmodus voor gebruikers, groepen en placeholder gebruikers laat toe eenvoudig nieuwe gebruikers toe te voegen of uit te nodigen en toe te wijzen aan werkpakketten.</li> <li>GitHub integratie in OpenProject.</li> <li>API v3 extensies voor groepen en meer, i. e. maak, lees, update en verwijder groepen en groepsleden via de API.</li> <li>Multi-selectie voor project aangepaste velden van het type lijst.</li> <li>Maken van back-up vanuit de webinterface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
De release bevat verschillende nieuwe functies en verbeteringen: <br> <ul class="%{list_styling_class}"> <li>Neem een kijkje op onze <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> waarmee u direct in Revit aan BCF werkpakketten kunt werken.</li> <li>IFC-eigenschappen kregen een eigen venster. GUIDs kopiëren is nooit zo eenvoudig geweest.</li> <li>Omgekeerd knipvlak richting in BCF gezichtspunt en compatibel worden met toekomstige BCF 3.0 (Nu dezelfde richting als Solibri). <li>Probleem opgelost met mobiel bekijken IFC-modellen.</li> <li>Vaste export van werkpakket weergaven met BCF momentopname kolom.</li> </ul>
label_activate: "Activeren"
+2 -2
View File
@@ -290,7 +290,7 @@
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Aktiver"
@@ -858,7 +858,7 @@
no_results:
title: Ingen arbeidspakke å vise.
description: Enten kan den ikke opprettes eller så er alle arbeidspakker filtrert ut.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Detaljer"
people: "Personer"
+2 -2
View File
@@ -290,7 +290,7 @@ pl:
current_new_feature_html: >
Wersja zawiera różne nowe funkcje i ulepszenia: <br> <ul class="%{list_styling_class}"> <li>Nowy przycisk w nawigacji nagłówka, pozwalający tworzyć projekty, użytkowników i pakiety robocze.</li> <li>Nowe okno modalne zaproszenia dla użytkowników, grup i użytkowników zastępczych umożliwia łatwe dodawanie lub zapraszanie nowych użytkowników i przypisywanie ich do pakietów roboczych.</li> <li>Integracja GitHub z OpenProject.</li> <li>Rozszerzenia API v3 dla grup i więcej, np. tworzenie, odczyt, aktualizowanie i usuwanie grup i członków grup za pomocą interfejsu API.</li> <li>Wielokrotny wybór niestandardowych pól projektu z listy typów.</li> <li>Tworzenie kopii zapasowej z interfejsu przeglądarkowego.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Aktywuj"
@@ -860,7 +860,7 @@ pl:
no_results:
title: Brak pakietów prac do wyświetlenia.
description: Pakiety prac nie zostały utworzone albo wszystkie są odfiltrowane.
limited_results: W trybie sortowania ręcznego można pokazać tylko ograniczoną liczbę pakietów roboczych (%{count}). Zmniejsz liczbę wyników filtrowania.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Szczegóły"
people: "Ludzie"
+2 -2
View File
@@ -289,7 +289,7 @@ pt:
current_new_feature_html: >
A versão contém vários novos recursos e melhorias: <br> <ul class="%{list_styling_class}"> <li>Novo botão na navegação do cabeçalho para criar pacotes de projetos, de usuários e de trabalho.</li> <li>Um novo convite restrito para usuários, usuários de espaço reservado e grupos facilita a adição e convite de novos usuários e a atribuição de pacotes de trabalho para eles.</li> <li>A integração do GitHub no OpenProject.</li> <li>Extensões v3 de API para grupos e mais, ou seja, criação, leitura, atualização e exclusão de grupos e membros de grupo através de API.</li> <li>Multi-seleção para campos de personalização de projetos da lista de tipos.</li> <li>Criação de backup para a interface da web.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Ativar"
@@ -857,7 +857,7 @@ pt:
no_results:
title: Não há pacotes de trabalho para exibir.
description: Nenhum pacote criado ou todos os pacotes de trabalho foram filtrados.
limited_results: Apenas %{count} pacotes de trabalho podem ser exibidos no modo manual de classificação. Por favor, reduza os resultados através de filtragem.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Detalhes"
people: "Pessoas"
+2 -2
View File
@@ -289,7 +289,7 @@ ro:
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Activare"
@@ -858,7 +858,7 @@ ro:
no_results:
title: Nu sunt pachete de lucru de afișat.
description: Nu a fost creat niciun pachet de lucru, sau toate sunt eliminate prin filtru.
limited_results: Numai pachetele de lucru %{count} pot fi afișate în modul de sortare manuală. Vă rugăm să reduceți rezultatele prin filtrare.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Detalii"
people: "Persoane"
+2 -2
View File
@@ -289,7 +289,7 @@ ru:
current_new_feature_html: >
Релиз содержит различные новые функции и улучшения: <br> <ul class="%{list_styling_class}"> <li>Новая кнопка навигации в заголовке для создания проектов, пользователей и пакетов работ.</li> <li>Новый способ приглашения пользователей, групп и заполнителей позволяет легко добавлять или приглашать новых пользователей и прикреплять их к рабочим пакетам.</li> <li>Интеграция GitHub в OpenProject.</li> <li>Расширения API v3 для групп и более, в т.ч. создание, чтение, обновление и удаление групп и членов групп через API.</li> <li>Множественный выбор пользовательских для настраиваемых полей типового списка.</li> <li>Создание резервной копии из веб-интерфейса.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
Релиз содержит различные новые функции и улучшения: <br> <ul class="%{list_styling_class}"> <li>Взгляните на наш <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> , который позволяет работать на рабочих пакетах BCF прямо в Revit.</li> <li>Свойства IFC получили выделенную панель. Копирование GUIDs никогда не было проще.</li> <li>Направление обратной плоскости отсечения в точке зрения BCF и соответствует будущему BCF 3.0 (теперь такое же направление, как и Solibri). <li>Исправлен просмотр моделей IFC на мобильном телефоне.</li> <li>Фиксированный экспорт просмотра пакета работ с помощью снимка BCF.</li> </ul>
label_activate: "Активировать"
@@ -859,7 +859,7 @@ ru:
no_results:
title: Нет пакетов работ для показа.
description: Ничего не найдено.
limited_results: В ручной сортировке можно отобразить только %{count} рабочих пакетов. Пожалуйста, уменьшите результаты фильтрацией.
limited_results: Только %{count} пакетов работ могут быть показаны в режиме ручной сортировки. Уменьшите результаты фильтрации или переключитесь на автоматическую сортировку.
property_groups:
details: "Детали"
people: "Люди"
+2 -2
View File
@@ -290,7 +290,7 @@ sk:
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Aktivovať"
@@ -860,7 +860,7 @@ sk:
no_results:
title: Žiadne pracovné balíčky na zobrazenie.
description: Nevytvorili sa žiadne alebo všetky pracovné balíky sú odfiltrované.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Podrobnosti"
people: "Ľudia"
+2 -2
View File
@@ -289,7 +289,7 @@ sl:
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Aktiviraj"
@@ -859,7 +859,7 @@ sl:
no_results:
title: Nobenega delovnega paketa za prikaz.
description: Ali noben ni bil ustvarjen ali pa so bili vsi delovni paketi filtrirani stran.
limited_results: Samo %{count} delovnih paketov je lahko prikazanih v načinu ročnega sortiranja. Prosimo zmanjšajte rezultate s filtri.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Podrobnosti"
people: "Ljudje"
+2 -2
View File
@@ -289,7 +289,7 @@ sv:
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Aktivera"
@@ -857,7 +857,7 @@ sv:
no_results:
title: Inga arbetspaket att visa.
description: Antingen finns det inga arbetspaket eller så har alla filtrerats bort.
limited_results: Endast %{count} arbetspaket kan visas i manuellt sorteringsläge. Minska resultaten genom filtrering.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Detaljer"
people: "Personer"
+2 -2
View File
@@ -290,7 +290,7 @@ tr:
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Etkinleştir"
@@ -858,7 +858,7 @@ tr:
no_results:
title: Görüntülecek bir iş paketi bulunmuyor.
description: Ya hiç iş paketi oluşturulmamış, ya da tüm iş paketeri filtrelenmiş.
limited_results: Manuel sıralama modunda sadece %{count} iş paketi gösterilebilir. Lütfen sonuçları filtreleyerek azaltın.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Detaylar"
people: "Kişiler"
+2 -2
View File
@@ -290,7 +290,7 @@ uk:
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Активувати"
@@ -860,7 +860,7 @@ uk:
no_results:
title: Немає пакетів робіт для показу.
description: Або нічого не було створено, або всі пакети робіт відфільтровані.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Детальніше"
people: "Люди"
+2 -2
View File
@@ -289,7 +289,7 @@ vi:
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "Activate"
@@ -856,7 +856,7 @@ vi:
no_results:
title: Không có gói công việc để hiển thị.
description: Không có gì được tạo ra hoặc tất cả các gói công việc đã được lọc.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Chi tiết"
people: "Người"
+2 -2
View File
@@ -290,7 +290,7 @@ zh-CN:
current_new_feature_html: >
该版本包含各种新功能和改进:<br> <ul class="%{list_styling_class}"> <li>标题导航中提供了用于创建项目、用户和工作包的新按钮。</li> <li>新的用户、群组和占位符用户邀请模式,可轻松添加或邀请新用户并将其分配至工作包。</li> <li>GitHub 集成到 OpenProject 中。</li> <li>适用于群组等内容的 API v3 扩展,即通过 API 创建、读取、更新和删除群组和群组成员。</li> <li>项目自定义字段类型列表支持多选。</li> <li>从网页界面创建备份。</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "激活"
@@ -857,7 +857,7 @@ zh-CN:
no_results:
title: 没有要显示的工作包。
description: 没有已创建的工作包或所有工作包都被筛选排除。
limited_results: 手动排序模式下只能显示 %{count} 个工作包。请通过筛选减少结果。
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "详细信息"
people: "人员"
+2 -2
View File
@@ -289,7 +289,7 @@ zh-TW:
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>New button in header navigation to create projects, users and work packages.</li> <li>A new invite modal for users, groups and placeholder users allows to easily add or invite new users and assign them to work packages.</li> <li>GitHub integration into OpenProject.</li> <li>API v3 extensions for groups and more, i.e. create, read, update and delete groups and group members through the API.</li> <li>Multi-selection for project custom fields of type list.</li> <li>Creation of backup from the web interface.</li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br> <ul class="%{list_styling_class}"> <li>Take a look at our <a href="https://github.com/opf/openproject-revit-add-in">Revit Add-in</a> which lets you work on BCF work packages directly in Revit.</li> <li>IFC properties got a dedicated pane. Copying GUIDs has never been easier.</li> <li>Reverse clipping plane direction in BCF viewpoint and become compliant with future BCF 3.0 (Now same direction as Solibri). <li>Fixed viewing IFC models on mobile.</li> <li>Fixed export of work package views with BCF snapshot column.</li> </ul>
label_activate: "啟用"
@@ -856,7 +856,7 @@ zh-TW:
no_results:
title: 無工作項目可顯示
description: 無工作項目或是被篩選器把工作項目隱藏了
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "詳細資料"
people: "人員"
+2 -2
View File
@@ -329,7 +329,7 @@ en:
<li>Creation of backup from the web interface.</li>
</ul>
bim:
learn_about_link: https://www.openproject.org/openproject-11-4-release
learn_about_link: https://www.openproject.org/blog/openproject-11-4-release
current_new_feature_html: >
The release contains various new features and improvements: <br>
<ul class="%{list_styling_class}">
@@ -938,7 +938,7 @@ en:
title: No work packages to display.
description: Either none have been created or all work packages are filtered out.
limited_results:
Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering.
Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting.
property_groups:
details: "Details"
people: "People"
@@ -0,0 +1,5 @@
class RemoveInvalidGroupUsers < ActiveRecord::Migration[6.1]
def up
GroupUser.left_outer_joins(:user).where(users: { id: nil }).destroy_all
end
end
+36
View File
@@ -0,0 +1,36 @@
---
title: OpenProject 11.4.1
sidebar_navigation:
title: 11.4.1
release_version: 11.4.1
release_date: 2021-10-20
---
# OpenProject 11.4.1
Release date: 2021-10-20
We released [OpenProject 11.4.1](https://community.openproject.com/versions/1491).
The release contains several bug fixes and we recommend updating to the newest version.
<!--more-->
#### Bug fixes and changes
- Fixed: Today's Date line does not show up on My Page work package tables \[[#35748](https://community.openproject.com/wp/35748)\]
- Fixed: openproject configure tries to install postgresql 10 on upgrade, while 13 is already deployed \[[#39086](https://community.openproject.com/wp/39086)\]
- Fixed: Cannot add or remove users from group \[[#39090](https://community.openproject.com/wp/39090)\]
- Fixed: LDAP groups filter does not save synchronized group \[[#39120](https://community.openproject.com/wp/39120)\]
- Fixed: LDAP synchronized group finds only case-matching users \[[#39121](https://community.openproject.com/wp/39121)\]
- Fixed: Unnecessary deprecation warning shown on startup \[[#39125](https://community.openproject.com/wp/39125)\]
- Fixed: Cannot upload files with less common extensions (content type missing) \[[#39126](https://community.openproject.com/wp/39126)\]
- Fixed: Attachment whitelist feature not working with direct uploads enabled \[[#39130](https://community.openproject.com/wp/39130)\]
- Fixed: Revit bridge service in frontend distorts viewpoint data \[[#39135](https://community.openproject.com/wp/39135)\]
- Fixed: Help text modal text cut off \[[#39171](https://community.openproject.com/wp/39171)\]
- Fixed: Switching from "viewer" to "viewer and cards" fails to load viewer \[[#39184](https://community.openproject.com/wp/39184)\]
#### Contributions
A big thanks to community members for reporting bugs and helping us identifying and providing fixes.
Special thanks for reporting and finding bugs go to
Klaas van Thoor, Evgeniy Belov
+7
View File
@@ -16,6 +16,13 @@ Stay up to date and get an overview of the new features included in the releases
<!--- New release notes are generated below. Do not remove comment. -->
<!--- RELEASE MARKER -->
## 11.4.1
Release date: 2021-10-20
[Release Notes](11-4-1/)
## 11.4.0
Release date: 2021-10-04
+3 -1
View File
@@ -33,6 +33,7 @@
"@typescript-eslint/eslint-plugin": "4.23.0",
"@typescript-eslint/parser": "4.23.0",
"browserslist": "^4.9.1",
"@types/mime": "^2.0.3",
"codelyzer": "^6.0.0",
"eslint": "^7.26.0",
"eslint-config-airbnb-base": "^14.2.1",
@@ -88,7 +89,7 @@
"@uirouter/core": "^6.0.7",
"@uirouter/rx": "^0.6.5",
"@w11k/ngx-componentdestroyed": "^5.0.2",
"@xeokit/xeokit-bim-viewer": "2.3.6",
"@xeokit/xeokit-bim-viewer": "2.3.10",
"autoprefixer": "^9.6.1",
"byte-base64": "^1.1.0",
"cdk-drag-scroll": "^0.0.6",
@@ -113,6 +114,7 @@
"json5": "^2.1.0",
"lodash": "^4.17.19",
"mark.js": "^8.11.0",
"mime": "^2.5.2",
"moment": "^2.24.0",
"moment-timezone": "^0.5.26",
"mousetrap": "~1.6.3",
@@ -53,47 +53,47 @@ export class OpenProjectDirectFileUploadService extends OpenProjectFileUploadSer
const observable = from(this.getDirectUploadFormFrom(url, file))
.pipe(
switchMap(this.uploadToExternal(file, method, responseType)),
share(),
share()
);
return [file, observable] as UploadInProgress;
}
private uploadToExternal(file:UploadFile|UploadBlob, method:string, responseType:string):(result:PrepareUploadResult) => Observable<HttpEvent<unknown>> {
return (result) => {
return result => {
result.form.append('file', file, file.customName || file.name);
return this
.http
.request<HalResource>(
method,
result.url,
{
body: result.form,
// Observe the response, not the body
observe: 'events',
// This is important as the CORS policy for the bucket is * and you can't use credentals then,
// besides we don't need them here anyway.
withCredentials: false,
responseType: responseType as any,
// Subscribe to progress events. subscribe() will fire multiple times!
reportProgress: true,
},
)
method,
result.url,
{
body: result.form,
// Observe the response, not the body
observe: 'events',
// This is important as the CORS policy for the bucket is * and you can't use credentals then,
// besides we don't need them here anyway.
withCredentials: false,
responseType: responseType as any,
// Subscribe to progress events. subscribe() will fire multiple times!
reportProgress: true
}
)
.pipe(switchMap(this.finishUpload(result)));
};
}
private finishUpload(result:PrepareUploadResult):(result:HttpEvent<unknown>) => Observable<HttpEvent<unknown>> {
return (event) => {
return event => {
if (event instanceof HttpResponse) {
return this
.http
.get(
result.response._links.completeUpload.href,
{
observe: 'response',
},
observe: 'response'
}
);
}
@@ -102,13 +102,16 @@ export class OpenProjectDirectFileUploadService extends OpenProjectFileUploadSer
};
}
public getDirectUploadFormFrom(url:string, file:UploadFile|UploadBlob):Promise<PrepareUploadResult> {
public async getDirectUploadFormFrom(url:string, file:UploadFile|UploadBlob):Promise<PrepareUploadResult> {
const fileName = file.customName || file.name;
const contentType = file.type || (fileName && mime.getType(fileName)) || '';
const formData = new FormData();
const metadata = {
description: file.description,
fileName: file.customName || file.name,
fileName: fileName,
fileSize: file.size,
contentType: file.type,
contentType: contentType,
};
/*
@@ -123,28 +126,25 @@ export class OpenProjectDirectFileUploadService extends OpenProjectFileUploadSer
JSON.stringify(metadata),
);
const result = this
const result = await this
.http
.request<HalResource>(
'post',
url,
{
body: formData,
withCredentials: true,
responseType: 'json' as any,
},
)
.toPromise()
.then((res) => {
const form = new FormData();
'post',
url,
{
body: formData,
withCredentials: true,
responseType: 'json' as any,
},
)
.toPromise();
_.each(res._links.addAttachment.form_fields, (value, key) => {
form.append(key, value);
});
const form = new FormData();
return { url: res._links.addAttachment.href, form, response: res };
});
_.each(result._links.addAttachment.form_fields, (value, key) => {
form.append(key, value);
});
return result;
return { url: result._links.addAttachment.href, form, response: result };
}
}
@@ -15,13 +15,14 @@
</div>
</div>
<div *ngIf="modelCount"
<div #viewerContainer
*ngIf="modelCount"
class="op-ifc-viewer--container xeokit-busy-modal-backdrop"
data-qa-selector="op-ifc-viewer--container">
<div class="op-ifc-viewer--toolbar op-ifc-viewer--model-canvas-overlay"
data-qa-selector="op-ifc-viewer--toolbar">
<div class="op-ifc-viewer--toolbar-container"
<div class="op-ifc-viewer--toolbar op-ifc-viewer--model-canvas-overlay">
<div #toolbar
class="op-ifc-viewer--toolbar-container"
data-qa-selector="op-ifc-viewer--toolbar-container">
</div>
@@ -47,11 +48,13 @@
</a>
</div>
<canvas class="op-ifc-viewer--nav-cube-canvas op-ifc-viewer--model-canvas-overlay"
<canvas #navCubeCanvas
class="op-ifc-viewer--nav-cube-canvas op-ifc-viewer--model-canvas-overlay"
data-qa-selector="op-ifc-viewer--nav-cube-canvas"></canvas>
</div>
<div class="op-ifc-viewer--inspector-container"
<div #inspectorPane
class="op-ifc-viewer--inspector-container"
[class.op-ifc-viewer--inspector-container-hidden]="!(inspectorVisible$ | async)"
data-qa-selector="op-ifc-viewer--inspector-container">
</div>
@@ -27,6 +27,7 @@
//++
import {
AfterViewInit,
ChangeDetectionStrategy,
Component,
ElementRef,
@@ -40,18 +41,19 @@ import { IfcModelsDataService } from 'core-app/features/bim/ifc_models/pages/vie
import { I18nService } from 'core-app/core/i18n/i18n.service';
import { CurrentUserService } from 'core-app/core/current-user/current-user.service';
import { CurrentProjectService } from 'core-app/core/current-project/current-project.service';
import { BehaviorSubject } from 'rxjs';
import { BehaviorSubject, combineLatest, Subject } from 'rxjs';
import { take } from "rxjs/operators";
@Component({
selector: 'ifc-viewer',
selector: 'op-ifc-viewer',
templateUrl: './ifc-viewer.component.html',
styleUrls: ['./ifc-viewer.component.sass'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class IFCViewerComponent implements OnInit, OnDestroy {
private viewerUI:any;
export class IFCViewerComponent implements OnInit, OnDestroy, AfterViewInit {
private viewInitialized$ = new Subject();
modelCount:number;
modelCount:number = this.ifcData.models.length;
canManage = this.ifcData.allowed('manage_ifc_models');
@@ -63,64 +65,86 @@ export class IFCViewerComponent implements OnInit, OnDestroy {
keyboardEnabled = false;
public inspectorVisible$:BehaviorSubject<boolean>;
inspectorVisible$:BehaviorSubject<boolean> = this.ifcViewerService.inspectorVisible$;
@ViewChild('outerContainer') outerContainer:ElementRef;
@ViewChild('viewerContainer') viewerContainer:ElementRef;
@ViewChild('modelCanvas') modelCanvas:ElementRef;
@ViewChild('navCubeCanvas') navCubeCanvas:ElementRef;
@ViewChild('toolbar') toolbarElement:ElementRef;
@ViewChild('inspectorPane') inspectorElement:ElementRef;
constructor(private I18n:I18nService,
private elementRef:ElementRef,
public ifcData:IfcModelsDataService,
private ifcViewerService:IFCViewerService,
private currentUserService:CurrentUserService,
private currentProjectService:CurrentProjectService) {
this.inspectorVisible$ = this.ifcViewerService.inspectorVisible$;
private elementRef:ElementRef,
public ifcData:IfcModelsDataService,
private ifcViewerService:IFCViewerService,
private currentUserService:CurrentUserService,
private currentProjectService:CurrentProjectService) {
}
ngOnInit():void {
this.modelCount = this.ifcData.models.length;
if (this.modelCount === 0) {
return;
}
const element = jQuery(this.elementRef.nativeElement as HTMLElement);
this.currentUserService
.hasCapabilities$(
[
'ifc_models/create',
'ifc_models/update',
'ifc_models/destroy',
],
this.currentProjectService.id as string,
)
.subscribe((manageIfcModelsAllowed) => {
// we have to wait until view is initialized before constructing the ifc viewer,
// as it needs all view children ready and rendered
combineLatest(
this.currentUserService
.hasCapabilities$(
[
'ifc_models/create',
'ifc_models/update',
'ifc_models/destroy',
],
this.currentProjectService.id as string,
),
this.viewInitialized$,
)
.pipe(take(1))
.subscribe(([manageIfcModelsAllowed]) => {
this.ifcViewerService.newViewer(
{
canvasElement: this.modelCanvas.nativeElement, // WebGL canvas
explorerElement: jQuery('[data-qa-selector="op-ifc-viewer--tree-panel"]')[0], // Left panel
toolbarElement: element.find('[data-qa-selector="op-ifc-viewer--toolbar-container"]')[0], // Toolbar
inspectorElement: element.find('[data-qa-selector="op-ifc-viewer--inspector-container"]')[0], // Toolbar
navCubeCanvasElement: element.find('[data-qa-selector="op-ifc-viewer--nav-cube-canvas"]')[0],
busyModelBackdropElement: element.find('.xeokit-busy-modal-backdrop')[0],
canvasElement: this.modelCanvas.nativeElement as HTMLElement,
explorerElement: document.getElementsByClassName('op-ifc-viewer--tree-panel')[0] as HTMLElement, // Left panel
toolbarElement: this.toolbarElement.nativeElement as HTMLElement,
inspectorElement: this.inspectorElement.nativeElement as HTMLElement,
navCubeCanvasElement: this.navCubeCanvas.nativeElement as HTMLElement,
busyModelBackdropElement: this.viewerContainer.nativeElement as HTMLElement,
keyboardEventsElement: this.modelCanvas.nativeElement as HTMLElement,
enableEditModels: manageIfcModelsAllowed,
},
this.ifcData.projects,
);
});
}
ngAfterViewInit():void {
this.viewInitialized$.next();
}
ngOnDestroy():void {
this.ifcViewerService.destroy();
}
toggleInspector():void {
toggleInspector() {
this.ifcViewerService.inspectorVisible$.next(!this.inspectorVisible$.getValue());
}
// Key events for navigating the viewer shall not propagate further up in the DOM, i.e.
// pressing the S-key shall not trigger the global search which listens on `document`.
@HostListener('keydown', ['$event'])
@HostListener('keyup', ['$event'])
@HostListener('keypress', ['$event'])
cancelAllKeyEvents($event:KeyboardEvent):void {
$event.stopPropagation();
}
@HostListener('mousedown')
enableKeyBoard():void {
if (this.modelCount) {
@@ -131,7 +155,7 @@ export class IFCViewerComponent implements OnInit, OnDestroy {
@HostListener('window:mousedown', ['$event.target'])
disableKeyboard(target:Element):void {
if (this.modelCount && !this.outerContainer.nativeElement.contains(target)) {
if (this.modelCount && !this.outerContainer.nativeElement?.contains(target)) {
this.keyboardEnabled = false;
this.ifcViewerService.setKeyboardEnabled(false);
}
@@ -10,7 +10,6 @@ import { InjectField } from 'core-app/shared/helpers/angular/inject-field.decora
import { ViewpointsService } from 'core-app/features/bim/bcf/helper/viewpoints.service';
import { CurrentProjectService } from 'core-app/core/current-project/current-project.service';
import { HttpClient } from '@angular/common/http';
import idFromLink from 'core-app/features/hal/helpers/id-from-link';
export interface XeokitElements {
canvasElement:HTMLElement;
@@ -20,6 +19,7 @@ export interface XeokitElements {
navCubeCanvasElement:HTMLElement;
busyModelBackdropElement:HTMLElement;
enableEditModels?:boolean;
keyboardEventsElement?:HTMLElement;
}
/**
@@ -71,7 +71,7 @@ export class IFCViewerService extends ViewerBridgeService {
}
public newViewer(elements:XeokitElements, projects:any[]):void {
void import('@xeokit/xeokit-bim-viewer/dist/xeokit-bim-viewer.es').then((XeokitViewerModule:any) => {
import('@xeokit/xeokit-bim-viewer/dist/xeokit-bim-viewer.es').then((XeokitViewerModule:any) => {
const server = new XeokitServer(this.pathHelper);
const viewerUI = new XeokitViewerModule.BIMViewer(server, elements);
@@ -174,7 +174,7 @@ export class IFCViewerService extends ViewerBridgeService {
// and redirect to a route with a place to show viewer
// ('bim.partitioned.split')
window.location.href = this.pathHelper.bimDetailsPath(
idFromLink(workPackage.project.href),
workPackage.project.idFromLink,
workPackage.id!,
index,
);
@@ -90,6 +90,9 @@
.xeokit-no-prop-set-warning
visibility: hidden
.no-object-selected-warning
font-style: italic
.xeokit-table
width: 100%
@@ -1,8 +1,6 @@
import { Injectable, Injector } from '@angular/core';
import { BehaviorSubject, Observable, Subject } from 'rxjs';
import {
distinctUntilChanged, filter, first, map,
} from 'rxjs/operators';
import { Observable, Subject, BehaviorSubject } from "rxjs";
import { distinctUntilChanged, filter, first, map } from 'rxjs/operators';
import { BcfViewpointInterface } from 'core-app/features/bim/bcf/api/viewpoints/bcf-viewpoint.interface';
import { ViewerBridgeService } from 'core-app/features/bim/bcf/bcf-viewer-bridge/viewer-bridge.service';
import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource';
@@ -11,18 +9,19 @@ import { InjectField } from 'core-app/shared/helpers/angular/inject-field.decora
declare global {
interface Window {
RevitBridge:any;
RevitBridge:{
sendMessageToRevit:(messageType:string, trackingId:string, payload:string) => void,
sendMessageToOpenProject:(message:string) => void
};
}
}
@Injectable()
export class RevitBridgeService extends ViewerBridgeService {
public shouldShowViewer = false;
public viewerVisible$ = new BehaviorSubject<boolean>(false);
private revitMessageReceivedSource = new Subject<{ messageType:string, trackingId:string, messagePayload:any }>();
private revitMessageReceivedSource =
new Subject<{ messageType:string, trackingId:string, messagePayload:BcfViewpointInterface }>();
private trackingIdNumber = 0;
@InjectField() viewpointsService:ViewpointsService;
@@ -41,7 +40,7 @@ export class RevitBridgeService extends ViewerBridgeService {
}
}
public viewerVisible() {
public viewerVisible():boolean {
return this.viewerVisible$.getValue();
}
@@ -53,16 +52,24 @@ export class RevitBridgeService extends ViewerBridgeService {
return this.revitMessageReceived$
.pipe(
distinctUntilChanged(),
filter((message) => message.messageType === 'ViewpointData' && message.trackingId === trackingId),
filter(message => message.messageType === 'ViewpointData' && message.trackingId === trackingId),
first(),
)
.pipe(
map((message) => {
// FIXME: Deprecated code
// the handling of the message payload is only needed to be compatible to the revit add-in <= 2.3.2. In
// newer versions the message payload is sent correctly and needs no special treatment
const viewpointJson = message.messagePayload;
if (viewpointJson.snapshot.hasOwnProperty('snapshot_type') &&
viewpointJson.snapshot.hasOwnProperty('snapshot_data')) {
// already correctly formatted payload
return viewpointJson;
}
// at this point snapshot data should be sent as a base64 string
viewpointJson.snapshot = {
snapshot_type: 'png',
snapshot_data: viewpointJson.snapshot,
snapshot_data: viewpointJson.snapshot as unknown as string,
};
return viewpointJson;
@@ -70,45 +77,44 @@ export class RevitBridgeService extends ViewerBridgeService {
);
}
public showViewpoint(workPackage:WorkPackageResource, index:number) {
public showViewpoint(workPackage:WorkPackageResource, index:number):void {
this.viewpointsService
.getViewPoint$(workPackage, index)
.subscribe((viewpoint:BcfViewpointInterface) =>
this.sendMessageToRevit(
'ShowViewpoint',
this.newTrackingId(),
JSON.stringify(viewpoint)
)
JSON.stringify(viewpoint),
),
);
}
sendMessageToRevit(messageType:string, trackingId:string, messagePayload?:any) {
sendMessageToRevit(messageType:string, trackingId:string, messagePayload:string):void {
if (!this.viewerVisible()) {
return;
}
const jsonPayload = messagePayload != null ? JSON.stringify(messagePayload) : null;
window.RevitBridge.sendMessageToRevit(messageType, trackingId, jsonPayload);
window.RevitBridge.sendMessageToRevit(messageType, trackingId, messagePayload);
}
private hookUpRevitListener() {
window.RevitBridge.sendMessageToOpenProject = (messageString:string) => {
const message = JSON.parse(messageString);
const { messageType } = message;
const { trackingId } = message;
const messageType = message.messageType;
const trackingId = message.trackingId;
const messagePayload = JSON.parse(message.messagePayload);
this.revitMessageReceivedSource.next({
messageType,
trackingId,
messagePayload,
messageType: messageType,
trackingId: trackingId,
messagePayload: messagePayload,
});
};
this.viewerVisible$.next(true);
}
newTrackingId():string {
this.trackingIdNumber += 1;
this.trackingIdNumber = this.trackingIdNumber + 1;
return String(this.trackingIdNumber);
}
}
@@ -39,16 +39,19 @@ const accessKeys = {
projectSearch: 5,
help: 6,
moreMenu: 7,
details: 8,
details: 8
};
// this could be extracted into a separate component if it grows
const accessibleListSelector = 'generic-table keyboard-accessible-list';
const accessibleListSelector = 'table.keyboard-accessible-list';
const accessibleRowSelector = 'table.keyboard-accessible-list tbody tr';
@Injectable({
providedIn: 'root',
providedIn: 'root'
})
export class KeyboardShortcutService {
// maybe move it to a .constant
private shortcuts:any = {
'?': () => this.showHelpModal(),
@@ -64,110 +67,114 @@ export class KeyboardShortcutService {
'g e': this.accessKey('edit'),
'g p': this.accessKey('preview'),
'd w p': this.accessKey('details'),
m: this.accessKey('moreMenu'),
p: this.accessKey('projectSearch'),
s: this.accessKey('quickSearch'),
k: () => this.focusPrevItem(),
j: () => this.focusNextItem(),
'm': this.accessKey('moreMenu'),
'p': this.accessKey('projectSearch'),
's': this.accessKey('quickSearch'),
'k': () => this.focusPrevItem(),
'j': () => this.focusNextItem()
};
constructor(private readonly PathHelper:PathHelperService,
private readonly FocusHelper:FocusHelperService,
private readonly currentProject:CurrentProjectService) {
private readonly FocusHelper:FocusHelperService,
private readonly currentProject:CurrentProjectService) {
this.register();
}
/**
* Register the keyboard shortcuts.
*/
public register():void {
public register() {
_.each(this.shortcuts, (action:() => void, key:string) => Mousetrap.bind(key, action));
}
public accessKey(keyName:'preview'|'newWorkPackage'|'edit'|'quickSearch'|'projectSearch'|'help'|'moreMenu'|'details'):() => void {
const key = accessKeys[keyName];
return () => {
// Guard: When the focus is on the IFC viewer, pressing the key "S" shall control the viewer as part of its
// WASD navigation. So dismiss that shortcuts and let the event pass on to the IFC viewer.
if (key === 4 &&
document.activeElement?.getAttribute('data-qa-selector') === 'op-ifc-viewer--model-canvas') {
return;
}
public accessKey(keyName:'preview'|'newWorkPackage'|'edit'|'quickSearch'|'projectSearch'|'help'|'moreMenu'|'details') {
var key = accessKeys[keyName];
// eslint-disable-next-line no-useless-concat
const elem:HTMLElement = document.querySelectorAll("[accesskey='" + `${key}` + "']")[0] as HTMLElement;
if (elem instanceof HTMLInputElement || elem.id === 'global-search-input') {
return () => {
var elem = jQuery('[accesskey=' + key + ']:first');
if (elem.is('input') || elem.attr('id') === 'global-search-input') {
// timeout with delay so that the key is not
// triggered on the input
setTimeout(() => this.FocusHelper.focus(jQuery(elem)), 200);
} else if (elem.getAttribute('href')) {
this.clickLink(elem);
setTimeout(() => this.FocusHelper.focus(elem), 200);
} else if (elem.is('[href]')) {
this.clickLink(elem[0]);
} else {
elem.click();
elem[0].click();
}
};
}
public globalAction(action:keyof PathHelperService):() => void {
public globalAction(action:keyof PathHelperService) {
return () => {
const url = (this.PathHelper[action] as any)();
var url = (this.PathHelper[action] as any)();
window.location.href = url;
};
}
public projectScoped(action:keyof PathHelperService):() => void {
public projectScoped(action:keyof PathHelperService) {
return () => {
const projectIdentifier = this.currentProject.identifier;
var projectIdentifier = this.currentProject.identifier;
if (projectIdentifier) {
const url = (this.PathHelper[action] as any)(projectIdentifier);
var url = (this.PathHelper[action] as any)(projectIdentifier);
window.location.href = url;
}
};
}
// eslint-disable-next-line class-methods-use-this
clickLink(link:HTMLElement):void {
if (!link.getAttribute('href')) {
return;
}
clickLink(link:any) {
const event = new MouseEvent('click', {
view: window,
bubbles: true,
cancelable: true,
cancelable: true
});
const cancelled = !link.dispatchEvent(event);
if (!cancelled) {
window.location.href = link.getAttribute('href') as string;
window.location.href = link.href;
}
}
showHelpModal():void {
showHelpModal() {
window.open(this.PathHelper.keyboardShortcutsHelpPath());
}
// eslint-disable-next-line class-methods-use-this
focusItemOffset(offset:number):void {
const list = document.getElementsByClassName(accessibleListSelector)[0];
findListInPage() {
const domLists = jQuery(accessibleListSelector);
const focusElements:any = [];
domLists.find('tbody tr').each(function (index, tr) {
var firstLink = jQuery(tr).find(':visible:tabbable')[0];
if (firstLink !== undefined) {
focusElements.push(firstLink);
}
});
return focusElements;
}
focusItemOffset(offset:number) {
const list = this.findListInPage();
let index;
if (list === null) {
return;
}
const rows:Element[] = Array.from(list.querySelectorAll('tbody > tr'));
let index:number;
if (document.activeElement) {
index = rows.indexOf(document.activeElement);
const target = rows[index + offset] as HTMLElement;
target.focus();
}
index = list.indexOf(
jQuery(document.activeElement!)
.closest(accessibleRowSelector)
.find(':visible:tabbable')[0]
);
const target = jQuery(list[(index + offset + list.length) % list.length]);
target.focus();
}
focusNextItem():void {
focusNextItem() {
this.focusItemOffset(1);
}
focusPrevItem():void {
focusPrevItem() {
this.focusItemOffset(-1);
}
}
@@ -13,7 +13,9 @@
--op-uc-heading-base: 1.8rem
--op-uc-heading-falloff: 0.85
display: block
overflow: hidden
overflow-x: hidden
overflow-y: auto
@include styled-scroll-bar
font-size: var(--wiki-default-font-size)
z-index: 0
padding-bottom: 1rem
@@ -28,4 +30,3 @@
&_no-permalinks *:hover .op-uc-link_permalink
display: none
@@ -100,7 +100,7 @@ describe 'BIM navigation spec',
details_view.go_back
details_view.expect_closed
card_view.expect_work_package_listed work_package
card_view.expect_work_package_listed(work_package)
# Go to viewer only
model_page.switch_view 'Viewer'
@@ -54,8 +54,12 @@ module Pages
end
def model_viewer_visible(visible)
selector = '[data-qa-selector="op-ifc-viewer--model-canvas"]'
expect(page).to (visible ? have_selector(selector, wait: 10) : have_no_selector(selector, wait: 10))
# Ensure the canvas is present
canvas_selector = '.op-ifc-viewer--model-canvas'
expect(page).to (visible ? have_selector(canvas_selector, wait: 10) : have_no_selector(canvas_selector, wait: 10))
# Ensure Xeokit is initialized. Only then the toolbar is generated.
toolbar_selector = '.xeokit-toolbar'
expect(page).to (visible ? have_selector(toolbar_selector, wait: 10) : have_no_selector(toolbar_selector, wait: 10))
end
def model_viewer_shows_a_toolbar(visible)
@@ -48,9 +48,8 @@ See COPYRIGHT and LICENSE files for more details.
<% end %>
<% end %>
<div class="wiki">
<div class="wiki op-uc-container">
<%= format_text @document.description, attachments: @document.attachments %>
</div>
<%= list_attachments(api_v3_document_resource(@document)) %>
@@ -69,7 +69,8 @@ module LdapGroups
##
# Create or update the synchronized group item
def create_or_update_sync_group(dn)
LdapGroups::SynchronizedGroup.find_or_initialize_by(dn: dn).tap do |sync|
group = LdapGroups::SynchronizedGroup
.find_or_initialize_by(dn: dn).tap do |sync|
# Always set the filter and auth source, in case multiple filters match the same group
# they are simply being re-assigned to the latest one
sync.filter_id = filter.id
@@ -78,6 +79,8 @@ module LdapGroups
# Tell the group to synchronize users if the filter has requested it to
sync.sync_users = filter.sync_users
end
group.tap { group.save! if group.persisted? }
end
##
@@ -43,7 +43,7 @@ module LdapGroups
def map_to_users(sync_group, entries)
create_missing!(entries) if sync_group.sync_users
User.where(login: entries.keys)
User.where('LOWER(login) IN (?)', entries.keys.map(&:downcase))
end
##
@@ -5,5 +5,6 @@ FactoryBot.define do
group_name_attribute { 'cn' }
base_dn { 'dc=example,dc=com' }
auth_source factory: :ldap_auth_source
sync_users { true }
end
end
@@ -3,5 +3,6 @@ FactoryBot.define do
dn { 'cn=foo,ou=groups,dc=example,dc=com' }
group factory: :group
auth_source factory: :ldap_auth_source
sync_users { true }
end
end
@@ -189,7 +189,6 @@ describe LdapGroups::SynchronizeGroupsService, with_ee: %i[ldap_groups] do
let(:user_aa729) { User.find_by login: 'aa729' }
let(:user_bb459) { User.find_by login: 'bb459' }
context 'and users sync in the groups enabled' do
let(:sync_users) { true }
@@ -222,7 +221,6 @@ describe LdapGroups::SynchronizeGroupsService, with_ee: %i[ldap_groups] do
let(:user_aa729) { User.find_by login: 'aa729' }
let(:user_bb459) { User.find_by login: 'bb459' }
context 'and users sync in the groups enabled' do
let(:sync_users) { true }
@@ -310,7 +308,7 @@ describe LdapGroups::SynchronizeGroupsService, with_ee: %i[ldap_groups] do
describe 'removing memberships' do
context 'with a user in a group thats not in ldap' do
let(:group_foo) { FactoryBot.create :group, lastname: 'foo_internal', members: [user_cc414, user_aa729] }
let(:manager) { FactoryBot.create :role, name: 'Manager' }
let(:manager) { FactoryBot.create :role, name: 'Manager' }
let(:project) { FactoryBot.create :project, name: 'Project 1', identifier: 'project1', members: { group_foo => [manager] } }
before do
@@ -375,4 +373,18 @@ describe LdapGroups::SynchronizeGroupsService, with_ee: %i[ldap_groups] do
end
end
end
context 'when one user does not match case' do
before do
group_foo
synced_foo
user_aa729.update_attribute(:login, 'Aa729')
end
it 'synchronized the membership of aa729 to foo' do
subject
expect(synced_foo.users.count).to eq(1)
expect(group_foo.users).to eq([user_aa729])
end
end
end
@@ -29,11 +29,11 @@ describe LdapGroups::SynchronizeFilterService, with_ee: %i[ldap_groups] do
let(:synced_foo) do
FactoryBot.create :ldap_synchronized_group, dn: 'cn=foo,ou=groups,dc=example,dc=com', group: group_foo,
auth_source: auth_source
auth_source: auth_source
end
let(:synced_bar) do
FactoryBot.create :ldap_synchronized_group, dn: 'cn=bar,ou=groups,dc=example,dc=com', group: group_bar,
auth_source: auth_source
auth_source: auth_source
end
let(:filter_foo_bar) { FactoryBot.create :ldap_synchronized_filter, auth_source: auth_source }
@@ -83,6 +83,33 @@ describe LdapGroups::SynchronizeFilterService, with_ee: %i[ldap_groups] do
end
end
describe 'when one group already exists with different settings' do
let(:synced_foo) do
FactoryBot.create :ldap_synchronized_group,
dn: 'cn=foo,ou=groups,dc=example,dc=com',
group: group_foo,
sync_users: false,
auth_source: auth_source
end
let(:filter_foo_bar) do
FactoryBot.create :ldap_synchronized_filter,
sync_users: true,
auth_source: auth_source
end
before do
synced_foo
end
it 'the group receives the value of the filter' do
expect(synced_foo.sync_users).to eq false
expect { subject }.not_to raise_error
synced_foo.reload
expect(synced_foo.sync_users).to eq true
end
end
describe 'when it has a group that no longer exists in ldap' do
let!(:group_doesnotexist) { FactoryBot.create :group, lastname: 'doesnotexist' }
let!(:synced_doesnotexist) do
@@ -32,18 +32,32 @@ require 'spec_helper'
shared_examples_for 'group contract' do
let(:group_name) { 'The group' }
let(:group_users_user_ids) { [42, 43] }
let(:group_users) do
[FactoryBot.build_stubbed(:group_user, user_id: 1),
FactoryBot.build_stubbed(:group_user, user_id: 2)]
group_users_user_ids.map { |id| FactoryBot.build_stubbed(:group_user, user_id: id) }
end
it_behaves_like 'contract is valid for active admins and invalid for regular users'
shared_context 'with real group users' do
# make sure users actually exist (not just stubbed) in this case
# so GroupUser validations checking for the existance of group and user don't fail
before do
group_users_user_ids.each do |id|
FactoryBot.create :user, id: id
end
end
end
it_behaves_like 'contract is valid for active admins and invalid for regular users' do
include_context 'with real group users'
end
describe 'validations' do
let(:current_user) { FactoryBot.build_stubbed :admin }
context 'name' do
context 'is valid' do
include_context 'with real group users'
it_behaves_like 'contract is valid'
end
+10
View File
@@ -73,6 +73,16 @@ describe Group, type: :model do
describe '#group_users' do
context 'when adding a user' do
context 'which does not exist' do
it 'does not create a group user' do
count = group.group_users.count
gu = group.group_users.create user_id: User.maximum(:id).to_i + 1
expect(gu).not_to be_valid
expect(group.group_users.count).to eq count
end
end
it 'updates the timestamp' do
updated_at = group.updated_at
group.group_users.create(user: user)
@@ -154,6 +154,34 @@ shared_examples 'it supports direct uploads' do
end
end
end
context 'with an attachment whitelist', with_settings: { attachment_whitelist: ['text/csv'] } do
context 'with an allowed content type' do
let(:metadata) { { fileName: 'cats.csv', fileSize: file.size, contentType: 'text/csv' } }
it 'should succeed' do
expect(subject.status).to eq 201
end
end
context 'with a forbidden content type' do
let(:metadata) { { fileName: 'cats.txt', fileSize: file.size, contentType: 'text/plain' } }
it 'should fail' do
expect(subject.status).to eq 422
expect(subject.body).to include "not whitelisted"
end
end
context 'with a non-specific content type not on the whitelist' do
let(:metadata) { { fileName: 'cats.bin', fileSize: file.size, contentType: 'application/binary' } }
# the actual whitelist check will be performed in the FinishDirectUpload job in this case
it 'should still succeed' do
expect(subject.status).to eq 201
end
end
end
end
end
end
@@ -31,8 +31,11 @@
require 'spec_helper'
describe Attachments::FinishDirectUploadJob, 'integration', type: :job do
shared_let(:user) { FactoryBot.create :admin }
let!(:pending_attachment) do
FactoryBot.create(:attachment,
author: user,
downloads: -1,
digest: '',
container: container)
@@ -131,4 +134,41 @@ describe Attachments::FinishDirectUploadJob, 'integration', type: :job do
it_behaves_like 'turning pending attachment into a standard attachment'
it_behaves_like "adding a journal to the attachment in the name of the attachment's author"
end
context 'with an incompatible attachment whitelist',
with_settings: { attachment_whitelist: %w[image/png] } do
let!(:container) { FactoryBot.create(:work_package) }
let!(:container_timestamp) { container.updated_at }
it "Does not save the attachment" do
allow(pending_attachment).to receive(:save!)
allow(OpenProject.logger).to receive(:error)
job.perform(pending_attachment.id)
expect(pending_attachment).not_to have_received(:save!)
expect(OpenProject.logger).to have_received(:error)
container.reload
expect(container.attachments).to be_empty
expect { pending_attachment.reload }.to raise_error(ActiveRecord::RecordNotFound)
end
end
context 'with the user not being allowed',
with_settings: { attachment_whitelist: %w[image/png] } do
shared_let(:user) { FactoryBot.create :user }
let!(:container) { FactoryBot.create(:work_package) }
it "Does not save the attachment" do
allow(pending_attachment).to receive(:save!)
job.perform(pending_attachment.id)
expect(pending_attachment).not_to have_received(:save!)
expect { pending_attachment.reload }.to raise_error(ActiveRecord::RecordNotFound)
end
end
end