diff --git a/.rubocop.yml b/.rubocop.yml
index 5b43d7a548b..c0ae3d84751 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -142,7 +142,7 @@ Naming/ClassAndModuleCamelCase:
Naming/FileName:
Enabled: false
-Naming/PredicateName:
+Naming/PredicatePrefix:
ForbiddenPrefixes:
- is_
diff --git a/Gemfile b/Gemfile
index fc11aebd50b..68f68299073 100644
--- a/Gemfile
+++ b/Gemfile
@@ -36,7 +36,7 @@ ruby File.read(File.expand_path(".ruby-version", __dir__)).strip
gem "actionpack-xml_parser", "~> 2.0.0"
gem "activemodel-serializers-xml", "~> 1.0.1"
-gem "activerecord-import", "~> 2.1.0"
+gem "activerecord-import", "~> 2.2.0"
gem "activerecord-session_store", "~> 2.2.0"
gem "ox"
gem "rails", "~> 8.0.1"
@@ -62,7 +62,7 @@ gem "friendly_id", "~> 5.5.0"
gem "acts_as_list", "~> 1.2.0"
gem "acts_as_tree", "~> 2.9.0"
gem "awesome_nested_set", "~> 3.8.0"
-gem "closure_tree", "~> 7.4.0"
+gem "closure_tree", "~> 8.0.0"
gem "rubytree", "~> 2.1.0"
# Only used in down migrations now.
# Is to be removed once the referencing migrations have been squashed.
@@ -225,7 +225,7 @@ gem "appsignal", "~> 3.10.0", require: false
# Yabeda integration
gem "yabeda-activerecord"
-gem "yabeda-prometheus-mmap"
+gem "yabeda-prometheus-mmap", require: false
gem "yabeda-puma-plugin"
gem "yabeda-rails"
@@ -400,7 +400,7 @@ platforms :mri, :mingw, :x64_mingw do
# Have application level locks on the database to have a mutex shared between workers/hosts.
# We e.g. employ this to safeguard the creation of journals.
- gem "with_advisory_lock", "~> 5.1.0"
+ gem "with_advisory_lock", "~> 5.3.0"
end
# Load Gemfile.modules explicitly to allow dependabot to work
diff --git a/Gemfile.lock b/Gemfile.lock
index 9a97dafb24a..fc992f36fa5 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -208,7 +208,7 @@ PATH
remote: modules/two_factor_authentication
specs:
openproject-two_factor_authentication (1.0.0)
- aws-sdk-sns (~> 1.99.0)
+ aws-sdk-sns (~> 1.100.0)
messagebird-rest (~> 1.4.2)
rotp (~> 6.1)
webauthn (~> 3.0)
@@ -289,7 +289,7 @@ GEM
activemodel (= 8.0.2)
activesupport (= 8.0.2)
timeout (>= 0.4.0)
- activerecord-import (2.1.0)
+ activerecord-import (2.2.0)
activerecord (>= 4.2)
activerecord-nulldb-adapter (1.1.1)
activerecord (>= 6.0, < 8.1)
@@ -342,26 +342,26 @@ GEM
activerecord (>= 4.0)
awesome_nested_set (3.8.0)
activerecord (>= 4.0.0, < 8.1)
- aws-eventstream (1.3.2)
- aws-partitions (1.1105.0)
- aws-sdk-core (3.224.0)
+ aws-eventstream (1.4.0)
+ aws-partitions (1.1115.0)
+ aws-sdk-core (3.225.2)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9)
base64
jmespath (~> 1, >= 1.6.1)
logger
- aws-sdk-kms (1.101.0)
- aws-sdk-core (~> 3, >= 3.216.0)
+ aws-sdk-kms (1.104.0)
+ aws-sdk-core (~> 3, >= 3.225.0)
aws-sigv4 (~> 1.5)
- aws-sdk-s3 (1.186.1)
- aws-sdk-core (~> 3, >= 3.216.0)
+ aws-sdk-s3 (1.189.1)
+ aws-sdk-core (~> 3, >= 3.225.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
- aws-sdk-sns (1.99.0)
- aws-sdk-core (~> 3, >= 3.216.0)
+ aws-sdk-sns (1.100.0)
+ aws-sdk-core (~> 3, >= 3.225.0)
aws-sigv4 (~> 1.5)
- aws-sigv4 (1.11.0)
+ aws-sigv4 (1.12.1)
aws-eventstream (~> 1, >= 1.0.2)
axe-core-api (4.10.3)
dumb_delegator
@@ -378,7 +378,7 @@ GEM
thread_safe (~> 0.3, >= 0.3.1)
base64 (0.2.0)
bcrypt (3.1.20)
- benchmark (0.4.0)
+ benchmark (0.4.1)
better_html (2.1.1)
actionview (>= 6.0)
activesupport (>= 6.0)
@@ -386,7 +386,7 @@ GEM
erubi (~> 1.4)
parser (>= 2.4)
smart_properties
- bigdecimal (3.2.0)
+ bigdecimal (3.2.1)
bindata (2.5.1)
bootsnap (1.18.6)
msgpack (~> 1.2)
@@ -416,13 +416,13 @@ GEM
carrierwave (>= 1.0.0)
fog-aws
cbor (0.5.9.8)
- cgi (0.4.2)
+ cgi (0.5.0)
childprocess (5.1.0)
logger (~> 1.5)
climate_control (1.2.0)
- closure_tree (7.4.0)
- activerecord (>= 4.2.10)
- with_advisory_lock (>= 4.0.0)
+ closure_tree (8.0.0)
+ activerecord (>= 7.1.0)
+ with_advisory_lock (>= 5.0.0, < 6.0.0)
coderay (1.1.3)
coercible (1.0.0)
descendants_tracker (~> 0.0.1)
@@ -450,7 +450,7 @@ GEM
crass (1.0.6)
css_parser (1.21.1)
addressable
- csv (3.3.4)
+ csv (3.3.5)
cuprite (0.17)
capybara (~> 3.0)
ferrum (~> 0.17.0)
@@ -626,7 +626,7 @@ GEM
fugit (>= 1.1)
railties (>= 6.0.0)
thor (>= 0.14.1)
- google-apis-core (0.17.0)
+ google-apis-core (0.18.0)
addressable (~> 2.5, >= 2.5.1)
googleauth (~> 1.9)
httpclient (>= 2.8.3, < 3.a)
@@ -636,7 +636,7 @@ GEM
retriable (>= 2.0, < 4.a)
google-apis-gmail_v1 (0.43.0)
google-apis-core (>= 0.15.0, < 2.a)
- google-cloud-env (2.3.0)
+ google-cloud-env (2.3.1)
base64 (~> 0.2)
faraday (>= 1.0, < 3.a)
google-logging-utils (0.2.0)
@@ -659,7 +659,7 @@ GEM
rack
gravatar_image_tag (1.2.0)
hana (1.3.7)
- hashdiff (1.1.2)
+ hashdiff (1.2.0)
hashery (2.1.2)
hashie (5.0.0)
highline (3.1.2)
@@ -784,7 +784,7 @@ GEM
mime-types (3.7.0)
logger
mime-types-data (~> 3.2025, >= 3.2025.0507)
- mime-types-data (3.2025.0527)
+ mime-types-data (3.2025.0603)
mini_magick (5.2.0)
benchmark
logger
@@ -953,7 +953,7 @@ GEM
date
stringio
public_suffix (6.0.2)
- puffing-billy (4.0.1)
+ puffing-billy (4.0.2)
addressable (~> 2.5)
em-http-request (~> 1.1, >= 1.1.0)
em-synchrony
@@ -967,12 +967,12 @@ GEM
puma (>= 5.0, < 7)
raabro (1.4.0)
racc (1.8.1)
- rack (2.2.15)
+ rack (2.2.17)
rack-attack (6.7.0)
rack (>= 1.0, < 4)
rack-cors (2.0.2)
rack (>= 2.0.0)
- rack-mini-profiler (3.3.1)
+ rack-mini-profiler (4.0.0)
rack (>= 1.2.0)
rack-oauth2 (2.2.1)
activesupport
@@ -1013,7 +1013,7 @@ GEM
actionpack (>= 5.0.1.rc1)
actionview (>= 5.0.1.rc1)
activesupport (>= 5.0.1.rc1)
- rails-dom-testing (2.2.0)
+ rails-dom-testing (2.3.0)
activesupport (>= 5.0.0)
minitest
nokogiri (>= 1.6)
@@ -1032,14 +1032,14 @@ GEM
thor (~> 1.0, >= 1.2.2)
zeitwerk (~> 2.6)
rainbow (3.1.1)
- rake (13.2.1)
+ rake (13.3.0)
rake-compiler-dock (1.9.1)
rb-fsevent (0.11.2)
rb-inotify (0.11.1)
ffi (~> 1.0)
- rb_sys (0.9.115)
+ rb_sys (0.9.116)
rake-compiler-dock (= 1.9.1)
- rbtrace (0.5.1)
+ rbtrace (0.5.2)
ffi (>= 1.0.6)
msgpack (>= 0.4.3)
optimist (>= 3.0.0)
@@ -1097,7 +1097,7 @@ GEM
rspec-support (3.13.4)
rspec-wait (1.0.1)
rspec (>= 3.4)
- rubocop (1.75.8)
+ rubocop (1.76.1)
json (~> 2.3)
language_server-protocol (~> 3.17.0.2)
lint_roller (~> 1.1.0)
@@ -1105,10 +1105,10 @@ GEM
parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 2.9.3, < 3.0)
- rubocop-ast (>= 1.44.0, < 2.0)
+ rubocop-ast (>= 1.45.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 4.0)
- rubocop-ast (1.44.1)
+ rubocop-ast (1.45.1)
parser (>= 3.3.7.2)
prism (~> 1.4)
rubocop-capybara (2.22.1)
@@ -1226,7 +1226,7 @@ GEM
openssl-signature_algorithm (~> 1.0)
trailblazer-option (0.1.2)
ttfunk (1.7.0)
- turbo-rails (2.0.13)
+ turbo-rails (2.0.16)
actionpack (>= 7.1.0)
railties (>= 7.1.0)
turbo_power (0.7.0)
@@ -1251,7 +1251,7 @@ GEM
public_suffix
vcr (6.3.1)
base64
- vernier (1.7.1)
+ vernier (1.8.0)
view_component (3.23.2)
activesupport (>= 5.2.0, < 8.1)
concurrent-ruby (~> 1)
@@ -1282,12 +1282,12 @@ GEM
hashdiff (>= 0.4.0, < 2.0.0)
webrick (1.9.1)
websocket (1.2.11)
- websocket-driver (0.7.7)
+ websocket-driver (0.8.0)
base64
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
will_paginate (4.0.1)
- with_advisory_lock (5.1.0)
+ with_advisory_lock (5.3.0)
activerecord (>= 6.1)
zeitwerk (>= 2.6)
xpath (3.2.0)
@@ -1333,7 +1333,7 @@ DEPENDENCIES
actionpack-xml_parser (~> 2.0.0)
active_record_doctor (~> 1.15.0)
activemodel-serializers-xml (~> 1.0.1)
- activerecord-import (~> 2.1.0)
+ activerecord-import (~> 2.2.0)
activerecord-nulldb-adapter (~> 1.1.1)
activerecord-session_store (~> 2.2.0)
acts_as_list (~> 1.2.0)
@@ -1358,7 +1358,7 @@ DEPENDENCIES
carrierwave (~> 1.3.4)
carrierwave_direct (~> 2.1.0)
climate_control
- closure_tree (~> 7.4.0)
+ closure_tree (~> 8.0.0)
colored2
commonmarker (~> 2.3.0)
compare-xml (~> 0.66)
@@ -1538,7 +1538,7 @@ DEPENDENCIES
warden-basic_auth (~> 0.2.1)
webmock (~> 3.12)
will_paginate (~> 4.0.0)
- with_advisory_lock (~> 5.1.0)
+ with_advisory_lock (~> 5.3.0)
yabeda-activerecord
yabeda-prometheus-mmap
yabeda-puma-plugin
@@ -1558,7 +1558,7 @@ CHECKSUMS
activemodel (8.0.2) sha256=0ae1fb7fa1fae0699ba041a9e97702df42ea3b13f2d39f2d0fde51fca5f0656c
activemodel-serializers-xml (1.0.3) sha256=fa1b16305e7254cc58a59c68833e3c0a593a59c8ab95d3be5aaea7cd9416c397
activerecord (8.0.2) sha256=793470b92c44e4198d0262ac60086b7822f0ea585079ad67e32a6e4c86f2d90a
- activerecord-import (2.1.0) sha256=7b1bc586c4b636e125c18f533c9ac4421dd2dbac8f4865dbf576382a338c2c94
+ activerecord-import (2.2.0) sha256=f8ca99b196e50775723d1f1d192c379f656378dc9f5628240992a0d78807fa4b
activerecord-nulldb-adapter (1.1.1) sha256=034c91106183b954b072fba14c2786adf1a2b9e852ce04f85f823afaf03e9820
activerecord-session_store (2.2.0) sha256=65918054573683bf4f87af89e765e1fece14c9d71cfac1f11abe4687c96e2743
activestorage (8.0.2) sha256=f83d221e0f06ae38f2200e55490bd155c76d0add330f6e300e8646048d672977
@@ -1577,21 +1577,21 @@ CHECKSUMS
attr_required (1.0.2) sha256=f0ebfc56b35e874f4d0ae799066dbc1f81efefe2364ca3803dc9ea6a4de6cb99
auto_strip_attributes (2.6.0) sha256=a7e2e0cf744de2bcd947fd68014220702bcc88c81274c1cd9ce6f7316aae39b0
awesome_nested_set (3.8.0) sha256=469daff411d80291dbb80d1973133e498048a7afc2519c545f62d2cdebc60eda
- aws-eventstream (1.3.2) sha256=7e2c3a55ca70d7861d5d3c98e47daa463ed539c349caba22b48305b8919572d7
- aws-partitions (1.1105.0) sha256=a68010773df339ffe8074eac22de4d08e5235a1b25a895c3b2cea73ec54a6ea1
- aws-sdk-core (3.224.0) sha256=c617aae3f43ba2bfe9f819c1a31c7c9dbda3e1d1a33c746c23c4dc15638817ac
- aws-sdk-kms (1.101.0) sha256=44d8b5b69ce7394cc02f30f9a35bea04ea12c947b5ffe1471535eea5119368d7
- aws-sdk-s3 (1.186.1) sha256=5b703b8aafc26ca4f3f927368412da5f4b8f74909bb0e4651eb8afe8aa105803
- aws-sdk-sns (1.99.0) sha256=a84cf111e375783f8d92093cb790757f6856acfe15cbf46a7f1a9868ded6ec0a
- aws-sigv4 (1.11.0) sha256=50a8796991a862324442036ad7a395920572b84bb6cd29b945e5e1800e8da1db
+ aws-eventstream (1.4.0) sha256=116bf85c436200d1060811e6f5d2d40c88f65448f2125bc77ffce5121e6e183b
+ aws-partitions (1.1115.0) sha256=787dc8a8d8db2aeb1474b4ee9a71e9f8b315d8109063fea0021030a6522f9e6c
+ aws-sdk-core (3.225.2) sha256=3ebed026b4bb527740cdf9f2a0c1b4a542d070ee015f8dd6bfc4c265d75dd4f8
+ aws-sdk-kms (1.104.0) sha256=d65f13254452a9648fc3557018214e4c1809224c8538de576dd079772f0390f4
+ aws-sdk-s3 (1.189.1) sha256=dd46336000eb3d78ff3ba4b648dd520c83c171ac29a04f13ddb08249fd1b7de4
+ aws-sdk-sns (1.100.0) sha256=706bb13c5da789a5b9c6219b397980645536dd7f7301c09fbb8d3e8613f65a96
+ aws-sigv4 (1.12.1) sha256=6973ff95cb0fd0dc58ba26e90e9510a2219525d07620c8babeb70ef831826c00
axe-core-api (4.10.3) sha256=6e10f3ed1c031804f16e8154d9d5dc658564d10850cee860e125fe665c3f0148
axe-core-rspec (4.10.3) sha256=ca21d0111e2d0fcd0f1da922c9071337336732aa6a3a8dc21bed94c9a701527e
axiom-types (0.1.1) sha256=c1ff113f3de516fa195b2db7e0a9a95fd1b08475a502ff660d04507a09980383
base64 (0.2.0) sha256=0f25e9b21a02a0cc0cea8ef92b2041035d39350946e8789c562b2d1a3da01507
bcrypt (3.1.20) sha256=8410f8c7b3ed54a3c00cd2456bf13917d695117f033218e2483b2e40b0784099
- benchmark (0.4.0) sha256=0f12f8c495545e3710c3e4f0480f63f06b4c842cc94cec7f33a956f5180e874a
+ benchmark (0.4.1) sha256=d4ef40037bba27f03b28013e219b950b82bace296549ec15a78016552f8d2cce
better_html (2.1.1) sha256=046c3551d1488a3f2939a7cac6fabf2bde08c32e135c91fcd683380118e5af55
- bigdecimal (3.2.0) sha256=f220c34e07d98b04e02eb23193bee436fab9afcd551f43dce8837a1b4aa80762
+ bigdecimal (3.2.1) sha256=1f68631e876c6aba8fe9b84b36983c55ad3293ff2d1ad4c6f115bde1e9d802e3
bindata (2.5.1) sha256=53186a1ec2da943d4cb413583d680644eb810aacbf8902497aac8f191fad9e58
bootsnap (1.18.6) sha256=0ae2393c1e911e38be0f24e9173e7be570c3650128251bf06240046f84a07d00
brakeman (7.0.2) sha256=b602d91bcec6c5ce4d4bc9e081e01f621c304b7a69f227d1e58784135f333786
@@ -1605,10 +1605,10 @@ CHECKSUMS
carrierwave (1.3.4) sha256=81772dabd1830edbd7f4526d2ae2c79f974f1d48900c3f03f7ecb7c657463a21
carrierwave_direct (2.1.0) sha256=b0d5c19c1d17a05940e488cff644a3b2946422d6d494b2174b48f6a90c5dddbf
cbor (0.5.9.8) sha256=9ee097fc58d9bc5e406d112cd2d4e112c7354ec16f8b6ff34e4732c1e44b4eb7
- cgi (0.4.2) sha256=a3cb190d46a820ca01a3e28bd5b64e67003ff99d7884b70512448566f35347e6
+ cgi (0.5.0) sha256=fe99f65bb2c146e294372ebb27602adbc3b4c008e9ea7038c6bd48c1ec9759da
childprocess (5.1.0) sha256=9a8d484be2fd4096a0e90a0cd3e449a05bc3aa33f8ac9e4d6dcef6ac1455b6ec
climate_control (1.2.0) sha256=36b21896193fa8c8536fa1cd843a07cf8ddbd03aaba43665e26c53ec1bd70aa5
- closure_tree (7.4.0) sha256=e39171bbe35de3c06898c3caf2d2949bba2d379aa78fc1a03c1c63f165c1d2b5
+ closure_tree (8.0.0) sha256=9f33c8b2511db80d3cb418cba34da85176585bb9f1077c5d58e873e2495dbbcb
coderay (1.1.3) sha256=dc530018a4684512f8f38143cd2a096c9f02a1fc2459edcfe534787a7fc77d4b
coercible (1.0.0) sha256=5081ad24352cc8435ce5472bc2faa30260c7ea7f2102cc6a9f167c4d9bffaadc
color_conversion (0.1.2) sha256=99bea5fa412e1527a11389975aa6ad445ff8528ebae202c11d08c45ea2b94c96
@@ -1629,7 +1629,7 @@ CHECKSUMS
crack (1.0.0) sha256=c83aefdb428cdc7b66c7f287e488c796f055c0839e6e545fec2c7047743c4a49
crass (1.0.6) sha256=dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d
css_parser (1.21.1) sha256=6cfd3ffc0a97333b39d2b1b49c95397b05e0e3b684d68f77ec471ba4ec2ef7c7
- csv (3.3.4) sha256=e96ecd5a8c3494aa5b596282249daba5c6033203c199248e6146e36d2a78d8cd
+ csv (3.3.5) sha256=6e5134ac3383ef728b7f02725d9872934f523cb40b961479f69cf3afa6c8e73f
cuprite (0.17) sha256=b140d5dc70d08b97ad54bcf45cd95d0bd430e291e9dffe76fff851fddd57c12b
daemons (1.4.1) sha256=8fc76d76faec669feb5e455d72f35bd4c46dc6735e28c420afb822fac1fa9a1d
dalli (3.2.8) sha256=2e63595084d91fae2655514a02c5d4fc0f16c0799893794abe23bf628bebaaa5
@@ -1703,9 +1703,9 @@ CHECKSUMS
globalid (1.2.1) sha256=70bf76711871f843dbba72beb8613229a49429d1866828476f9c9d6ccc327ce9
gon (6.4.0) sha256=e3a618d659392890f1aa7db420f17c75fd7d35aeb5f8fe003697d02c4b88d2f0
good_job (3.99.1) sha256=7d3869d8a8ee8ef7048fee5d746f41c21987b7822c20038a2f773036bef0830a
- google-apis-core (0.17.0) sha256=3d4408b26b3f4b517b869be3c5aba40db0e172b4481c20ff882ef47579dd08f8
+ google-apis-core (0.18.0) sha256=96b057816feeeab448139ed5b5c78eab7fc2a9d8958f0fbc8217dedffad054ee
google-apis-gmail_v1 (0.43.0) sha256=037a218338b2d40b31d6f4c9206e58a6e34062fceac8a310f8dbc92b1a2b947b
- google-cloud-env (2.3.0) sha256=db80b120fc163d1b83ffe8c0bc82e9ad0025ef0d51d987068c7278677ee5caf7
+ google-cloud-env (2.3.1) sha256=0faac01eb27be78c2591d64433663b1a114f8f7af55a4f819755426cac9178e7
google-logging-utils (0.2.0) sha256=675462b4ea5affa825a3442694ca2d75d0069455a1d0956127207498fca3df7b
googleauth (1.14.0) sha256=62e7de11791890c3d3dc70582dfd9ab5516530e4e4f56d96451fd62c76475149
grape (2.3.0) sha256=99484ae2907b06a9e109edf2911c383809bf7f7c00d65554e4d01f0388728bda
@@ -1713,7 +1713,7 @@ CHECKSUMS
gravatar_image_tag (1.2.0) sha256=eb5630fea846b711e713b934a0178fb9785f02f4eb9ced8d6faa4d537c40fdcf
grids (1.0.0)
hana (1.3.7) sha256=5425db42d651fea08859811c29d20446f16af196308162894db208cac5ce9b0d
- hashdiff (1.1.2) sha256=2c30eeded6ed3dce8401d2b5b99e6963fe5f14ed85e60dd9e33c545a44b71a77
+ hashdiff (1.2.0) sha256=c984f13e115bfc9953332e8e83bd9d769cfde9944e2d54e07eb9df7b76e140b5
hashery (2.1.2) sha256=d239cc2310401903f6b79d458c2bbef5bf74c46f3f974ae9c1061fb74a404862
hashie (5.0.0) sha256=9d6c4e51f2a36d4616cbc8a322d619a162d8f42815a792596039fc95595603da
highline (3.1.2) sha256=67cbd34d19f6ef11a7ee1d82ffab5d36dfd5b3be861f450fc1716c7125f4bb4a
@@ -1764,7 +1764,7 @@ CHECKSUMS
meta-tags (2.22.1) sha256=e5ae1febbd320d396c7226d7edb868e5d63466c14b9c8b06622a1a74e6dce354
method_source (1.1.0) sha256=181301c9c45b731b4769bc81e8860e72f9161ad7d66dd99103c9ab84f560f5c5
mime-types (3.7.0) sha256=dcebf61c246f08e15a4de34e386ebe8233791e868564a470c3fe77c00eed5e56
- mime-types-data (3.2025.0527) sha256=11808d780cdb27ea5db0143dbfc261b91ed63ec5e595f424a35f9822cb497a02
+ mime-types-data (3.2025.0603) sha256=00a122cf046ef3867c428ed5e6d97e759027b0caa375da7fba33a9799c8a3037
mini_magick (5.2.0) sha256=2757ffbfdb1d38242d1da9ff1505360ab75d59dc02eb7ab79ff6d5acb1243f4a
mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef
mini_portile2 (2.8.9) sha256=0cd7c7f824e010c072e33f68bc02d85a00aeb6fce05bb4819c03dfd3c140c289
@@ -1860,15 +1860,15 @@ CHECKSUMS
pry-rescue (1.6.0) sha256=985bfd506d9866b587fd86790cf8445266a41b7f92c627fc5b21ec7d92aba6db
psych (5.2.6) sha256=814328aa5dcb6d604d32126a20bc1cbcf05521a5b49dbb1a8b30a07e580f316e
public_suffix (6.0.2) sha256=bfa7cd5108066f8c9602e0d6d4114999a5df5839a63149d3e8b0f9c1d3558394
- puffing-billy (4.0.1) sha256=d23ea4b2fd54d6d213a85c4a1f603459d9b1634d93ac012dab59d36f380e778a
+ puffing-billy (4.0.2) sha256=c983610f737e3847301f64cf41dccd9dcedcac9219af54d6eaf8178cbe48b3cc
puma (6.6.0) sha256=f25c06873eb3d5de5f0a4ebc783acc81a4ccfe580c760cfe323497798018ad87
puma-plugin-statsd (2.6.0) sha256=c13ffe6a2fa2d3c245af673316e6d2556f5d0c151455d1934dffc96ce814ea03
raabro (1.4.0) sha256=d4fa9ff5172391edb92b242eed8be802d1934b1464061ae5e70d80962c5da882
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
- rack (2.2.15) sha256=cfd082f748540702228e9d83f16e033be9c3a3e58f428f60f6bce26df38c1067
+ rack (2.2.17) sha256=5fe02a1ca80d6fb2271dba00985ee2962d6f5620b6f46dfed89f5301ac4699dd
rack-attack (6.7.0) sha256=3ca47e8f66cd33b2c96af53ea4754525cd928ed3fa8da10ee6dad0277791d77c
rack-cors (2.0.2) sha256=415d4e1599891760c5dc9ef0349c7fecdf94f7c6a03e75b2e7c2b54b82adda1b
- rack-mini-profiler (3.3.1) sha256=2bf0de7d5795f54581e453b248e42cc50e8d0529efac73828653a9ad2407a801
+ rack-mini-profiler (4.0.0) sha256=c37bedcb7d01e33ad4addd8c4e742986e75db7cd8908cba3432c60b4e812e00f
rack-oauth2 (2.2.1) sha256=c73aa87c508043e2258f02b4fb110cacba9b37d2ccf884e22487d014a120d1a5
rack-protection (3.2.0) sha256=3c74ba7fc59066453d61af9bcba5b6fe7a9b3dab6f445418d3b391d5ea8efbff
rack-session (1.0.2) sha256=a02115e5420b4de036839b9811e3f7967d73446a554b42aa45106af335851d76
@@ -1878,17 +1878,17 @@ CHECKSUMS
rackup (1.0.1) sha256=ba86604a28989fe1043bff20d819b360944ca08156406812dca6742b24b3c249
rails (8.0.2) sha256=fdfaa5a83ec0388e02864e88d515959caedc88053b5f701c4deb1652d8f164c6
rails-controller-testing (1.0.5) sha256=741448db59366073e86fc965ba403f881c636b79a2c39a48d0486f2607182e94
- rails-dom-testing (2.2.0) sha256=e515712e48df1f687a1d7c380fd7b07b8558faa26464474da64183a7426fa93b
+ rails-dom-testing (2.3.0) sha256=8acc7953a7b911ca44588bf08737bc16719f431a1cc3091a292bca7317925c1d
rails-html-sanitizer (1.6.2) sha256=35fce2ca8242da8775c83b6ba9c1bcaad6751d9eb73c1abaa8403475ab89a560
rails-i18n (8.0.1) sha256=15303195450bdac9a80636cf14c7e5ada2f43907cc60fcd19bbb3f81ab45be0d
railties (8.0.2) sha256=0d7c3f40c49ba74980f1bac1d4bb153a9331c5ee8a9631d89c7bf79db82e5cf9
rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
- rake (13.2.1) sha256=46cb38dae65d7d74b6020a4ac9d48afed8eb8149c040eccf0523bec91907059d
+ rake (13.3.0) sha256=96f5092d786ff412c62fde76f793cc0541bd84d2eb579caa529aa8a059934493
rake-compiler-dock (1.9.1) sha256=e73720a29aba9c114728ce39cc0d8eef69ba61d88e7978c57bac171724cd4d53
rb-fsevent (0.11.2) sha256=43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe
rb-inotify (0.11.1) sha256=a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e
- rb_sys (0.9.115) sha256=4696a623b89131f4a12bd9e38710add1c64b478dc3d2e9275f61a65f42f743ec
- rbtrace (0.5.1) sha256=e8cba64d462bfb8ba102d7be2ecaacc789247d52ac587d8003549d909cb9c5dc
+ rb_sys (0.9.116) sha256=c879891018535d4362455197065ea580541b10ffdfa940bec512ec1dd9a7def4
+ rbtrace (0.5.2) sha256=a2d7d222ab81363aaa0e91337ddbf70df834885d401a80ea0339d86c71f31895
rbtree3 (0.7.1) sha256=ab60ead728a5491b70df4f4065e180b18dbab5319f817ce1dbf5dd906f26d8ba
rdoc (6.14.0) sha256=2c46de58d7129b8743fcf6d76e3db971bdc914150e15ac06b386549bd82ed7db
recaptcha (5.19.0) sha256=b69c021a5b788da06901d2c95ab86f10a8634e6496343096cc5167f0318b2a39
@@ -1914,8 +1914,8 @@ CHECKSUMS
rspec-retry (0.6.2) sha256=6101ba23a38809811ae3484acde4ab481c54d846ac66d5037ccb40131a60d858
rspec-support (3.13.4) sha256=184b1814f6a968102b57df631892c7f1990a91c9a3b9e80ef892a0fc2a71a3f7
rspec-wait (1.0.1) sha256=50ce9cc7cd20b8bb67b95a4ed56b59a16d4af7e86ae91b28dbf20eeaa2481d1f
- rubocop (1.75.8) sha256=c80ab4286c5dcfc49d7ad1787cdba5569b63b58c96ee7afde4ec47a9c8a85be9
- rubocop-ast (1.44.1) sha256=e3cc04203b2ef04f6d6cf5f85fe6d643f442b18cc3b23e3ada0ce5b6521b8e92
+ rubocop (1.76.1) sha256=e15a2d750794cf2157d2de8b1b403dfa71b8dc3957a22ae6043b1bdf21e7e0e7
+ rubocop-ast (1.45.1) sha256=94042e49adc17f187ba037b33f941ba7398fede77cdf4bffafba95190a473a3e
rubocop-capybara (2.22.1) sha256=ced88caef23efea53f46e098ff352f8fc1068c649606ca75cb74650970f51c0c
rubocop-factory_bot (2.27.1) sha256=9d744b5916778c1848e5fe6777cc69855bd96548853554ec239ba9961b8573fe
rubocop-openproject (0.2.0) sha256=2300ed6b638a34a9368b458dc5fb618ae396da6a27670b50519ad1e3cea65ccb
@@ -1971,7 +1971,7 @@ CHECKSUMS
tpm-key_attestation (0.14.0) sha256=d05cc52b397f89c36a7307407e0e84d3ea1c7afce50e0a70b146f8ab17d2bf4b
trailblazer-option (0.1.2) sha256=20e4f12ea4e1f718c8007e7944ca21a329eee4eed9e0fa5dde6e8ad8ac4344a3
ttfunk (1.7.0) sha256=2370ba484b1891c70bdcafd3448cfd82a32dd794802d81d720a64c15d3ef2a96
- turbo-rails (2.0.13) sha256=c40ac0a3ccd57c129925c8ac524a5dfd1e17fad080906e2d32135721a8bba22f
+ turbo-rails (2.0.16) sha256=d24e1b60f0c575b3549ecda967e5391027143f8220d837ed792c8d48ea0ea38d
turbo_power (0.7.0) sha256=ad95d147e0fa761d0023ad9ca00528c7b7ddf6bba8ca2e23755d5b21b290d967
turbo_tests (2.2.0)
typed_dag (2.0.2) sha256=b8dc65bf8cb5461715aa64650b7c96fc2075ef29fdd94554a93896c43453828c
@@ -1985,7 +1985,7 @@ CHECKSUMS
validate_email (0.1.6) sha256=9dfe9016d527b17a8d3a6e95e4dc50a125400eef899d13d4cc2a254393f82ee4
validate_url (1.0.15) sha256=72fe164c0713d63a9970bd6700bea948babbfbdcec392f2342b6704042f57451
vcr (6.3.1) sha256=37b56e157e720446a3f4d2d39919cabef8cb7b6c45936acffd2ef8229fec03ed
- vernier (1.7.1) sha256=3cb17d41a43f32a317d76bd8973eb94d2610e65c5442ebdec6accbfb0ed734a4
+ vernier (1.8.0) sha256=c6cf9555c2a58affc25ebc45de0b4d45a993eb078f88f14f5b45d7bacb25acdd
view_component (3.23.2) sha256=3c2fed4b9e38bf074fa3d42ca55eedbb2cc070e0f3c31d7c13a50b0db530892b
virtus (2.0.0) sha256=8841dae4eb7fcc097320ba5ea516bf1839e5d056c61ee27138aa4bddd6e3d1c2
warden (1.2.9) sha256=46684f885d35a69dbb883deabf85a222c8e427a957804719e143005df7a1efd0
@@ -1995,10 +1995,10 @@ CHECKSUMS
webmock (3.25.1) sha256=ab9d5d9353bcbe6322c83e1c60a7103988efc7b67cd72ffb9012629c3d396323
webrick (1.9.1) sha256=b42d3c94f166f3fb73d87e9b359def9b5836c426fc8beacf38f2184a21b2a989
websocket (1.2.11) sha256=b7e7a74e2410b5e85c25858b26b3322f29161e300935f70a0e0d3c35e0462737
- websocket-driver (0.7.7) sha256=056d99f2cd545712cfb1291650fde7478e4f2661dc1db6a0fa3b966231a146b4
+ websocket-driver (0.8.0) sha256=ed0dba4b943c22f17f9a734817e808bc84cdce6a7e22045f5315aa57676d4962
websocket-extensions (0.1.5) sha256=1c6ba63092cda343eb53fc657110c71c754c56484aad42578495227d717a8241
will_paginate (4.0.1) sha256=107b226ebe1d393d274575956a7c472e1eefdd97d8828e01b72d425d15a875b9
- with_advisory_lock (5.1.0) sha256=0692cd82013b271c59aa5e1f603b741ab94926dbce098990fbace5dd5412fed7
+ with_advisory_lock (5.3.0) sha256=bdb1864430853fe9081a7765f2d5b7cc42725c9ccf1901d20e9989828901b94e
xpath (3.2.0) sha256=6dfda79d91bb3b949b947ecc5919f042ef2f399b904013eb3ef6d20dd3a4082e
yabeda (0.13.1) sha256=3213025f22b7746602c8a4c41e2ed82d73a90bdc5489f6ef472142b06c1cf954
yabeda-activerecord (0.1.1) sha256=ae338213c264f20d8642e8bf47ac6058c49a6f7c8c00c892cd5765332914f45f
diff --git a/app/components/_index.sass b/app/components/_index.sass
index b85bb451e78..c0c27dc3275 100644
--- a/app/components/_index.sass
+++ b/app/components/_index.sass
@@ -4,6 +4,8 @@
@import "op_primer/border_box_table_component"
@import "op_primer/form_helpers"
@import "open_project/common/attribute_component"
+@import "open_project/common/attribute_help_text_component"
+@import "open_project/common/attribute_label_component"
@import "open_project/common/submenu_component"
@import "projects/row_component"
@import "projects/phases/hover_card_component"
diff --git a/app/components/admin/custom_fields/hierarchy/item_component.rb b/app/components/admin/custom_fields/hierarchy/item_component.rb
index 2e25f04aa65..ce06a4f79d6 100644
--- a/app/components/admin/custom_fields/hierarchy/item_component.rb
+++ b/app/components/admin/custom_fields/hierarchy/item_component.rb
@@ -98,7 +98,7 @@ module Admin
tag: :a,
content_arguments: { data: { turbo_frame: ItemsComponent.wrapper_key } },
href: new_child_custom_field_item_path(@root.custom_field_id, model.parent, position: model.sort_order)
- ) { _1.with_leading_visual_icon(icon: "fold-up") }
+ ) { it.with_leading_visual_icon(icon: "fold-up") }
end
def add_below_action_item(menu)
@@ -107,16 +107,18 @@ module Admin
tag: :a,
content_arguments: { data: { turbo_frame: ItemsComponent.wrapper_key } },
href: new_child_custom_field_item_path(@root.custom_field_id, model.parent, position: model.sort_order + 1)
- ) { _1.with_leading_visual_icon(icon: "fold-down") }
+ ) { it.with_leading_visual_icon(icon: "fold-down") }
end
def add_sub_item_action_item(menu)
+ position = model.children.any? ? model.children.maximum(:sort_order) + 1 : 0
+
menu.with_item(
label: I18n.t(:button_add_sub_item),
tag: :a,
content_arguments: { data: { turbo_frame: ItemsComponent.wrapper_key } },
- href: new_child_custom_field_item_path(@root.custom_field_id, model)
- ) { _1.with_leading_visual_icon(icon: "op-arrow-in") }
+ href: new_child_custom_field_item_path(@root.custom_field_id, model, position:)
+ ) { it.with_leading_visual_icon(icon: "op-arrow-in") }
end
def move_to_top_action_item(menu)
diff --git a/app/components/admin/custom_fields/hierarchy/items_component.rb b/app/components/admin/custom_fields/hierarchy/items_component.rb
index 89253771c21..bcfca71c8bb 100644
--- a/app/components/admin/custom_fields/hierarchy/items_component.rb
+++ b/app/components/admin/custom_fields/hierarchy/items_component.rb
@@ -60,7 +60,7 @@ module Admin
end
def item_header
- render(Primer::Beta::Breadcrumbs.new) do |loaf|
+ render(Primer::Beta::Breadcrumbs.new(data: { test_selector: "hierarchy-breadcrumbs" })) do |loaf|
slices.each do |slice|
loaf.with_item(href: slice[:href], target: nil) { slice[:label] }
end
diff --git a/app/components/admin/custom_fields/hierarchy/tree_view_component.html.erb b/app/components/admin/custom_fields/hierarchy/tree_view_component.html.erb
new file mode 100644
index 00000000000..ed3a1fff18c
--- /dev/null
+++ b/app/components/admin/custom_fields/hierarchy/tree_view_component.html.erb
@@ -0,0 +1,35 @@
+<%#-- copyright
+OpenProject is an open source project management software.
+Copyright (C) the OpenProject GmbH
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License version 3.
+
+OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+Copyright (C) 2006-2013 Jean-Philippe Lang
+Copyright (C) 2010-2013 the ChiliProject Team
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+See COPYRIGHT and LICENSE files for more details.
+
+++#%>
+<%= render(Primer::Beta::Heading.new(tag: :h3, font_size: 4, mb: 2)) { @custom_field.name } %>
+
+<%=
+ render(Primer::OpenProject::TreeView.new(node_variant: :anchor)) do |tree_view|
+ add_sub_tree(tree_view, hierarchy_items)
+ end
+%>
diff --git a/app/components/admin/custom_fields/hierarchy/tree_view_component.rb b/app/components/admin/custom_fields/hierarchy/tree_view_component.rb
new file mode 100644
index 00000000000..e99ab023524
--- /dev/null
+++ b/app/components/admin/custom_fields/hierarchy/tree_view_component.rb
@@ -0,0 +1,76 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+module Admin
+ module CustomFields
+ module Hierarchy
+ class TreeViewComponent < ApplicationComponent
+ def initialize(custom_field:, active_item:)
+ super
+
+ @custom_field = custom_field
+ @active_item = active_item
+ @hierarchy_service = ::CustomFields::Hierarchy::HierarchicalItemService.new
+ end
+
+ def hierarchy_items
+ hashed_hierarchy = @custom_field.hierarchy_root.hash_tree
+ hashed_hierarchy.nil? ? {} : hashed_hierarchy.first[1]
+ end
+
+ def add_sub_tree(tree, hierarchy_hash)
+ hierarchy_hash.each do |item, child_hash|
+ if child_hash.empty?
+ tree.with_leaf(**item_options(item))
+ else
+ expanded = child_hash.any? { |child, _| current?(child) }
+
+ tree.with_sub_tree(expanded: expanded, **item_options(item)) do |sub_tree|
+ add_sub_tree(sub_tree, child_hash)
+ end
+ end
+ end
+ end
+
+ def item_options(item)
+ {
+ label: item.label,
+ current: current?(item),
+ href: custom_field_item_path(@custom_field, item)
+ }
+ end
+
+ def current?(item)
+ item.id == @active_item.id
+ end
+ end
+ end
+ end
+end
diff --git a/app/components/application_component.rb b/app/components/application_component.rb
index 53dc6caf507..077111d26f2 100644
--- a/app/components/application_component.rb
+++ b/app/components/application_component.rb
@@ -42,6 +42,21 @@ class ApplicationComponent < ViewComponent::Base
end
class << self
+ ##
+ # Generates a unique identifier suitable for use as an HTML `id` attribute
+ # value. If passed a non-nil model instance, it will use the model's id to
+ # generate the identifier (see {ActiveModel::Conversion#to_param}).
+ # Otherwise, it will generate an identifier with random numbers.
+ #
+ # @see ActiveModel::Conversion#to_param
+ #
+ # @param [ActiveModel::Model] model an optional model instance.
+ # @param [String] base_name a prefix for the unique identifier.
+ # @return [String] a unique identifier.
+ def generate_id(model = nil, base_name: name.demodulize.underscore.dasherize)
+ "#{base_name}-#{model&.to_param || SecureRandom.uuid}"
+ end
+
##
# Defines options for this cell which can be used within the cell's template.
# Options are passed to the cell during the render call.
diff --git a/app/components/attribute_help_texts/show_dialog_component.html.erb b/app/components/attribute_help_texts/show_dialog_component.html.erb
new file mode 100644
index 00000000000..f5ad22ce1c1
--- /dev/null
+++ b/app/components/attribute_help_texts/show_dialog_component.html.erb
@@ -0,0 +1,33 @@
+<%=
+ render(Primer::Alpha::Dialog.new(id: dialog_id, title:, size: :large)) do |dialog|
+ dialog.with_header(variant: :large)
+
+ dialog.with_body do
+ concat(
+ render(Primer::Box.new(mt: 1, classes: "op-uc-container op-uc-container__no-permalinks")) do
+ helpers.format_text(@attribute_help_text, :help_text)
+ end
+ )
+
+ if has_attachments?
+ concat render(Primer::Beta::Heading.new(tag: :h4)) { I18n.t(:label_attachment_plural) }
+ concat helpers.list_attachments(resource_representer, inputs: { allowUploading: false })
+ end
+ end
+
+ dialog.with_footer(show_divider: true) do
+ if allowed_to_edit?
+ concat(
+ render(Primer::Beta::Button.new(tag: :a, href: edit_button_href)) do |button|
+ button.with_leading_visual_icon(icon: :pencil)
+ I18n.t(:button_edit)
+ end
+ )
+ end
+
+ concat(
+ render(Primer::Beta::Button.new(data: { close_dialog_id: dialog_id })) { I18n.t(:button_close) }
+ )
+ end
+ end
+%>
diff --git a/app/components/attribute_help_texts/show_dialog_component.rb b/app/components/attribute_help_texts/show_dialog_component.rb
new file mode 100644
index 00000000000..93ac44f425f
--- /dev/null
+++ b/app/components/attribute_help_texts/show_dialog_component.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+# -- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+# ++
+
+class AttributeHelpTexts::ShowDialogComponent < ApplicationComponent
+ include OpTurbo::Streamable
+
+ DIALOG_ID = "attribute-help-text-show-modal"
+
+ def initialize(attribute_help_text:, current_user: User.current)
+ super
+ @attribute_help_text = attribute_help_text
+ @current_user = current_user
+ end
+
+ private
+
+ def dialog_id = DIALOG_ID
+
+ def title = @attribute_help_text.attribute_caption
+
+ def has_attachments? = @attribute_help_text.attachments.any?
+
+ def allowed_to_edit? = @current_user.allowed_globally?(:edit_attribute_help_texts)
+
+ def edit_button_href = url_helpers.edit_attribute_help_text_path(@attribute_help_text)
+
+ def resource_representer
+ ::API::V3::HelpTexts::HelpTextRepresenter.new(@attribute_help_text, current_user: @current_user, embed_links: false)
+ end
+end
diff --git a/app/components/enterprise_edition/banner_component.rb b/app/components/enterprise_edition/banner_component.rb
index 9f778e107d2..80be876e196 100644
--- a/app/components/enterprise_edition/banner_component.rb
+++ b/app/components/enterprise_edition/banner_component.rb
@@ -44,7 +44,7 @@ module EnterpriseEdition
VARIANT_OPTIONS = %i[inline medium large].freeze
# @param feature_key [Symbol, NilClass] The key of the feature to show the banner for.
- # @param variant [Symbol, NilClass] The variant of the banner comopnent.
+ # @param variant [Symbol, NilClass] The variant of the banner component.
# @param image [String, NilClass] Path to the image to show on the banner, or nil.
# Only applicable and required when variant is :medium.
# @param video [String, NilClass] Path to the video to show on the banner, or nil.
@@ -55,7 +55,7 @@ module EnterpriseEdition
# @param show_always [boolean] Always show the banner, regardless of the dismissed or feature state.
# @param dismiss_key [String] Provide a string to identify this banner when being dismissed. Defaults to feature_key
# @param system_arguments [Hash] <%= link_to_system_arguments_docs %>
- def initialize(feature_key, # rubocop:disable Metrics/AbcSize
+ def initialize(feature_key,
variant: DEFAULT_VARIANT,
image: nil,
video: nil,
@@ -68,12 +68,15 @@ module EnterpriseEdition
@image = image
@video = video
@dismissable = dismissable
- @dismiss_key = dismiss_key
+ @dismiss_key = dismiss_key.to_s
+
@show_always = show_always
self.feature_key = feature_key
self.i18n_scope = i18n_scope
+ trial_overrides! if trial_feature?
+
if @variant == :medium && @image.nil?
raise ArgumentError, "The 'image' parameter is required when the variant is :medium."
end
@@ -82,17 +85,7 @@ module EnterpriseEdition
raise ArgumentError, "The 'video' parameter is required when the variant is :large."
end
- @system_arguments = system_arguments
- @system_arguments[:tag] = :div
- @system_arguments[:mb] ||= 2
- @system_arguments[:id] = "op-enterprise-banner-#{feature_key.to_s.tr('_', '-')}"
- @system_arguments[:test_selector] = "op-enterprise-banner"
- @system_arguments[:classes] = class_names(
- @system_arguments[:classes],
- "op-enterprise-banner",
- @variant == :medium ? "op-enterprise-banner_medium" : nil,
- @variant == :large ? "op-enterprise-banner_large" : nil
- )
+ set_system_arguments(system_arguments, feature_key)
super
end
@@ -115,15 +108,39 @@ module EnterpriseEdition
end
def wrapper_key
- "enterprise_banner_#{feature_key}"
+ "enterprise_banner_#{@dismiss_key}"
end
private
+ def set_system_arguments(system_arguments, feature_key)
+ @system_arguments = system_arguments
+ @system_arguments[:tag] = :div
+ @system_arguments[:mb] ||= 2
+ @system_arguments[:id] = "op-enterprise-banner-#{feature_key.to_s.tr('_', '-')}"
+ @system_arguments[:test_selector] = "op-enterprise-banner"
+ @system_arguments[:classes] = class_names(
+ @system_arguments[:classes],
+ "op-enterprise-banner",
+ "op-enterprise-banner_medium" => @variant == :medium,
+ "op-enterprise-banner_large" => @variant == :large,
+ "op-enterprise-banner_trial" => trial_feature?
+ )
+ end
+
+ def trial_overrides!
+ @dismissable = true
+ @dismiss_key += "_trial" unless @dismiss_key.end_with?("_trial")
+ @variant = :inline
+ end
+
def render?
return true if @show_always
+ return false if dismissed?
+ return true if feature_available? && trial_feature?
+ return false if EnterpriseToken.hide_banners?
- !(EnterpriseToken.hide_banners? || feature_available? || dismissed?)
+ !feature_available?
end
def feature_available?
@@ -135,5 +152,9 @@ module EnterpriseEdition
User.current.pref.dismissed_banner?(@dismiss_key)
end
+
+ def trial_feature?
+ EnterpriseToken.trialling?(feature_key)
+ end
end
end
diff --git a/app/components/enterprise_edition/upsell_buttons_component.rb b/app/components/enterprise_edition/upsell_buttons_component.rb
index 2eaf28d164b..82cce0f45cf 100644
--- a/app/components/enterprise_edition/upsell_buttons_component.rb
+++ b/app/components/enterprise_edition/upsell_buttons_component.rb
@@ -58,6 +58,7 @@ module EnterpriseEdition
def buttons
[
+ buy_now_button,
free_trial_button,
upgrade_now_button,
more_info_button
@@ -74,6 +75,20 @@ module EnterpriseEdition
)
end
+ def buy_now_button
+ return unless EnterpriseToken.active?
+ return unless User.current.admin?
+
+ render(Primer::Beta::Button.new(
+ classes: "upsell-colored-background",
+ tag: :a,
+ href: OpenProject::Enterprise.upgrade_path,
+ align_self: :center
+ )) do
+ I18n.t("ee.upsell.buy_now_button")
+ end
+ end
+
# Allow providing a custom upgrade now button
def upgrade_now_button
nil
diff --git a/app/components/open_project/common/attribute_help_text_component.html.erb b/app/components/open_project/common/attribute_help_text_component.html.erb
new file mode 100644
index 00000000000..f8d11778925
--- /dev/null
+++ b/app/components/open_project/common/attribute_help_text_component.html.erb
@@ -0,0 +1,6 @@
+<%=
+ render Primer::Beta::Link.new(**@system_arguments) do
+ render Primer::Beta::Octicon.new(:question, size: :xsmall)
+ end
+%>
+<%= render @tooltip %>
diff --git a/app/components/open_project/common/attribute_help_text_component.rb b/app/components/open_project/common/attribute_help_text_component.rb
new file mode 100644
index 00000000000..62a99304481
--- /dev/null
+++ b/app/components/open_project/common/attribute_help_text_component.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+module OpenProject
+ module Common
+ class AttributeHelpTextComponent < ApplicationComponent
+ def initialize(help_text:, **system_arguments) # rubocop:disable Metrics/AbcSize
+ super()
+
+ @help_text = help_text
+
+ @system_arguments = system_arguments
+ @system_arguments[:id] ||= self.class.generate_id(help_text)
+ @system_arguments[:classes] = class_names(
+ @system_arguments[:classes],
+ "op-attribute-help-text"
+ )
+ @system_arguments[:data] ||= {}
+ @system_arguments[:data][:controller] = "async-dialog"
+
+ @tooltip = Primer::Alpha::Tooltip.new(
+ for_id: @system_arguments[:id],
+ type: :label,
+ text: I18n.t("js.help_texts.show_modal"),
+ direction: :sw
+ )
+ @system_arguments[:aria] ||= {}
+ @system_arguments[:aria][:labelledby] = @tooltip.id
+ end
+
+ private
+
+ def render?
+ @help_text.present?
+ end
+
+ def before_render
+ return unless @help_text
+
+ @system_arguments[:href] = show_dialog_attribute_help_text_path(@help_text)
+ end
+ end
+ end
+end
diff --git a/app/components/open_project/common/attribute_help_text_component.sass b/app/components/open_project/common/attribute_help_text_component.sass
new file mode 100644
index 00000000000..bc659993cb4
--- /dev/null
+++ b/app/components/open_project/common/attribute_help_text_component.sass
@@ -0,0 +1,30 @@
+//-- copyright
+// OpenProject is an open source project management software.
+// Copyright (C) the OpenProject GmbH
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License version 3.
+//
+// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+// Copyright (C) 2006-2013 Jean-Philippe Lang
+// Copyright (C) 2010-2013 the ChiliProject Team
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// See COPYRIGHT and LICENSE files for more details.
+//++
+
+.op-attribute-help-text
+ line-height: 1rem
diff --git a/app/components/open_project/common/attribute_label_component.html.erb b/app/components/open_project/common/attribute_label_component.html.erb
new file mode 100644
index 00000000000..c4d4bf4fd6a
--- /dev/null
+++ b/app/components/open_project/common/attribute_label_component.html.erb
@@ -0,0 +1,4 @@
+<%= render Primer::ConditionalWrapper.new(condition: !@tag.nil?, trim: true, **@system_arguments) do %>
+ <%= content %>
+ <%= render OpenProject::Common::AttributeHelpTextComponent.new(help_text: @help_text) if @help_text.present? %>
+<% end %>
diff --git a/app/components/open_project/common/attribute_label_component.rb b/app/components/open_project/common/attribute_label_component.rb
new file mode 100644
index 00000000000..dbc84503cc0
--- /dev/null
+++ b/app/components/open_project/common/attribute_label_component.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+module OpenProject
+ module Common
+ class AttributeLabelComponent < ApplicationComponent
+ def initialize(
+ attribute:,
+ model:,
+ tag: :span,
+ current_user: User.current,
+ **system_arguments
+ )
+ super()
+
+ @tag = tag
+ @system_arguments = system_arguments
+ @system_arguments[:tag] = @tag
+ @system_arguments[:classes] = class_names(
+ @system_arguments[:classes],
+ "op-attribute-label"
+ )
+
+ @help_text = ::AttributeHelpText.for(model)
+ &.cached(current_user)
+ &.[](attribute.to_s)
+ end
+ end
+ end
+end
diff --git a/app/components/open_project/common/attribute_label_component.sass b/app/components/open_project/common/attribute_label_component.sass
new file mode 100644
index 00000000000..06b81126d13
--- /dev/null
+++ b/app/components/open_project/common/attribute_label_component.sass
@@ -0,0 +1,34 @@
+//-- copyright
+// OpenProject is an open source project management software.
+// Copyright (C) the OpenProject GmbH
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License version 3.
+//
+// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+// Copyright (C) 2006-2013 Jean-Philippe Lang
+// Copyright (C) 2010-2013 the ChiliProject Team
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// See COPYRIGHT and LICENSE files for more details.
+//++
+
+.op-attribute-label
+ display: inline-flex
+
+ > .op-attribute-help-text
+ align-self: baseline
+ margin-left: var(--base-size-6)
diff --git a/app/components/projects/settings/life_cycle_steps/index_component.html.erb b/app/components/projects/settings/life_cycle/index_component.html.erb
similarity index 97%
rename from app/components/projects/settings/life_cycle_steps/index_component.html.erb
rename to app/components/projects/settings/life_cycle/index_component.html.erb
index 4f9ce4fa6f7..c3b867a620e 100644
--- a/app/components/projects/settings/life_cycle_steps/index_component.html.erb
+++ b/app/components/projects/settings/life_cycle/index_component.html.erb
@@ -78,7 +78,7 @@
data: { "projects--settings--border-box-filter-target": "searchItem" },
test_selector: "project-life-cycle-step-#{definition.id}"
) do
- render(Projects::Settings::LifeCycleSteps::StepComponent.new(definition:, active?: active))
+ render(Projects::Settings::LifeCycle::PhaseComponent.new(definition:, active?: active))
end
end
end
diff --git a/app/components/projects/settings/life_cycle_steps/index_component.rb b/app/components/projects/settings/life_cycle/index_component.rb
similarity index 98%
rename from app/components/projects/settings/life_cycle_steps/index_component.rb
rename to app/components/projects/settings/life_cycle/index_component.rb
index d747a35cfc4..a90c57804ee 100644
--- a/app/components/projects/settings/life_cycle_steps/index_component.rb
+++ b/app/components/projects/settings/life_cycle/index_component.rb
@@ -28,7 +28,7 @@
module Projects
module Settings
- module LifeCycleSteps
+ module LifeCycle
class IndexComponent < ApplicationComponent
include ApplicationHelper
include OpPrimer::ComponentHelpers
diff --git a/app/components/projects/settings/life_cycle_steps/index_page_header_component.html.erb b/app/components/projects/settings/life_cycle/index_page_header_component.html.erb
similarity index 100%
rename from app/components/projects/settings/life_cycle_steps/index_page_header_component.html.erb
rename to app/components/projects/settings/life_cycle/index_page_header_component.html.erb
diff --git a/app/components/projects/settings/life_cycle_steps/index_page_header_component.rb b/app/components/projects/settings/life_cycle/index_page_header_component.rb
similarity index 97%
rename from app/components/projects/settings/life_cycle_steps/index_page_header_component.rb
rename to app/components/projects/settings/life_cycle/index_page_header_component.rb
index 8be423936db..3a42453ac37 100644
--- a/app/components/projects/settings/life_cycle_steps/index_page_header_component.rb
+++ b/app/components/projects/settings/life_cycle/index_page_header_component.rb
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
# ++
-module Projects::Settings::LifeCycleSteps
+module Projects::Settings::LifeCycle
class IndexPageHeaderComponent < ApplicationComponent
include ApplicationHelper
diff --git a/app/components/projects/settings/life_cycle_steps/step_component.html.erb b/app/components/projects/settings/life_cycle/phase_component.html.erb
similarity index 97%
rename from app/components/projects/settings/life_cycle_steps/step_component.html.erb
rename to app/components/projects/settings/life_cycle/phase_component.html.erb
index c198e9f52bf..9532a793670 100644
--- a/app/components/projects/settings/life_cycle_steps/step_component.html.erb
+++ b/app/components/projects/settings/life_cycle/phase_component.html.erb
@@ -7,7 +7,7 @@
render(
Projects::PhaseDefinitionComponent.new(
definition,
- edit_link: User.current.admin?,
+ edit_link: definition_editable?,
phase_text_options: { classes: "filter-target-visible-text" }
)
)
diff --git a/app/components/projects/settings/life_cycle_steps/step_component.rb b/app/components/projects/settings/life_cycle/phase_component.rb
similarity index 87%
rename from app/components/projects/settings/life_cycle_steps/step_component.rb
rename to app/components/projects/settings/life_cycle/phase_component.rb
index 2dd0f59b647..3d00283072b 100644
--- a/app/components/projects/settings/life_cycle_steps/step_component.rb
+++ b/app/components/projects/settings/life_cycle/phase_component.rb
@@ -28,11 +28,12 @@
module Projects
module Settings
- module LifeCycleSteps
- class StepComponent < ApplicationComponent
+ module LifeCycle
+ class PhaseComponent < ApplicationComponent
include ApplicationHelper
include OpPrimer::ComponentHelpers
include OpTurbo::Streamable
+ include Projects::LifeCycleDefinitionHelper
options :definition,
:active?
@@ -40,6 +41,10 @@ module Projects
def toggle_aria_label
I18n.t("projects.settings.life_cycle.step.use_in_project", step: definition.name)
end
+
+ def definition_editable?
+ User.current.admin? && allowed_to_customize_life_cycle?
+ end
end
end
end
diff --git a/app/components/settings/project_life_cycle_step_definitions/index_component.html.erb b/app/components/settings/project_life_cycle_step_definitions/index_component.html.erb
index e6a8145822c..93bfb3498fb 100644
--- a/app/components/settings/project_life_cycle_step_definitions/index_component.html.erb
+++ b/app/components/settings/project_life_cycle_step_definitions/index_component.html.erb
@@ -31,7 +31,14 @@ See COPYRIGHT and LICENSE files for more details.
component_wrapper do
flex_layout(data: wrapper_data_attributes) do |flex|
flex.with_row do
- if allowed_to_customize_life_cycle?
+ render EnterpriseEdition::BannerComponent.new(:customize_life_cycle,
+ variant: :medium,
+ image: "enterprise/project-lifecycle.png",
+ mb: 3)
+ end
+
+ if allowed_to_customize_life_cycle?
+ flex.with_row do
render(Primer::OpenProject::SubHeader.new) do |subheader|
subheader.with_filter_input(
name: "border-box-filter",
@@ -57,11 +64,6 @@ See COPYRIGHT and LICENSE files for more details.
I18n.t("settings.project_phase_definitions.label_add")
end
end
- else
- render EnterpriseEdition::BannerComponent.new(:customize_life_cycle,
- variant: :medium,
- image: "enterprise/project-lifecycle.png",
- mb: 3)
end
end
diff --git a/app/components/shares/modal_body_component.html.erb b/app/components/shares/modal_body_component.html.erb
index 3bc42afca95..7612091818c 100644
--- a/app/components/shares/modal_body_component.html.erb
+++ b/app/components/shares/modal_body_component.html.erb
@@ -7,7 +7,8 @@
end
end
- render(strategy.manage_shares_component(modal_content:, errors:))
+ render(strategy.upsell_banner(modal_content:))
+ render(strategy.manage_shares_component(modal_content:, errors:)) if strategy.allow_feature?
end
end
%>
diff --git a/app/components/shares/work_packages/modal_upsell_component.html.erb b/app/components/shares/work_packages/modal_upsell_component.html.erb
index b283aba4e06..f10285902d1 100644
--- a/app/components/shares/work_packages/modal_upsell_component.html.erb
+++ b/app/components/shares/work_packages/modal_upsell_component.html.erb
@@ -1,5 +1,7 @@
<%=
component_wrapper(tag: "turbo-frame") do
- render(EnterpriseEdition::BannerComponent.new(:work_package_sharing))
+ modal_content.with_row do
+ render(EnterpriseEdition::BannerComponent.new(:work_package_sharing))
+ end
end
%>
diff --git a/app/components/shares/work_packages/modal_upsell_component.rb b/app/components/shares/work_packages/modal_upsell_component.rb
index 3b9efbb5a81..a26e98f422c 100644
--- a/app/components/shares/work_packages/modal_upsell_component.rb
+++ b/app/components/shares/work_packages/modal_upsell_component.rb
@@ -33,6 +33,14 @@ module Shares
include OpTurbo::Streamable
include OpPrimer::ComponentHelpers
+ def initialize(modal_content:)
+ super
+
+ @modal_content = modal_content
+ end
+
+ attr_reader :modal_content
+
def self.wrapper_key
"share_modal_body"
end
diff --git a/app/components/work_packages/reminder/modal_body_component.rb b/app/components/work_packages/reminder/modal_body_component.rb
index b723e462197..1b06316f337 100644
--- a/app/components/work_packages/reminder/modal_body_component.rb
+++ b/app/components/work_packages/reminder/modal_body_component.rb
@@ -36,15 +36,17 @@ module WorkPackages
include OpPrimer::ComponentHelpers
FORM_ID = "reminder-form"
+ DEFAULT_TIME = "09:00"
- attr_reader :remindable, :reminder, :errors
+ attr_reader :remindable, :reminder, :errors, :preset
- def initialize(remindable:, reminder:, errors: nil)
+ def initialize(remindable:, reminder:, errors: nil, preset: nil)
super
@remindable = remindable
@reminder = reminder
@errors = errors
+ @preset = preset
end
class << self
@@ -55,9 +57,9 @@ module WorkPackages
def submit_path
if @reminder.persisted?
- work_package_reminder_path(@remindable, @reminder)
+ url_helpers.work_package_reminder_path(@remindable, @reminder)
else
- work_package_reminders_path(@remindable)
+ url_helpers.work_package_reminders_path(@remindable)
end
end
@@ -82,11 +84,32 @@ module WorkPackages
end
def remind_at_date_initial_value
- format_time_as_date(@reminder.remind_at, format: "%Y-%m-%d")
+ return time_as_date(@reminder.remind_at) if @reminder.remind_at
+ return calculate_preset_date if @preset
+
+ nil
end
def remind_at_time_initial_value
- format_time(@reminder.remind_at, include_date: false, format: "%H:%M")
+ return format_time(@reminder.remind_at, include_date: false, format: "%H:%M") if @reminder.remind_at
+
+ DEFAULT_TIME
+ end
+
+ private
+
+ def calculate_preset_date
+ case @preset
+ when "tomorrow" then time_as_date(1.day.from_now)
+ when "three_days" then time_as_date(3.days.from_now)
+ when "week" then time_as_date(7.days.from_now)
+ when "month" then time_as_date(1.month.from_now)
+ when "custom" then nil
+ end
+ end
+
+ def time_as_date(time)
+ format_time_as_date(time, format: "%Y-%m-%d")
end
end
end
diff --git a/app/contracts/project_life_cycle_steps/activation_contract.rb b/app/contracts/project_phases/activation_contract.rb
similarity index 98%
rename from app/contracts/project_life_cycle_steps/activation_contract.rb
rename to app/contracts/project_phases/activation_contract.rb
index b120150633a..c236b966b43 100644
--- a/app/contracts/project_life_cycle_steps/activation_contract.rb
+++ b/app/contracts/project_phases/activation_contract.rb
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-module ProjectLifeCycleSteps
+module ProjectPhases
class ActivationContract < ::ModelContract
alias_method :project, :model
diff --git a/app/contracts/project_life_cycle_steps/base_contract.rb b/app/contracts/project_phases/base_contract.rb
similarity index 98%
rename from app/contracts/project_life_cycle_steps/base_contract.rb
rename to app/contracts/project_phases/base_contract.rb
index f2011f634f8..7edc9853497 100644
--- a/app/contracts/project_life_cycle_steps/base_contract.rb
+++ b/app/contracts/project_phases/base_contract.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-module ProjectLifeCycleSteps
+module ProjectPhases
class BaseContract < ::ModelContract
validate :validate_edit_project_phases_permission
diff --git a/app/contracts/project_phases/reschedule_contract.rb b/app/contracts/project_phases/reschedule_contract.rb
new file mode 100644
index 00000000000..7e647eac38f
--- /dev/null
+++ b/app/contracts/project_phases/reschedule_contract.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+module ProjectPhases
+ class RescheduleContract < BaseContract
+ alias_method :project, :model
+
+ protected
+
+ def validate_model?
+ false
+ end
+ end
+end
diff --git a/app/contracts/project_life_cycle_steps/update_contract.rb b/app/contracts/project_phases/update_contract.rb
similarity index 99%
rename from app/contracts/project_life_cycle_steps/update_contract.rb
rename to app/contracts/project_phases/update_contract.rb
index f68d18552c0..cf98a6adb28 100644
--- a/app/contracts/project_life_cycle_steps/update_contract.rb
+++ b/app/contracts/project_phases/update_contract.rb
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-module ProjectLifeCycleSteps
+module ProjectPhases
class UpdateContract < BaseContract
validate :validate_start_after_preceeding_phases
validate :validate_start_date_is_a_working_day
diff --git a/app/contracts/queries/base_contract.rb b/app/contracts/queries/base_contract.rb
index f1b79d81909..380077e95f1 100644
--- a/app/contracts/queries/base_contract.rb
+++ b/app/contracts/queries/base_contract.rb
@@ -69,7 +69,7 @@ module Queries
end
def project_visible?
- Project.visible(user).exists?(id: project_id)
+ ::Project.visible(user).exists?(id: project_id)
end
def may_not_manage_queries?
diff --git a/app/contracts/settings/working_days_and_hours_params_contract.rb b/app/contracts/settings/working_days_and_hours_params_contract.rb
index e2abe706095..ad98dc35aae 100644
--- a/app/contracts/settings/working_days_and_hours_params_contract.rb
+++ b/app/contracts/settings/working_days_and_hours_params_contract.rb
@@ -66,8 +66,15 @@ module Settings
end
def unique_job
- WorkPackages::ApplyWorkingDaysChangeJob.new.check_concurrency do
- errors.add :base, :previous_working_day_changes_unprocessed
+ [
+ Projects::Phases::ApplyWorkingDaysChangeJob,
+ WorkPackages::ApplyWorkingDaysChangeJob
+ ].each do |job_class|
+ job_class.new.check_concurrency do
+ errors.add :base, :previous_working_day_changes_unprocessed
+ end
+
+ break if errors.added? :base, :previous_working_day_changes_unprocessed
end
end
diff --git a/app/contracts/work_packages/copy_contract.rb b/app/contracts/work_packages/copy_contract.rb
index 8b41516579d..da6de498dd7 100644
--- a/app/contracts/work_packages/copy_contract.rb
+++ b/app/contracts/work_packages/copy_contract.rb
@@ -37,10 +37,19 @@ module WorkPackages
attribute :done_ratio,
writable: true
+ # Use the default permission for the create contract, which is :add_work_packages.
+ attribute_permission :project_phase_definition_id, :add_work_packages
+
# Do not validate predecessors or children presence when copying: when
# copying, it's possible to create a work package in automatic scheduling
# mode even if it has no predecessors or children yet. They will be added
# later in the process.
def validate_has_predecessors_or_children; end
+
+ # No validation happening on whether the phase is active in the project.
+ # When copying a work package, e.g. from a project template, the phase
+ # might not be active in the project yet. But when it is activated later,
+ # the value should then be present.
+ def validate_phase_active_in_project; end
end
end
diff --git a/app/controllers/attribute_help_texts_controller.rb b/app/controllers/attribute_help_texts_controller.rb
index cf5fb015493..d9f970788f3 100644
--- a/app/controllers/attribute_help_texts_controller.rb
+++ b/app/controllers/attribute_help_texts_controller.rb
@@ -27,17 +27,29 @@
#++
class AttributeHelpTextsController < ApplicationController
+ include OpTurbo::ComponentStream
+ include OpTurbo::DialogStreamHelper
+
layout "admin"
menu_item :attribute_help_texts
- before_action :authorize_global
+ before_action :authorize_global, except: :show_dialog
before_action :find_entry, only: %i(edit update destroy)
before_action :find_type_scope
+ authorization_checked! :show_dialog
+
def index
@texts_by_type = AttributeHelpText.all_by_scope
end
+ def show_dialog
+ @attribute_help_text = AttributeHelpText.visible(current_user).find(params[:id])
+ respond_with_dialog(
+ AttributeHelpTexts::ShowDialogComponent.new(attribute_help_text: @attribute_help_text)
+ )
+ end
+
def new
@attribute_help_text = AttributeHelpText.new type: @attribute_scope
end
diff --git a/app/controllers/my/enterprise_banners_controller.rb b/app/controllers/my/enterprise_banners_controller.rb
index e627b18ae77..c9cca555a87 100644
--- a/app/controllers/my/enterprise_banners_controller.rb
+++ b/app/controllers/my/enterprise_banners_controller.rb
@@ -47,9 +47,13 @@ class My::EnterpriseBannersController < ApplicationController
def dismiss
pref = User.current.pref
- pref.dismiss_banner(@feature_key)
+ pref.dismiss_banner(@dismiss_key)
if pref.save
- remove_via_turbo_stream(component: EnterpriseEdition::BannerComponent.new(@feature_key))
+ remove_via_turbo_stream(component: EnterpriseEdition::BannerComponent.new(
+ @feature_key,
+ dismiss_key: @dismiss_key,
+ show_always: true
+ ))
respond_with_turbo_streams
else
respond_with_flash_error(message: call.message)
@@ -59,7 +63,11 @@ class My::EnterpriseBannersController < ApplicationController
private
def get_feature_key
- @feature_key = params[:feature_key].to_sym
+ raw_key = params[:feature_key]
+
+ @dismiss_key = raw_key
+ @feature_key = raw_key.gsub(/_trial$/, "").to_sym
+
render_400 unless OpenProject::Token.lowest_plan_for(@feature_key)
end
end
diff --git a/app/controllers/projects/settings/life_cycle_steps_controller.rb b/app/controllers/projects/settings/life_cycle_steps_controller.rb
index 263866e74c6..55d2543f977 100644
--- a/app/controllers/projects/settings/life_cycle_steps_controller.rb
+++ b/app/controllers/projects/settings/life_cycle_steps_controller.rb
@@ -66,7 +66,7 @@ class Projects::Settings::LifeCycleStepsController < Projects::SettingsControlle
end
def set_steps_active_status(definitions, active:)
- ::ProjectLifeCycleSteps::ActivationService
+ ::ProjectPhases::ActivationService
.new(user: current_user, project: @project, definitions:)
.call(active:)
end
diff --git a/app/controllers/work_packages/reminders_controller.rb b/app/controllers/work_packages/reminders_controller.rb
index 43fe55baa37..2caec8c52fb 100644
--- a/app/controllers/work_packages/reminders_controller.rb
+++ b/app/controllers/work_packages/reminders_controller.rb
@@ -40,7 +40,8 @@ class WorkPackages::RemindersController < ApplicationController
def modal_body
render modal_component_class.new(
remindable: @work_package,
- reminder: @reminder
+ reminder: @reminder,
+ preset: params[:preset]
)
end
diff --git a/app/forms/application_form.rb b/app/forms/application_form.rb
index 87a6882aa5e..a45ed39c78d 100644
--- a/app/forms/application_form.rb
+++ b/app/forms/application_form.rb
@@ -29,6 +29,8 @@
#++
class ApplicationForm < Primer::Forms::Base
+ include AttributeHelpTexts::FormHelper
+
def self.settings_form
form do |f|
f = Settings::FormDecorator.new(f)
@@ -41,9 +43,7 @@ class ApplicationForm < Primer::Forms::Base
end
# @return [ActionView::Base] the view helper instance
- def helpers
- @view_context.helpers
- end
+ delegate :helpers, to: :@view_context
# @return [ActiveRecord::Base] the model instance given to the form builder
def model
diff --git a/app/forms/attribute_help_texts/form_helper.rb b/app/forms/attribute_help_texts/form_helper.rb
new file mode 100644
index 00000000000..ced8acacdb7
--- /dev/null
+++ b/app/forms/attribute_help_texts/form_helper.rb
@@ -0,0 +1,42 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+module AttributeHelpTexts
+ module FormHelper
+ def wrap_attribute_label_with_help_text(label, attribute)
+ render OpenProject::Common::AttributeLabelComponent.new(
+ model:,
+ attribute:,
+ tag: nil,
+ current_user: User.current
+ ).with_content(label)
+ end
+ end
+end
diff --git a/app/forms/projects/life_cycles/form.rb b/app/forms/projects/life_cycles/form.rb
index 6487aada363..3c2f90c4a33 100644
--- a/app/forms/projects/life_cycles/form.rb
+++ b/app/forms/projects/life_cycles/form.rb
@@ -92,12 +92,17 @@ module Projects::LifeCycles
end
def autofocus?(field_name)
- start_date_blank = model.start_date.blank? && model.default_start_date.blank?
- case field_name
- when :start_date
- start_date_blank
- when :finish_date
- !start_date_blank && model.finish_date.blank?
+ # let javascipt handle focusing when rendering for preview
+ return false if model.changed?
+
+ field_name == autofocus_field_name
+ end
+
+ def autofocus_field_name
+ if start_date_disabled? || (model.start_date? && !model.finish_date?)
+ :finish_date
+ else
+ :start_date
end
end
diff --git a/app/forms/statuses/form.rb b/app/forms/statuses/form.rb
index 2948f1356aa..cac0631dde9 100644
--- a/app/forms/statuses/form.rb
+++ b/app/forms/statuses/form.rb
@@ -86,10 +86,8 @@ module Statuses
}
)
- if readonly_work_packages_restricted?
- statuses_form.html_content do
- render(EnterpriseEdition::BannerComponent.new(:readonly_work_packages))
- end
+ statuses_form.html_content do
+ render(EnterpriseEdition::BannerComponent.new(:readonly_work_packages))
end
statuses_form.check_box(
diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb
index 7a58fe9fe44..154e0588970 100644
--- a/app/helpers/repositories_helper.rb
+++ b/app/helpers/repositories_helper.rb
@@ -116,9 +116,9 @@ module RepositoriesHelper
def render_changes_tree(tree)
return "" if tree.nil?
- output = "
"
+ output = +"
"
tree.keys.sort.each do |file|
- style = "change"
+ style = +"change"
text = File.basename(file)
if s = tree[file][:s]
style << " folder"
diff --git a/app/models/attribute_help_text.rb b/app/models/attribute_help_text.rb
index 558991547ad..a138103f83e 100644
--- a/app/models/attribute_help_text.rb
+++ b/app/models/attribute_help_text.rb
@@ -29,6 +29,14 @@
class AttributeHelpText < ApplicationRecord
acts_as_attachable viewable_by_all_users: true
+ def self.cached(user)
+ OpenProject::Cache.fetch([name, user]) { visible(user).select(:id, :attribute_name).index_by(&:attribute_name) }
+ end
+
+ def self.for(model)
+ subclasses.find { |child| child.name.demodulize == model.model_name }
+ end
+
def self.available_types
subclasses.map { |child| child.name.demodulize }
end
diff --git a/app/models/attribute_help_text/project.rb b/app/models/attribute_help_text/project.rb
index 24a7d45054e..79c7b44616d 100644
--- a/app/models/attribute_help_text/project.rb
+++ b/app/models/attribute_help_text/project.rb
@@ -47,7 +47,7 @@ class AttributeHelpText::Project < AttributeHelpText
validates :attribute_name, inclusion: { in: ->(*) { available_attributes.keys } }
def type_caption
- Project.model_name.human
+ ::Project.model_name.human
end
def self.visible_condition(_user)
diff --git a/app/models/enterprise_token.rb b/app/models/enterprise_token.rb
index 2dcad4af441..e5559fb4a5f 100644
--- a/app/models/enterprise_token.rb
+++ b/app/models/enterprise_token.rb
@@ -45,6 +45,18 @@ class EnterpriseToken < ApplicationRecord
current && !current.expired?
end
+ def available_features
+ EnterpriseToken.current&.available_features || []
+ end
+
+ def trialling_features
+ available_features.select { |feature| trialling?(feature) }
+ end
+
+ def trialling?(feature)
+ allows_to?(feature) && EnterpriseToken.current.trial?
+ end
+
def hide_banners?
OpenProject::Configuration.ee_hide_banners?
end
@@ -88,6 +100,7 @@ class EnterpriseToken < ApplicationRecord
:plan,
:features,
:version,
+ :trial?,
to: :token_object
def token_object
diff --git a/app/models/project.rb b/app/models/project.rb
index 8a52e52cb85..e774b995fa2 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -139,6 +139,7 @@ class Project < ApplicationRecord
datetime: :created_at
register_journal_formatted_fields "active", formatter_key: :active_status
+ register_journal_formatted_fields "cause", formatter_key: :cause
register_journal_formatted_fields "templated", formatter_key: :template
register_journal_formatted_fields "identifier", "name", formatter_key: :plaintext
register_journal_formatted_fields "status_explanation", "description", formatter_key: :diff
diff --git a/app/models/project/phase.rb b/app/models/project/phase.rb
index 7bb0fca3ce9..5951d65b7f2 100644
--- a/app/models/project/phase.rb
+++ b/app/models/project/phase.rb
@@ -51,7 +51,8 @@ class Project::Phase < ApplicationRecord
attr_readonly :definition_id
scope :active, -> { where(active: true) }
- scopes :order_by_position
+ scopes :order_by_position,
+ :covering_dates_or_days_of_week
class << self
def visible(user = User.current)
@@ -85,24 +86,24 @@ class Project::Phase < ApplicationRecord
end
def follows_previous_phase?
- previous_finish_dates.last.present?
+ !!previous_phase&.date_range_set?
end
def default_start_date
return @default_start_date if defined?(@default_start_date)
- previous_finish_date = previous_finish_dates.compact.last
+ previous_finish_date = previous_phase&.finish_date
@default_start_date = previous_finish_date && Day.next_working(from: previous_finish_date).date
end
private
- def previous_finish_dates
- return @previous_finish_dates if defined?(@previous_finish_dates)
+ def previous_phase
+ return @previous_phase if defined?(@previous_phase)
- @previous_finish_dates = project
+ @previous_phase = project
.available_phases
.select { it.position < position }
- .map(&:finish_date)
+ .last
end
end
diff --git a/app/models/project/phase_definition.rb b/app/models/project/phase_definition.rb
index 871040c07e5..13991c3461f 100644
--- a/app/models/project/phase_definition.rb
+++ b/app/models/project/phase_definition.rb
@@ -48,4 +48,6 @@ class Project::PhaseDefinition < ApplicationRecord
default_scope { order(:position) }
scopes :with_project_count
+
+ def to_s; name end
end
diff --git a/app/models/project/phases/scopes/covering_dates_or_days_of_week.rb b/app/models/project/phases/scopes/covering_dates_or_days_of_week.rb
new file mode 100644
index 00000000000..4413f262a6e
--- /dev/null
+++ b/app/models/project/phases/scopes/covering_dates_or_days_of_week.rb
@@ -0,0 +1,88 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+module Project::Phases::Scopes::CoveringDatesOrDaysOfWeek
+ extend ActiveSupport::Concern
+ using CoreExtensions::SquishSql
+
+ class_methods do
+ # Fetches all phases that cover specific days of the week, and/or specific dates.
+ #
+ # The period considered is from the phase start date to the due date.
+ #
+ # @param dates Date[] An array of the Date objects.
+ # @param days_of_week number[] An array of the ISO days of the week to
+ # consider. 1 is Monday, 7 is Sunday.
+ def covering_dates_or_days_of_week(days_of_week: [], dates: [])
+ days_of_week = Array(days_of_week)
+ dates = Array(dates)
+ return none if days_of_week.empty? && dates.empty?
+
+ ids_sql = sanitize_sql([<<~SQL.squish, { days_of_week:, dates: }])
+ WITH
+ -- select phases with at least one date
+ phases_with_dates AS (
+ SELECT
+ id,
+ COALESCE(start_date, finish_date) AS start_date,
+ COALESCE(finish_date, start_date) AS finish_date
+ FROM project_phases
+ WHERE
+ start_date IS NOT NULL
+ OR finish_date IS NOT NULL
+ )
+
+ SELECT
+ id
+ FROM
+ phases_with_dates
+ WHERE
+ -- Check if the range covers any of the provided days of week. It is
+ -- done by comparing number of days from start_date to first target
+ -- day of week with number of days in range. If number is less or
+ -- eqal, then the range covers the target day of week
+ EXISTS (
+ SELECT 1
+ FROM UNNEST(ARRAY[:days_of_week]::INT[]) AS target_dow
+ WHERE (target_dow + 7 - EXTRACT(ISODOW FROM start_date)::INT) % 7 <= finish_date - start_date
+ )
+ OR
+ -- Check if the range covers any of the provided dates
+ EXISTS (
+ SELECT 1
+ FROM UNNEST(ARRAY[:dates]::DATE[]) AS target_date
+ WHERE target_date BETWEEN start_date AND finish_date
+ )
+ SQL
+
+ where("id IN (#{ids_sql})")
+ end
+ end
+end
diff --git a/app/models/queries/phase_definitions.rb b/app/models/queries/phase_definitions.rb
new file mode 100644
index 00000000000..74a8fb277a7
--- /dev/null
+++ b/app/models/queries/phase_definitions.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+module Queries
+ module PhaseDefinitions
+ # intentionally left empty, just exists to satisfy the autoloader
+ end
+
+ module Project::PhaseDefinitions
+ # This is needed for the phase definition filter to work, even though it is referenced in the
+ # WorkPackages::Query
+ ::Queries::Register.register(PhaseDefinitionQuery) do
+ # intentionally left empty
+ end
+ end
+end
diff --git a/app/models/queries/project/phase_definitions/phase_definition_query.rb b/app/models/queries/project/phase_definitions/phase_definition_query.rb
new file mode 100644
index 00000000000..edfbf86513d
--- /dev/null
+++ b/app/models/queries/project/phase_definitions/phase_definition_query.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+module Queries::Project
+ module PhaseDefinitions
+ class PhaseDefinitionQuery
+ include Queries::BaseQuery
+ include Queries::UnpersistedQuery
+
+ def self.model
+ Project::PhaseDefinition
+ end
+
+ def default_scope
+ Project::PhaseDefinition.order(:position)
+ end
+ end
+ end
+end
diff --git a/app/models/queries/project_phases/phase_query.rb b/app/models/queries/project_phases/phase_query.rb
new file mode 100644
index 00000000000..8a93ee8130c
--- /dev/null
+++ b/app/models/queries/project_phases/phase_query.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+module Queries::ProjectPhases
+ class PhaseQuery
+ include Queries::BaseQuery
+ include Queries::UnpersistedQuery
+
+ def self.model
+ Project::Phase
+ end
+
+ def default_scope
+ Project::Phase.visible(User.current)
+ end
+ end
+end
diff --git a/app/models/queries/work_packages.rb b/app/models/queries/work_packages.rb
index 876daaea279..ff1616056f5 100644
--- a/app/models/queries/work_packages.rb
+++ b/app/models/queries/work_packages.rb
@@ -62,6 +62,7 @@ module Queries::WorkPackages
filter Filter::DatesIntervalFilter
filter Filter::ParentFilter
filter Filter::PrecedesFilter
+ filter Filter::ProjectPhaseFilter
filter Filter::FollowsFilter
filter Filter::RelatesFilter
filter Filter::DuplicatesFilter
@@ -84,6 +85,7 @@ module Queries::WorkPackages
exclude Filter::RelatableFilter
select Selects::PropertySelect
+ select Selects::ProjectPhaseSelect
select Selects::CustomFieldSelect
select Selects::RelationToTypeSelect
select Selects::RelationOfTypeSelect
diff --git a/app/models/queries/work_packages/filter/project_phase_filter.rb b/app/models/queries/work_packages/filter/project_phase_filter.rb
new file mode 100644
index 00000000000..0948b029687
--- /dev/null
+++ b/app/models/queries/work_packages/filter/project_phase_filter.rb
@@ -0,0 +1,109 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+class Queries::WorkPackages::Filter::ProjectPhaseFilter < Queries::WorkPackages::Filter::WorkPackageFilter
+ def allowed_values
+ @allowed_values ||= project_phase_definitions.map { |s| [s.name, s.id.to_s] }
+ end
+
+ def available?
+ project_phase_definitions.any?
+ end
+
+ def type
+ :list
+ end
+
+ def self.key
+ :project_phase_definition_id
+ end
+
+ def ar_object_filter?
+ true
+ end
+
+ def value_objects
+ available_definitions = project_phase_definitions.index_by(&:id)
+
+ values.filter_map { |id| available_definitions[id.to_i] }
+ end
+
+ # TODO: copied over from ProjectPhaseSelect, refactor to use the same truth
+ def joins
+ <<~SQL.squish
+ LEFT OUTER JOIN "projects" ON "projects"."id" = "work_packages"."project_id"
+ LEFT OUTER JOIN (
+ SELECT
+ ph.id,
+ ph.project_id,
+ ph.definition_id AS active_phase_definition_id
+ FROM project_phases ph
+ WHERE ph.project_id IN (#{project_with_view_phases_permissions.to_sql})
+ AND ph.active = true
+ ) AS active_phases
+ ON active_phases.active_phase_definition_id = work_packages.project_phase_definition_id
+ AND active_phases.project_id = work_packages.project_id
+ SQL
+ end
+
+ def project_with_view_phases_permissions
+ Project.allowed_to(User.current, :view_project_phases).select(:id)
+ end
+
+ def where
+ placeholders = values.map { "?" }.join(",")
+
+ sql = if operator_strategy.to_sym == :"="
+ <<~SQL.squish
+ active_phases.active_phase_definition_id IS NOT NULL AND
+ active_phases.active_phase_definition_id IN (#{placeholders})
+ SQL
+ else
+ <<~SQL.squish
+ active_phases.active_phase_definition_id IS NULL OR
+ active_phases.active_phase_definition_id NOT IN (#{placeholders})
+ SQL
+ end
+
+ ActiveRecord::Base.sanitize_sql_array([sql, *values])
+ end
+
+ private
+
+ def project_phase_feature_flag_enabled?
+ OpenProject::FeatureDecisions.stages_and_gates_active?
+ end
+
+ def project_phase_definitions
+ return Project::PhaseDefinition.none unless project_phase_feature_flag_enabled?
+
+ Project::PhaseDefinition.order(Arel.sql("position"))
+ end
+end
diff --git a/app/models/queries/work_packages/selects/project_phase_select.rb b/app/models/queries/work_packages/selects/project_phase_select.rb
new file mode 100644
index 00000000000..ca996ab16a6
--- /dev/null
+++ b/app/models/queries/work_packages/selects/project_phase_select.rb
@@ -0,0 +1,118 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+class Queries::WorkPackages::Selects::ProjectPhaseSelect < Queries::WorkPackages::Selects::WorkPackageSelect
+ def initialize
+ super(:project_phase,
+ association: :project_phase_definition,
+ group_by_column_name: :project_phase_definition,
+ sortable: sortable_statement,
+ groupable: group_by_statement,
+ groupable_join: group_by_join_statement,
+ groupable_select: groupable_select
+ )
+ end
+
+ def groupable_select
+ "#{group_by_statement} as project_phase_definition_id"
+ end
+
+ def group_by_statement
+ active_phase_null_case(true_case: "NULL", false_case: "project_phase_definitions.id")
+ end
+
+ def order_for_count
+ active_phase_null_case(true_case: "1", false_case: "0")
+ end
+
+ # Is called when the query is grouped by project phase definition. We ensure that only active project phases are considered.
+ # Note that one project might have an active phase while another project has set the phase with the same definition to inactive.
+ # Additionally, the permissions to view project phases are considered on a project level, too.
+ def group_by_join_statement
+ # The project is joined here anew which should not be necessary but is.
+ # The necessity comes from AR's behaviour of automatically determining the alias for tables LEFT JOINed via includes.
+ # To avoid conflicts, AR will search strings for occurrences of the table name and if found, an included table will be aliased
+ # (potentially with a numbering). In this case, if the permission checks are part of the query, it will include a reference
+ # to the projects table. Therefore, the include for projects, which happens in the query itself, will be considered needing
+ # an alias. That assumption is wrong in this case as the reference to projects is in a subquery but AR does not know that.
+ <<~SQL.squish
+ LEFT OUTER JOIN "projects" ON "projects"."id" = "work_packages"."project_id"
+ LEFT OUTER JOIN (
+ SELECT
+ ph.id,
+ ph.project_id,
+ ph.definition_id AS active_phase_definition_id
+ FROM project_phases ph
+ WHERE ph.project_id IN (#{project_with_view_phases_permissions.to_sql})
+ AND ph.active = true
+ ) AS active_phases
+ ON active_phases.active_phase_definition_id = work_packages.project_phase_definition_id
+ AND active_phases.project_id = work_packages.project_id
+ SQL
+ end
+
+ def sortable_join_statement(_query)
+ # Replicate the group by join to ensure the same conditions are applied (and the same alias for the join is used)
+ group_by_join_statement
+ end
+
+ def sortable_statement
+ # We use the join alias from the group by join statement to ensure that work packages with an *inactive* project
+ # phase are treated like work packages *without* a project phase. In the result list, they will belong to the
+ # same group: without an active project phase.
+ active_phase_null_case(true_case: "-1", false_case: "project_phase_definitions.position")
+ end
+
+ def self.instances(context = nil)
+ allowed = if context
+ OpenProject::FeatureDecisions.stages_and_gates_active? &&
+ User.current.allowed_in_project?(:view_project_phases, context)
+ else
+ OpenProject::FeatureDecisions.stages_and_gates_active? &&
+ User.current.allowed_in_any_project?(:view_project_phases)
+ end
+
+ if allowed
+ [new]
+ else
+ []
+ end
+ end
+
+ private
+
+ def project_with_view_phases_permissions
+ Project.allowed_to(User.current, :view_project_phases).select(:id)
+ end
+
+ def active_phase_null_case(true_case:, false_case:)
+ "(CASE WHEN ACTIVE_PHASES.ID IS NULL THEN #{true_case} ELSE #{false_case} END)"
+ end
+end
diff --git a/app/models/queries/work_packages/selects/property_select.rb b/app/models/queries/work_packages/selects/property_select.rb
index 7a1bfd2bc22..a34d172626a 100644
--- a/app/models/queries/work_packages/selects/property_select.rb
+++ b/app/models/queries/work_packages/selects/property_select.rb
@@ -145,7 +145,7 @@ class Queries::WorkPackages::Selects::PropertySelect < Queries::WorkPackages::Se
}
def self.instances(_context = nil)
- property_selects.map do |name, options|
+ property_selects.filter_map do |name, options|
new(name, options)
end
end
diff --git a/app/models/queries/work_packages/selects/work_package_select.rb b/app/models/queries/work_packages/selects/work_package_select.rb
index 4ad2e9669ad..56f1a288580 100644
--- a/app/models/queries/work_packages/selects/work_package_select.rb
+++ b/app/models/queries/work_packages/selects/work_package_select.rb
@@ -32,6 +32,7 @@ class Queries::WorkPackages::Selects::WorkPackageSelect
:sortable_join,
:groupable_join,
:groupable_select,
+ :group_by_column_name,
:summable,
:default_order,
:association,
@@ -129,6 +130,7 @@ class Queries::WorkPackages::Selects::WorkPackageSelect
summable_select
summable_work_packages_select
association
+ group_by_column_name
null_handling
default_order
].each do |attribute|
diff --git a/app/models/query.rb b/app/models/query.rb
index a2ff72285c2..d72939dcb9c 100644
--- a/app/models/query.rb
+++ b/app/models/query.rb
@@ -289,11 +289,6 @@ class Query < ApplicationRecord
.compact_blank
.map(&:to_sym)
- # Set column_names to blank/nil if it is equal to the default columns
- if col_names.map(&:to_s) == Setting.work_package_list_default_columns
- col_names.clear
- end
-
write_attribute(:column_names, col_names)
end
diff --git a/app/models/query/results/group_by.rb b/app/models/query/results/group_by.rb
index 6ee9d9ef280..8eca3fbae3f 100644
--- a/app/models/query/results/group_by.rb
+++ b/app/models/query/results/group_by.rb
@@ -158,13 +158,8 @@ module ::Query::Results::GroupBy
end
def transform_property_keys(groups)
- association = WorkPackage.reflect_on_all_associations.detect { |a| a.name == query.group_by_column.name.to_sym }
-
- if association
- transform_association_property_keys(association, groups)
- else
- groups
- end
+ association = find_association_for_group
+ association ? transform_association_property_keys(association, groups) : groups
end
def transform_association_property_keys(association, groups)
@@ -213,4 +208,17 @@ module ::Query::Results::GroupBy
"#{order} #{column.null_handling(order == 'asc')}"
end
+
+ def find_association_for_group
+ WorkPackage.reflect_on_all_associations.detect do |association|
+ matches_group_by_column?(association)
+ end
+ end
+
+ def matches_group_by_column?(association)
+ # Some query columns override their groupable column name, prefer that if given:
+ group_name = query.group_by_column.group_by_column_name || query.group_by_column.name
+
+ association.name == group_name.to_sym
+ end
end
diff --git a/app/models/reminder.rb b/app/models/reminder.rb
index ab4466dda9c..1d20d2c5d33 100644
--- a/app/models/reminder.rb
+++ b/app/models/reminder.rb
@@ -45,6 +45,10 @@ class Reminder < ApplicationRecord
.where.missing(:reminder_notifications)
end
+ def visible?(user = User.current)
+ creator == user && remindable.visible?(user)
+ end
+
def unread_notifications?
unread_notifications.exists?
end
diff --git a/app/models/sharing_strategies/project_query_strategy.rb b/app/models/sharing_strategies/project_query_strategy.rb
index 9ee3c9922e1..cd30bb88804 100644
--- a/app/models/sharing_strategies/project_query_strategy.rb
+++ b/app/models/sharing_strategies/project_query_strategy.rb
@@ -105,18 +105,19 @@ module SharingStrategies
end
end
- def manage_shares_component(modal_content:, errors:)
- if EnterpriseToken.allows_to?(:project_list_sharing)
- super
- else
- Shares::ProjectQueries::UpsellComponent.new(modal_content:)
- end
- end
-
def title
I18n.t(:label_share_project_list)
end
+ def upsell_banner(modal_content:)
+ Shares::ProjectQueries::UpsellComponent.new(modal_content:)
+ end
+
+ def allow_feature?
+ EnterpriseToken.allows_to?(:project_list_sharing) ||
+ EnterpriseToken.trialling?(:project_list_sharing)
+ end
+
private
def virtual_owner_share
diff --git a/app/models/sharing_strategies/work_package_strategy.rb b/app/models/sharing_strategies/work_package_strategy.rb
index d51c3be999f..e398663d0e9 100644
--- a/app/models/sharing_strategies/work_package_strategy.rb
+++ b/app/models/sharing_strategies/work_package_strategy.rb
@@ -99,18 +99,19 @@ module SharingStrategies
Shares::WorkPackages::DeleteContract
end
- def modal_body_component(errors)
- if EnterpriseToken.allows_to?(:work_package_sharing)
- super
- else
- Shares::WorkPackages::ModalUpsellComponent.new
- end
- end
-
def title
I18n.t(:label_share_work_package)
end
+ def upsell_banner(modal_content:)
+ Shares::WorkPackages::ModalUpsellComponent.new(modal_content:)
+ end
+
+ def allow_feature?
+ EnterpriseToken.allows_to?(:work_package_sharing) ||
+ EnterpriseToken.trialling?(:work_package_sharing)
+ end
+
private
def project_member?(share)
diff --git a/app/models/work_package.rb b/app/models/work_package.rb
index dd3204b562f..f4d2c99c043 100644
--- a/app/models/work_package.rb
+++ b/app/models/work_package.rb
@@ -127,7 +127,7 @@ class WorkPackage < ApplicationRecord
where(author_id: author.id)
}
- scopes :covering_dates_and_days_of_week,
+ scopes :covering_dates_or_days_of_week,
:allowed_to,
:for_scheduling,
:include_derived_dates,
@@ -335,7 +335,7 @@ class WorkPackage < ApplicationRecord
end
def duration_in_hours
- duration ? duration * 24 : nil
+ duration * 24 if duration
end
def project_phase
diff --git a/app/models/work_package/exports/macros/attributes.rb b/app/models/work_package/exports/macros/attributes.rb
index 4216a45462a..2a938e8bdd3 100644
--- a/app/models/work_package/exports/macros/attributes.rb
+++ b/app/models/work_package/exports/macros/attributes.rb
@@ -63,19 +63,18 @@ module WorkPackage::Exports
end
def self.process_match(match, _matched_string, context)
- context => { user:, work_package: }
type = match[2].downcase
- model_s = match[1]
+ model_s = match[1].downcase
id = match[4] || match[3]
attribute = match[6] || match[5]
- resolve_match(type, model_s, id, attribute, work_package, user)
+ resolve_match(type, model_s, id, attribute, context)
end
- def self.resolve_match(type, model_s, id, attribute, work_package, user)
- if model_s == "workPackage"
- resolve_work_package_match(id || work_package.id, type, attribute, user)
+ def self.resolve_match(type, model_s, id, attribute, context)
+ if model_s == "workpackage"
+ resolve_work_package_match(id || context[:work_package]&.id, type, attribute, context[:user])
elsif model_s == "project"
- resolve_project_match(id || work_package.project.id, type, attribute, user)
+ resolve_project_match(id || context[:project]&.id, type, attribute, context[:user])
else
msg_macro_error I18n.t("export.macro.model_not_found", model: model_s)
end
diff --git a/app/models/work_package/exports/macros/links.rb b/app/models/work_package/exports/macros/links.rb
new file mode 100644
index 00000000000..5f3b0dcb63b
--- /dev/null
+++ b/app/models/work_package/exports/macros/links.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+module WorkPackage::Exports
+ module Macros
+ class WorkPackagesLinkHandler < OpenProject::TextFormatting::Matchers::LinkHandlers::WorkPackages
+ def applicable?
+ %w(# ## ###).include?(matcher.sep) && matcher.prefix.blank?
+ end
+
+ def render_link(wp_id, matcher)
+ link = "#{matcher.sep}#{wp_id}"
+ "#{
+ link
+ }"
+ end
+ end
+
+ class Links < OpenProject::TextFormatting::Matchers::ResourceLinksMatcher
+ def self.link_handlers
+ [WorkPackagesLinkHandler]
+ end
+
+ def self.html_replacement?
+ true
+ end
+
+ # Faster inclusion check before the full regex is being applied
+ def self.applicable?(content)
+ /#\d/.match(content)
+ end
+ end
+ end
+end
diff --git a/app/models/work_package/pdf_export/common/attachments.rb b/app/models/work_package/pdf_export/common/attachments.rb
index 75a3f820461..056c50c5c17 100644
--- a/app/models/work_package/pdf_export/common/attachments.rb
+++ b/app/models/work_package/pdf_export/common/attachments.rb
@@ -30,21 +30,17 @@ require "mini_magick"
module WorkPackage::PDFExport::Common::Attachments
def resize_image(file_path)
- tmp_file = Tempfile.new(["temp_image", File.extname(file_path)])
- @resized_images = [] if @resized_images.nil?
-
- @resized_images << tmp_file
- resized_file_path = tmp_file.path
+ tmp_file = temp_image_file(File.extname(file_path))
image = MiniMagick::Image.open(file_path)
image.resize("x800>")
- image.write(resized_file_path)
+ image.write(tmp_file)
- resized_file_path
+ tmp_file
end
def pdf_embeddable?(content_type)
- %w[image/jpeg image/png].include?(content_type)
+ %w[image/jpeg image/png image/gif].include?(content_type)
end
def delete_all_resized_images
@@ -59,18 +55,36 @@ module WorkPackage::PDFExport::Common::Attachments
nil # return nil as if the id was wrong and the attachment obj has not been found
end
- def attachment_image_filepath(work_package, src)
+ def attachment_image_filepath(src)
# images are embedded into markup with the api-path as img.src
- attachment = attachment_by_api_content_src(work_package, src)
+ attachment = attachment_by_api_content_src(src)
return nil if attachment.nil? || !pdf_embeddable?(attachment.content_type)
local_file = attachment_image_local_file(attachment)
return nil if local_file.nil?
- resize_image(local_file.path)
+ filename = local_file.path
+ filename = convert_gif_to_png(filename) if attachment.content_type == "image/gif"
+
+ resize_image(filename)
end
- def attachment_by_api_content_src(_work_package, src)
+ def temp_image_file(extension)
+ tmp_file = Tempfile.new(["temp_image", extension])
+ @resized_images = [] if @resized_images.nil?
+ @resized_images << tmp_file
+ tmp_file.path
+ end
+
+ def convert_gif_to_png(filename)
+ tmp_file = temp_image_file(".png")
+
+ image = MiniMagick::Image.open(filename)
+ image.frames.first.write(tmp_file)
+ tmp_file
+ end
+
+ def attachment_by_api_content_src(src)
attachment_regex = %r{/attachments/(\d+)/content}
return nil unless src&.match?(attachment_regex)
diff --git a/app/models/work_package/pdf_export/common/badge.rb b/app/models/work_package/pdf_export/common/badge.rb
index d2bb8b4c2fe..98bee7fc8a5 100644
--- a/app/models/work_package/pdf_export/common/badge.rb
+++ b/app/models/work_package/pdf_export/common/badge.rb
@@ -33,7 +33,7 @@ module WorkPackage::PDFExport::Common::Badge
def initialize(options)
@color = options[:color]
@document = options[:document]
- @radius = options[:radius]
+ @radius = options[:radius] || 0
@offset = options[:offset] || 0
end
@@ -45,21 +45,30 @@ module WorkPackage::PDFExport::Common::Badge
end
end
+ def calc_grayscale_brightness(red, green, blue)
+ # The brightness is calculated using the formula:
+ # https://entropymine.com/imageworsener/grayscale/
+ Math.sqrt(
+ (0.2126 * (red**2)) +
+ (0.7152 * (green**2)) +
+ (0.0722 * (blue**2))
+ ).to_i
+ end
+
def readable_color(pdf_background_color)
- sum = [
+ brightness = calc_grayscale_brightness(*[
pdf_background_color[0..1],
pdf_background_color[2..3],
pdf_background_color[4..5]
- ].sum { |color_part| color_part.to_i(16) }
- lightness = sum / 3
- lightness < 130 ? "FFFFFF" : "000000"
+ ].map { |color_part| color_part.to_i(16) })
+ brightness < 130 ? "FFFFFF" : "000000"
end
- def prawn_badge(text, color, offset: 0)
- badge = BadgeCallback.new({ color: color, radius: 8, document: pdf, offset: })
+ def prawn_badge(text, color, offset: 0, radius: 8, font_size: 8)
+ badge = BadgeCallback.new({ color: color, radius:, document: pdf, offset: })
{
text: (Prawn::Text::NBSP * 3) + text + (Prawn::Text::NBSP * 3),
- size: 8,
+ size: font_size,
color: readable_color(color),
callback: badge
}
diff --git a/app/models/work_package/pdf_export/common/common.rb b/app/models/work_package/pdf_export/common/common.rb
index 297cffad88c..fe2b3e68a62 100644
--- a/app/models/work_package/pdf_export/common/common.rb
+++ b/app/models/work_package/pdf_export/common/common.rb
@@ -129,11 +129,15 @@ module WorkPackage::PDFExport::Common::Common
end
def draw_horizontal_line(top, left, right, height, color)
- pdf.stroke do
+ previous_color = pdf.stroke_color
+ previous_line_width = pdf.line_width
+ @pdf.stroke do
pdf.stroke_color = color
pdf.line_width = height
pdf.horizontal_line left, right, at: top
end
+ pdf.stroke_color = previous_color
+ pdf.line_width = previous_line_width
end
def draw_styled_text(text, opts)
@@ -277,17 +281,17 @@ module WorkPackage::PDFExport::Common::Common
end
def footer_date
- format_time(export_datetime)
+ format_date(export_datetime)
end
def current_page_nr
pdf.page_number + @page_count - (with_cover? ? 1 : 0)
end
- def write_horizontal_line(y_position, height, color)
+ def write_horizontal_line(y_position, height, color, left_padding: 0)
draw_horizontal_line(
y_position,
- pdf.bounds.left, pdf.bounds.right,
+ pdf.bounds.left + left_padding, pdf.bounds.right,
height, color
)
end
@@ -297,6 +301,30 @@ module WorkPackage::PDFExport::Common::Common
pdf.start_new_page unless is_first_on_page
end
+ # Prawn table does not support inline formatting other than inline HTML formatting, so we have to convert the styling
+ def prawn_table_cell_inline_formatting_data(text, style) # rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity
+ value = text || ""
+ value = "#{value}" if style.key?(:link)
+ value = "#{value}" if style.key?(:anchor)
+ value = "#{value}" if style.include?(:color)
+ value = "#{value}" if style.key?(:size)
+ value = "#{value}" if style.key?(:character_spacing)
+ value = "#{value}" if style.key?(:font)
+ prawn_table_cell_inline_font_styles(value, style[:styles] || [])
+ end
+
+ # Prawn table does not support inline formatting other than inline HTML formatting, so we have to convert the styles
+ def prawn_table_cell_inline_font_styles(text, styles)
+ value = text || ""
+ value = "#{value}" if styles.include?(:bold)
+ value = "#{value}" if styles.include?(:italic)
+ value = "#{value}" if styles.include?(:underline)
+ value = "#{value}" if styles.include?(:strikethrough)
+ value = "#{value}" if styles.include?(:sub)
+ value = "#{value}" if styles.include?(:sup)
+ value
+ end
+
def write_optional_page_break
space_from_bottom = pdf.y - pdf.bounds.bottom
if space_from_bottom < styles.page_break_threshold
diff --git a/app/models/work_package/pdf_export/common/macro.rb b/app/models/work_package/pdf_export/common/macro.rb
index bb2a73b914d..8eb1fce6cef 100644
--- a/app/models/work_package/pdf_export/common/macro.rb
+++ b/app/models/work_package/pdf_export/common/macro.rb
@@ -29,48 +29,104 @@
module WorkPackage::PDFExport::Common::Macro
PREFORMATTED_BLOCKS = %w(pre code).freeze
- def apply_markdown_field_macros(markdown, work_package)
- apply_macros(markdown, work_package, WorkPackage::Exports::Macros::Attributes)
+ def apply_markdown_field_macros(markdown, context)
+ return markdown if markdown.blank?
+
+ apply_macros(markdown, context)
+ end
+
+ def macros
+ [
+ WorkPackage::Exports::Macros::Links,
+ WorkPackage::Exports::Macros::Attributes
+ ]
end
private
- def apply_macros(markdown, work_package, formatter)
- return markdown unless formatter.applicable?(markdown)
+ def apply_macros(markdown, context)
+ return markdown unless macros.any? { |macro| macro.applicable?(markdown) }
document = Markly.parse(markdown)
- document.walk do |node|
- if node.type == :html
- node.string_content = apply_macro_html(node.string_content, work_package, formatter) || node.string_content
- elsif node.type == :text
- node.string_content = apply_macro_text(node.string_content, work_package, formatter) || node.string_content
+ document.walk { |node| apply_macros_node(node, context) }
+ document.to_markdown
+ .gsub("\\~", "~") # fix a bug in Markly that escapes tildes
+ end
+
+ def apply_macros_node(node, context)
+ if node.type == :html
+ apply_macros_node_html(node, context)
+ elsif node.type == :text && not_in_mention?(node)
+ apply_macros_node_text(node, context)
+ end
+ end
+
+ def not_in_mention?(node)
+ # Check if the text node is not inside a mention tag
+ # e.g. #1234
+ # We don't want to end up with
+ # #1234
+ node.previous.nil? || node.previous.type != :inline_html || node.previous.string_content.exclude?("
#
text = tag.attr("data-text")
if text.present? && !node.next.respond_to?(:string_content) && node.next.string_content != text
@@ -78,9 +78,70 @@ module WorkPackage::PDFExport::Export::Markdown
end
end
# @Some User
+ # the node text is used.
[]
end
+ def handle_wp_mention_html_tag(tag, node, opts)
+ # #185
+ # ##185
+ # ###185
+ id = tag.attr("data-id")
+ return [] if id.blank?
+
+ next_node = node&.next # there is no markdown node in a html table
+ if next_node && next_node.type == :text && next_node.respond_to?(:string_content)
+ # clear the text content, so it does not get rendered
+ next_node.string_content = ""
+ end
+ wp_mention_macro(tag.attr("data-text") || "", id, opts)
+ end
+
+ def wp_mention_macro(content, id, opts)
+ count = content.count("#")
+ if count > 1
+ work_package = WorkPackage.find_by(id: id)
+ unless work_package.nil? || !work_package.visible?
+ # ##1234: {Type} #{ID}: {Subject}
+ content = "#{work_package.type} ##{work_package.id}: #{work_package.subject}"
+ if count == 3
+ # ###1234: {Status} {Type} #{ID}: {Subject} ({Start Date} - {End Date})
+ content = "#{work_package.status.name} #{content}#{work_package_dates(work_package)}"
+ end
+ end
+ end
+ [text_hash(content, opts.merge({ link: url_helpers.work_package_url(id) }))]
+ end
+
+ def work_package_dates(work_package)
+ return "" if work_package.start_date.blank? && work_package.due_date.blank?
+
+ if work_package.due_date.present? && work_package.start_date == work_package.due_date
+ return " (#{format_date(work_package.due_date)})"
+ end
+
+ work_package_date_range(work_package)
+ end
+
+ def work_package_date_range(work_package)
+ content = [
+ work_package.start_date.present? ? format_date(work_package.start_date) : I18n.t("label_no_start_date"),
+ work_package.due_date.present? ? format_date(work_package.due_date) : I18n.t("label_no_due_date")
+ ].join(" - ")
+ " (#{content})"
+ end
+
+ def handle_mention_html_tag(tag, node, opts)
+ type = tag.attr("data-type")
+ if type == "work_package"
+ handle_wp_mention_html_tag(tag, node, opts)
+ elsif type == "user"
+ handle_user_mention_html_tag(tag, node, opts)
+ else
+ []
+ end
+ end
+
def handle_unknown_inline_html_tag(tag, node, opts)
result = if tag.name == "mention"
handle_mention_html_tag(tag, node, opts)
@@ -93,9 +154,13 @@ module WorkPackage::PDFExport::Export::Markdown
end
def handle_unknown_html_tag(_tag, _node, opts)
- # unknown/unsupported html tags eg. hi are ignored
- # but scanned for supported or text children [true, ...]
- [true, opts]
+ if tag.name == "mention"
+ handle_mention_html_tag(tag, node, opts)
+ else
+ # unknown/unsupported html tags eg. hi are ignored
+ # but scanned for supported or text children [true, ...]
+ [true, opts]
+ end
end
def warn(text, element, node)
@@ -103,10 +168,14 @@ module WorkPackage::PDFExport::Export::Markdown
end
end
- def write_markdown!(work_package, markdown, styling_yml)
- md2pdf = MD2PDFExport.new(styling_yml, pdf, hyphenation_language)
- md2pdf.draw_markdown(markdown, pdf, ->(src) {
- with_images? ? attachment_image_filepath(work_package, src) : nil
- })
+ def markdown_writer(styling_yml)
+ @markdown_writer ||= MD2PDFExport.new(styling_yml, pdf, hyphenation_language)
+ end
+
+ def write_markdown!(markdown, styling_yml)
+ markdown_writer(styling_yml)
+ .draw_markdown(markdown, pdf, ->(src) {
+ with_images? ? attachment_image_filepath(src) : nil
+ })
end
end
diff --git a/app/models/work_package/pdf_export/export/markdown_field.rb b/app/models/work_package/pdf_export/export/markdown_field.rb
index 02c097089ac..4b657a9243b 100644
--- a/app/models/work_package/pdf_export/export/markdown_field.rb
+++ b/app/models/work_package/pdf_export/export/markdown_field.rb
@@ -51,8 +51,8 @@ module WorkPackage::PDFExport::Export::MarkdownField
def write_markdown_field_value(work_package, markdown)
with_margin(styles.wp_markdown_margins) do
write_markdown!(
- work_package,
- apply_markdown_field_macros(markdown, work_package),
+ apply_markdown_field_macros(markdown,
+ { work_package:, project: work_package.project, user: User.current }),
styles.wp_markdown_styling_yml
)
end
diff --git a/app/models/work_package/pdf_export/export/meetings/schema.json b/app/models/work_package/pdf_export/export/meetings/schema.json
new file mode 100644
index 00000000000..eafef496a51
--- /dev/null
+++ b/app/models/work_package/pdf_export/export/meetings/schema.json
@@ -0,0 +1,1842 @@
+{
+ "type": "object",
+ "title": "Meetings PDF",
+ "description": "This document describes the style settings format for the [PDF Export styling file](https://github.com/opf/openproject/blob/dev/app/models/work_package/pdf_export/meetings/standard.yml)",
+ "properties": {
+ "page": {
+ "$ref": "#/$defs/page"
+ },
+ "page_logo": {
+ "$ref": "#/$defs/page_logo"
+ },
+ "page_header": {
+ "$ref": "#/$defs/page_header"
+ },
+ "page_footer": {
+ "$ref": "#/$defs/page_footer"
+ },
+ "page_heading": {
+ "$ref": "#/$defs/page_heading"
+ },
+ "page_subtitle": {
+ "$ref": "#/$defs/page_heading"
+ },
+ "cover": {
+ "$ref": "#/$defs/cover"
+ },
+ "notes": {
+ "$ref": "#/$defs/notes"
+ },
+ "outcome": {
+ "$ref": "#/$defs/outcome"
+ },
+ "heading": {
+ "type": "object",
+ "title": "Heading",
+ "description": "Styling for the heading of the PDF meeting export",
+ "x-example": {
+ "heading": {
+ "size": 12,
+ "styles": [
+ "bold"
+ ],
+ "margin_bottom": 10
+ }
+ },
+ "properties": {
+ "hr": {
+ "type": "object",
+ "title": "Horizontal rule before headings",
+ "x-example": {
+ "border": {
+ "color": "6E7781",
+ "height": 1.5
+ }
+ },
+ "properties": {
+ "height": {
+ "title": "Line height of the horizontal rule",
+ "examples": [
+ 1
+ ],
+ "$ref": "#/$defs/measurement"
+ },
+ "color": {
+ "title": "Line color of the horizontal rule",
+ "$ref": "#/$defs/color"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/margin"
+ }
+ ]
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ },
+ {
+ "$ref": "#/$defs/margin"
+ }
+ ]
+ },
+ "agenda_item": {
+ "type": "object",
+ "title": "Agenda item",
+ "description": "Styling for a agenda item of the PDF meeting export",
+ "x-example": {
+ "agenda_item": {
+ }
+ },
+ "properties": {
+ "title_cell": {
+ "title": "Agenda item title table cell",
+ "description": "Styling for a table cell with the agenda item title",
+ "$ref": "#/$defs/table_cell"
+ },
+ "title": {
+ "$ref": "#/$defs/font"
+ },
+ "subtitle": {
+ "$ref": "#/$defs/font"
+ },
+ "title_margin": {
+ "$ref": "#/$defs/margin"
+ },
+ "indent": {
+ "title": "Indent width",
+ "description": "Indent for agenda item notes",
+ "$ref": "#/$defs/measurement"
+ },
+ "hr": {
+ "type": "object",
+ "title": "Horizontal rule between agenda items",
+ "x-example": {
+ "border": {
+ "color": "D0D7DE",
+ "height": 1
+ }
+ },
+ "properties": {
+ "height": {
+ "title": "Line height of the horizontal rule",
+ "examples": [
+ 1
+ ],
+ "$ref": "#/$defs/measurement"
+ },
+ "color": {
+ "title": "Line color of the horizontal rule",
+ "$ref": "#/$defs/color"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/margin"
+ }
+ ]
+ }
+ }
+ },
+ "agenda_section": {
+ "type": "object",
+ "title": "Agenda section",
+ "description": "Styling for a agenda section of the PDF meeting export",
+ "x-example": {
+ "agenda_section": {
+ }
+ },
+ "properties": {
+ "title_cell": {
+ "title": "Agenda section title table cell",
+ "description": "Styling for a table cell with the agenda section title",
+ "$ref": "#/$defs/table_cell"
+ },
+ "title": {
+ "$ref": "#/$defs/font"
+ },
+ "subtitle": {
+ "$ref": "#/$defs/font"
+ },
+ "title_margins": {
+ "$ref": "#/$defs/margin"
+ }
+ }
+ },
+ "participants": {
+ "type": "object",
+ "title": "Participants",
+ "description": "Styling for the participants table",
+ "x-example": {
+ "margin_bottom": 12,
+ "cell": {
+ "size": 10,
+ "padding_left": 0,
+ "no_border": true
+ }
+ },
+ "properties": {
+ "cell": {
+ "title": "Participant table cell",
+ "description": "Styling for a table cell with a participant name",
+ "$ref": "#/$defs/table_cell"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/margin"
+ }
+ ]
+ },
+ "attachments": {
+ "type": "object",
+ "title": "Attachments",
+ "description": "Styling for the attachments table",
+ "x-example": {
+ "margin_bottom": 12,
+ "cell": {
+ "size": 10,
+ "padding_left": 0,
+ "no_border": true
+ }
+ },
+ "properties": {
+ "cell": {
+ "title": "Attachments table cell",
+ "description": "Styling for a table cell with a attachment name",
+ "$ref": "#/$defs/table_cell"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/margin"
+ }
+ ]
+ }
+ },
+ "required": [],
+ "additionalProperties": false,
+ "$defs": {
+ "cover": {
+ "title": "Cover page",
+ "description": "Styling for the cover page of the PDF report export",
+ "x-example": {
+ "cover": {
+ "header": {},
+ "footer": {},
+ "hero": {}
+ }
+ },
+ "type": "object",
+ "properties": {
+ "header": {
+ "title": "Cover page header",
+ "description": "Styling for the cover page header",
+ "$ref": "#/$defs/cover_header"
+ },
+ "footer": {
+ "title": "Cover page footer",
+ "description": "Styling for the cover page footer",
+ "$ref": "#/$defs/cover_footer"
+ },
+ "hero": {
+ "title": "Cover page hero",
+ "description": "Styling for the hero banner at the bottom at the cover page",
+ "$ref": "#/$defs/cover_hero"
+ }
+ }
+ },
+ "cover_header": {
+ "title": "Cover page header",
+ "description": "Styling for the cover page header of the PDF report export",
+ "x-example": {
+ "header": {
+ "logo_height": 25,
+ "border": {}
+ }
+ },
+ "type": "object",
+ "properties": {
+ "spacing": {
+ "title": "Minimum spacing between logo and page header text",
+ "examples": [
+ 20
+ ],
+ "$ref": "#/$defs/measurement"
+ },
+ "offset": {
+ "title": "Offset position from page top",
+ "examples": [
+ 6.5
+ ],
+ "$ref": "#/$defs/measurement"
+ },
+ "logo_height": {
+ "title": "Height of the logo in the page header",
+ "examples": [
+ 25
+ ],
+ "$ref": "#/$defs/measurement"
+ },
+ "border": {
+ "title": "Cover page header",
+ "description": "Styling for the cover page header",
+ "$ref": "#/$defs/cover_header_border"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ }
+ ]
+ },
+ "cover_hero": {
+ "title": "Cover page hero",
+ "description": "Styling for the hero banner at the bottom at the cover page",
+ "x-example": {
+ "header": {
+ "padding_right": 150,
+ "padding_top": 120,
+ "title": {},
+ "heading": {},
+ "subheading": {}
+ }
+ },
+ "type": "object",
+ "properties": {
+ "padding_right": {
+ "title": "Padding right",
+ "description": "Padding only on the right side of the hero banner",
+ "$ref": "#/$defs/measurement"
+ },
+ "padding_top": {
+ "title": "Padding top",
+ "description": "Padding only on the top side of the hero banner",
+ "$ref": "#/$defs/measurement"
+ },
+ "title": {
+ "title": "The first block in the hero",
+ "type": "object",
+ "x-example": {
+ "title": {
+ "max_height": 30,
+ "spacing": 10,
+ "font": "SpaceMono",
+ "size": 10,
+ "color": "414d5f"
+ }
+ },
+ "properties": {
+ "spacing": {
+ "title": "Minimum spacing between title and heading",
+ "examples": [
+ 10
+ ],
+ "$ref": "#/$defs/measurement"
+ },
+ "max_height": {
+ "title": "Maximum height of the block",
+ "examples": [
+ 30
+ ],
+ "$ref": "#/$defs/measurement"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ }
+ ]
+ },
+ "heading": {
+ "title": "The main block in the hero",
+ "type": "object",
+ "x-example": {
+ "heading": {
+ "spacing": 10,
+ "size": 32,
+ "color": "414d5f",
+ "styles": [
+ "bold"
+ ]
+ }
+ },
+ "properties": {
+ "spacing": {
+ "title": "Minimum spacing between heading and subheading",
+ "examples": [
+ 10
+ ],
+ "$ref": "#/$defs/measurement"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ }
+ ]
+ },
+ "dates": {
+ "title": "The dates block in the hero",
+ "type": "object",
+ "x-example": {
+ "heading": {
+ "spacing": 10,
+ "max_height": 20,
+ "size": 32,
+ "color": "414d5f",
+ "styles": [
+ "bold"
+ ]
+ }
+ },
+ "properties": {
+ "max_height": {
+ "title": "Maximum height of the block",
+ "examples": [
+ 30
+ ],
+ "$ref": "#/$defs/measurement"
+ },
+ "spacing": {
+ "title": "Minimum spacing between dates and subheading",
+ "examples": [
+ 10
+ ],
+ "$ref": "#/$defs/measurement"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ }
+ ]
+ },
+ "subheading": {
+ "title": "The last block in the hero",
+ "type": "object",
+ "x-example": {
+ "subheading": {
+ "max_height": 30,
+ "size": 10,
+ "color": "414d5f",
+ "styles": [
+ "italic"
+ ]
+ }
+ },
+ "properties": {
+ "max_height": {
+ "title": "Maximum height of the block",
+ "examples": [
+ 30
+ ],
+ "$ref": "#/$defs/measurement"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ }
+ ]
+ }
+ }
+ },
+ "cover_footer": {
+ "title": "Cover page footer",
+ "description": "Styling for the cover page footer of the PDF report export",
+ "x-example": {
+ "footer": {
+ "offset": 20,
+ "size": 10,
+ "color": "064e80"
+ }
+ },
+ "type": "object",
+ "properties": {
+ "offset": {
+ "title": "Offset position from page bottom",
+ "examples": [
+ 30
+ ],
+ "$ref": "#/$defs/measurement"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ }
+ ]
+ },
+ "cover_header_border": {
+ "title": "Cover page header border",
+ "description": "Styling for the cover page header border of the PDF report export",
+ "x-example": {
+ "border": {
+ "color": "d3dee3",
+ "height": 1,
+ "offset": 6
+ }
+ },
+ "type": "object",
+ "properties": {
+ "spacing": {
+ "title": "Minimum spacing between logo and page header text",
+ "examples": [
+ 20
+ ],
+ "$ref": "#/$defs/measurement"
+ },
+ "offset": {
+ "title": "Offset position from page top",
+ "examples": [
+ 6
+ ],
+ "$ref": "#/$defs/measurement"
+ },
+ "height": {
+ "title": "Line height of the border",
+ "examples": [
+ 25
+ ],
+ "$ref": "#/$defs/measurement"
+ },
+ "color": {
+ "title": "Line color of the border",
+ "$ref": "#/$defs/color"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ }
+ ]
+ },
+ "color": {
+ "type": "string",
+ "title": "Color",
+ "description": "A color in RRGGBB format",
+ "examples": [
+ "F0F0F0"
+ ],
+ "x-example": {
+ "color": "F0F0F0"
+ },
+ "pattern": "^(?:[0-9a-fA-F]{3}){1,2}$"
+ },
+ "font": {
+ "title": "Font properties",
+ "description": "Properties to set the font style",
+ "type": "object",
+ "x-example": {
+ "font": "OpenSans",
+ "size": 10,
+ "character_spacing": 0,
+ "styles": [],
+ "color": "000000",
+ "leading": 2
+ },
+ "properties": {
+ "font": {
+ "type": "string"
+ },
+ "size": {
+ "$ref": "#/$defs/measurement"
+ },
+ "character_spacing": {
+ "$ref": "#/$defs/measurement"
+ },
+ "leading": {
+ "$ref": "#/$defs/measurement"
+ },
+ "color": {
+ "$ref": "#/$defs/color"
+ },
+ "styles": {
+ "type": "array",
+ "items": {
+ "$ref": "#/$defs/font_style"
+ }
+ }
+ }
+ },
+ "font_style": {
+ "type": "string",
+ "title": "Font Style",
+ "description": "Style of the font to use",
+ "examples": [
+ "bold"
+ ],
+ "enum": [
+ "bold",
+ "italic",
+ "underline",
+ "strikethrough",
+ "superscript",
+ "subscript"
+ ]
+ },
+ "page": {
+ "title": "Page settings",
+ "description": "Properties to set the basic page settings",
+ "type": "object",
+ "x-example": {
+ "page": {
+ "page_size": "EXECUTIVE",
+ "margin_top": 60,
+ "margin_bottom": 60,
+ "margin_left": 36,
+ "margin_right": 36,
+ "page_break_threshold": 200,
+ "link_color": "175A8E"
+ }
+ },
+ "properties": {
+ "link_color": {
+ "title": "Link color",
+ "description": "Set the color of clickable links",
+ "$ref": "#/$defs/color"
+ },
+ "page_layout": {
+ "title": "Page layout",
+ "description": "The layout of a page",
+ "type": "string",
+ "examples": [
+ "portrait"
+ ],
+ "enum": [
+ "portrait",
+ "landscape"
+ ]
+ },
+ "page_size": {
+ "type": "string",
+ "title": "Page size",
+ "description": "The size of a page",
+ "examples": [
+ "EXECUTIVE"
+ ],
+ "enum": [
+ "EXECUTIVE",
+ "TABLOID",
+ "LETTER",
+ "LEGAL",
+ "FOLIO",
+ "A0",
+ "A1",
+ "A2",
+ "A3",
+ "A4",
+ "A5",
+ "A6",
+ "A7",
+ "A8",
+ "A9",
+ "A10",
+ "B0",
+ "B1",
+ "B2",
+ "B3",
+ "B4",
+ "B5",
+ "B6",
+ "B7",
+ "B8",
+ "B9",
+ "B10",
+ "C0",
+ "C1",
+ "C2",
+ "C3",
+ "C4",
+ "C5",
+ "C6",
+ "C7",
+ "C8",
+ "C9",
+ "C10",
+ "RA0",
+ "RA1",
+ "RA2",
+ "RA3",
+ "RA4",
+ "SRA0",
+ "SRA1",
+ "SRA2",
+ "SRA3",
+ "SRA4",
+ "4A0",
+ "2A0"
+ ]
+ },
+ "page_break_threshold": {
+ "title": "Page break threshold",
+ "description": "If there is a new section, start a new page if space less than the threshold is available",
+ "$ref": "#/$defs/measurement"
+ }
+ },
+ "allOf": [
+ {
+ "title": "Default font settings",
+ "$ref": "#/$defs/font"
+ },
+ {
+ "title": "Page margins",
+ "$ref": "#/$defs/margin"
+ }
+ ]
+ },
+ "page_heading": {
+ "title": "Page heading",
+ "description": "The main page title heading",
+ "x-example": {
+ "page_heading": {
+ "size": 14,
+ "styles": [
+ "bold"
+ ],
+ "margin_bottom": 10
+ }
+ },
+ "type": "object",
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ },
+ {
+ "$ref": "#/$defs/margin"
+ }
+ ]
+ },
+ "page_footer": {
+ "type": "object",
+ "title": "Page footers",
+ "x-example": {
+ "page_footer": {
+ "offset": -30,
+ "size": 8
+ }
+ },
+ "properties": {
+ "offset": {
+ "title": "Offset position from page bottom",
+ "examples": [
+ -30
+ ],
+ "$ref": "#/$defs/measurement_signed"
+ },
+ "spacing": {
+ "title": "Minimum spacing between different page footers",
+ "examples": [
+ 8
+ ],
+ "$ref": "#/$defs/measurement"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ }
+ ]
+ },
+ "page_header": {
+ "type": "object",
+ "title": "Page headers",
+ "x-example": {
+ "page_header": {
+ "align": "left",
+ "offset": 20,
+ "size": 8
+ }
+ },
+ "properties": {
+ "align": {
+ "$ref": "#/$defs/alignment"
+ },
+ "offset": {
+ "title": "Offset position from page top",
+ "examples": [
+ -30
+ ],
+ "$ref": "#/$defs/measurement_signed"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ }
+ ]
+ },
+ "page_logo": {
+ "title": "Page logo",
+ "description": "Styling for logo image in the page header.",
+ "type": "object",
+ "x-example": {
+ "page_logo": {
+ "height": 20,
+ "align": "right"
+ }
+ },
+ "properties": {
+ "height": {
+ "$ref": "#/$defs/measurement",
+ "title": "Height of the image"
+ },
+ "align": {
+ "$ref": "#/$defs/alignment"
+ },
+ "offset": {
+ "title": "Offset position from page top",
+ "examples": [
+ -30
+ ],
+ "$ref": "#/$defs/measurement_signed"
+ }
+ }
+ },
+ "margin": {
+ "title": "Margin properties",
+ "description": "Properties to set margins",
+ "type": "object",
+ "x-example": {
+ "margin": "10mm",
+ "margin_top": "15mm"
+ },
+ "properties": {
+ "margin": {
+ "title": "Margin",
+ "description": "One value for margin on all sides",
+ "$ref": "#/$defs/measurement"
+ },
+ "margin_left": {
+ "title": "Margin left",
+ "description": "Margin only on the left side",
+ "$ref": "#/$defs/measurement"
+ },
+ "margin_right": {
+ "title": "Margin right",
+ "description": "Margin only on the right side",
+ "$ref": "#/$defs/measurement"
+ },
+ "margin_top": {
+ "title": "Margin top",
+ "description": "Margin only on the top side",
+ "$ref": "#/$defs/measurement"
+ },
+ "margin_bottom": {
+ "title": "Margin bottom",
+ "description": "Margin only on the bottom side",
+ "$ref": "#/$defs/measurement"
+ }
+ }
+ },
+ "padding": {
+ "title": "Padding Properties",
+ "description": "Properties to set paddings",
+ "type": "object",
+ "x-example": {
+ "padding": "10mm",
+ "padding_top": "15mm"
+ },
+ "properties": {
+ "padding": {
+ "title": "Padding",
+ "description": "One value for padding on all sides",
+ "$ref": "#/$defs/measurement"
+ },
+ "padding_left": {
+ "title": "Padding left",
+ "description": "Padding only on the left side",
+ "$ref": "#/$defs/measurement"
+ },
+ "padding_right": {
+ "title": "Padding right",
+ "description": "Padding only on the right side",
+ "$ref": "#/$defs/measurement"
+ },
+ "padding_top": {
+ "title": "Padding top",
+ "description": "Padding only on the top side",
+ "$ref": "#/$defs/measurement"
+ },
+ "padding_bottom": {
+ "title": "Padding bottom",
+ "description": "Padding only on the bottom side",
+ "$ref": "#/$defs/measurement"
+ }
+ }
+ },
+ "measurement": {
+ "type": [
+ "number",
+ "string"
+ ],
+ "pattern": "^([0-9\\.]+)(mm|cm|dm|m|in|ft|yr|pt)$",
+ "description": "A number >= 0 and an optional unit",
+ "examples": [
+ "10mm",
+ "10"
+ ]
+ },
+ "measurement_signed": {
+ "type": [
+ "number",
+ "string"
+ ],
+ "pattern": "^-?([0-9\\.]+)(mm|cm|dm|m|in|ft|yr|pt)$",
+ "description": "A positive or negative number and an optional unit"
+ },
+ "alignment": {
+ "title": "Alignment",
+ "description": "How the element should be aligned",
+ "examples": [
+ "center"
+ ],
+ "type": "string",
+ "enum": [
+ "left",
+ "center",
+ "right"
+ ]
+ },
+ "unordered_list": {
+ "title": "Markdown unordered list",
+ "x-example": {
+ "unordered_list": {
+ "spacing": "1.5mm",
+ "padding_top": "2mm",
+ "padding_bottom": "2mm"
+ }
+ },
+ "type": "object",
+ "properties": {
+ "spacing": {
+ "title": "Spacing",
+ "description": "Additional space between list items",
+ "$ref": "#/$defs/measurement"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ },
+ {
+ "$ref": "#/$defs/padding"
+ }
+ ]
+ },
+ "unordered_list_point": {
+ "title": "Markdown unordered list point",
+ "x-example": {
+ "unordered_list_point": {
+ "sign": "•",
+ "spacing": "0.75mm"
+ }
+ },
+ "type": "object",
+ "properties": {
+ "sign": {
+ "title": "Sign",
+ "description": "The 'bullet point' character used in the list",
+ "type": "string"
+ },
+ "spacing": {
+ "title": "Spacing",
+ "description": "Space between point and list item content",
+ "$ref": "#/$defs/measurement"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ }
+ ]
+ },
+ "task_list_point": {
+ "type": "object",
+ "title": "Markdown task list point",
+ "x-example": {
+ "task_list_point": {
+ "checked": "☑",
+ "unchecked": "☐",
+ "spacing": "0.75mm"
+ }
+ },
+ "properties": {
+ "checked": {
+ "title": "Checked sign",
+ "description": "Sign for checked state of a task list item",
+ "type": "string"
+ },
+ "unchecked": {
+ "title": "Unchecked sign",
+ "description": "Sign for unchecked state of a task list item",
+ "type": "string"
+ },
+ "spacing": {
+ "title": "Spacing",
+ "description": "Additional space between point and list item content",
+ "$ref": "#/$defs/measurement"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ }
+ ]
+ },
+ "ordered_list": {
+ "title": "Markdown ordered list",
+ "x-example": {
+ "ordered_list": {
+ "spacing": "2mm",
+ "point_inline": false
+ }
+ },
+ "type": "object",
+ "properties": {
+ "spacing": {
+ "title": "Spacing",
+ "description": "Additional space between list items",
+ "$ref": "#/$defs/measurement"
+ },
+ "point_inline": {
+ "title": "Inline Point",
+ "description": "Do not indent paragraph text, but include the point into the first paragraph",
+ "type": "boolean"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ },
+ {
+ "$ref": "#/$defs/padding"
+ }
+ ]
+ },
+ "ordered_list_point": {
+ "title": "Markdown ordered list point",
+ "type": "object",
+ "x-example": {
+ "ordered_list_point": {
+ "template": ".",
+ "list_style_type": "decimal",
+ "spacing": "0.75mm",
+ "spanning": true
+ }
+ },
+ "properties": {
+ "spacing": {
+ "$ref": "#/$defs/measurement"
+ },
+ "alphabetical": {
+ "title": "Alphabetical bullet points",
+ "description": "(deprecated; use list_style_type) Convert the list item number into a character, eg. `a.` `b.` `c.`",
+ "type": "boolean"
+ },
+ "list_style_type": {
+ "title": "List style type",
+ "description": "The style of the list bullet points, eg. `decimal`, `lower-latin`, `upper-roman`",
+ "type": "string",
+ "enum": [
+ "decimal",
+ "lower-latin",
+ "lower-roman",
+ "upper-latin",
+ "upper-roman"
+ ]
+ },
+ "spanning": {
+ "title": "Spanning",
+ "description": "Use the width of the largest bullet as indention.",
+ "type": "boolean"
+ },
+ "template": {
+ "title": "Template",
+ "description": "customize what the prefix should contain, eg. `()`",
+ "type": "string"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ }
+ ]
+ },
+ "header": {
+ "type": "object",
+ "title": "Markdown header",
+ "x-example": {
+ "header": {
+ "styles": [
+ "bold"
+ ],
+ "padding_top": "2mm",
+ "padding_bottom": "2mm"
+ },
+ "header_1": {
+ "size": 14,
+ "styles": [
+ "bold",
+ "italic"
+ ]
+ },
+ "header_2": {
+ "size": 12,
+ "styles": [
+ "bold"
+ ]
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ },
+ {
+ "$ref": "#/$defs/padding"
+ }
+ ]
+ },
+ "table_cell": {
+ "type": "object",
+ "title": "Table cell",
+ "description": "Styling for a table cell",
+ "x-example": {
+ "table_cell": {
+ "size": 9,
+ "color": "000000",
+ "padding": 5,
+ "border_width": 1
+ }
+ },
+ "properties": {
+ "background_color": {
+ "$ref": "#/$defs/color"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ },
+ {
+ "$ref": "#/$defs/padding"
+ },
+ {
+ "$ref": "#/$defs/border"
+ }
+ ]
+ },
+ "table_header": {
+ "type": "object",
+ "title": "Table header cell",
+ "description": "Styling for a table header cell",
+ "x-example": {
+ "table_header": {
+ "size": 9,
+ "styles": [
+ "bold"
+ ]
+ }
+ },
+ "properties": {
+ "background_color": {
+ "$ref": "#/$defs/color"
+ },
+ "no_repeating": {
+ "type": "boolean"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ },
+ {
+ "$ref": "#/$defs/padding"
+ },
+ {
+ "$ref": "#/$defs/border"
+ }
+ ]
+ },
+ "paragraph": {
+ "type": "object",
+ "title": "Markdown paragraph",
+ "properties": {
+ "align": {
+ "type": "string",
+ "enum": [
+ "left",
+ "center",
+ "right",
+ "justify"
+ ]
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ },
+ {
+ "$ref": "#/$defs/padding"
+ }
+ ]
+ },
+ "border": {
+ "type": "object",
+ "title": "Border Properties",
+ "description": "Properties to set borders",
+ "x-example": {
+ "border_color": "F000FF",
+ "border_color_top": "000FFF",
+ "border_color_bottom": "FFF000",
+ "no_border_left": true,
+ "no_border_right": true,
+ "border_width": "0.25mm",
+ "border_width_left": "0.5mm",
+ "border_width_right": "0.5mm"
+ },
+ "properties": {
+ "border_width": {
+ "title": "Border width",
+ "description": "One value for border line width on all sides",
+ "$ref": "#/$defs/measurement"
+ },
+ "border_width_left": {
+ "title": "Border width left",
+ "description": "Border width only on the left side",
+ "$ref": "#/$defs/measurement"
+ },
+ "border_width_top": {
+ "title": "Border width top",
+ "description": "Border width only on the top side",
+ "$ref": "#/$defs/measurement"
+ },
+ "border_width_right": {
+ "title": "Border width right",
+ "description": "Border width only on the right side",
+ "$ref": "#/$defs/measurement"
+ },
+ "border_width_bottom": {
+ "title": "Border width bottom",
+ "description": "Border width only on the bottom side",
+ "$ref": "#/$defs/measurement"
+ },
+ "border_color": {
+ "title": "Border color",
+ "description": "One value for border color on all sides",
+ "$ref": "#/$defs/color"
+ },
+ "border_color_left": {
+ "title": "Border color left",
+ "description": "Border color only on the left side",
+ "$ref": "#/$defs/color"
+ },
+ "border_color_top": {
+ "title": "Border color top",
+ "description": "Border color only on the top side",
+ "$ref": "#/$defs/color"
+ },
+ "border_color_right": {
+ "title": "Border color right",
+ "description": "Border color only on the right side",
+ "$ref": "#/$defs/color"
+ },
+ "border_color_bottom": {
+ "title": "Border color bottom",
+ "description": "Border color only on the bottom side",
+ "$ref": "#/$defs/color"
+ },
+ "no_border": {
+ "title": "Disable borders",
+ "description": "Turn off borders on all sides",
+ "type": "boolean"
+ },
+ "no_border_left": {
+ "title": "Disable border left",
+ "description": "Turn off border on the left sides",
+ "type": "boolean"
+ },
+ "no_border_top": {
+ "title": "Disable border top",
+ "description": "Turn off border on the top sides",
+ "type": "boolean"
+ },
+ "no_border_right": {
+ "title": "Disable border right",
+ "description": "Turn off border on the right sides",
+ "type": "boolean"
+ },
+ "no_border_bottom": {
+ "title": "Disable border bottom",
+ "description": "Turn off border on the bottom sides",
+ "type": "boolean"
+ }
+ }
+ },
+ "alert": {
+ "type": "object",
+ "title": "Alert",
+ "description": "Styling to denote a quote as alert box",
+ "x-example": {
+ "ALERT": {
+ "alert_color": "f4f9ff",
+ "border_color": "f4f9ff",
+ "border_width": 2,
+ "no_border_right": true,
+ "no_border_left": false,
+ "no_border_bottom": true,
+ "no_border_top": true
+ }
+ },
+ "properties": {
+ "background_color": {
+ "$ref": "#/$defs/color"
+ },
+ "alert_color": {
+ "$ref": "#/$defs/color"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ },
+ {
+ "$ref": "#/$defs/border"
+ },
+ {
+ "$ref": "#/$defs/padding"
+ },
+ {
+ "$ref": "#/$defs/margin"
+ }
+ ]
+ },
+ "alerts": {
+ "type": "object",
+ "title": "Alert boxes (styled blockquotes)",
+ "properties": {
+ "NOTE": {
+ "$ref": "#/$defs/alert"
+ },
+ "TIP": {
+ "$ref": "#/$defs/alert"
+ },
+ "WARNING": {
+ "$ref": "#/$defs/alert"
+ },
+ "IMPORTANT": {
+ "$ref": "#/$defs/alert"
+ },
+ "CAUTION": {
+ "$ref": "#/$defs/alert"
+ }
+ }
+ },
+ "notes": {
+ "type": "object",
+ "title": "Agenda item notes",
+ "description": "Styling for Meeting agenda item notes",
+ "x-example": {
+ "notes": {
+ "markdown_margin": {},
+ "markdown": {}
+ }
+ },
+ "properties": {
+ "markdown_margin": {
+ "type": "object",
+ "title": "Agenda item notes markdown margins",
+ "description": "Margins for agenda item notes",
+ "x-example": {
+ "markdown_margin": {
+ "margin_bottom": 16
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/margin"
+ }
+ ]
+ },
+ "markdown": {
+ "$ref": "#/$defs/markdown"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/margin"
+ }
+ ]
+ },
+ "outcome": {
+ "type": "object",
+ "title": "Agenda item outcome",
+ "description": "Styling for Meeting agenda item outcome",
+ "x-example": {
+ "outcome": {
+ "indent": 15,
+ "markdown_margin": {},
+ "markdown": {}
+ }
+ },
+ "properties": {
+ "title": {
+ "type": "object",
+ "title": "Agenda item outcome title",
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ },
+ {
+ "$ref": "#/$defs/margin"
+ }
+ ]
+ },
+ "indent": {
+ "title": "Indent width",
+ "description": "Indent for agenda item notes",
+ "$ref": "#/$defs/measurement"
+ },
+ "markdown_margin": {
+ "type": "object",
+ "title": "Agenda item outcome markdown margins",
+ "description": "Margins for agenda item outcome",
+ "x-example": {
+ "markdown_margin": {
+ "margin_bottom": 16
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/margin"
+ }
+ ]
+ },
+ "markdown": {
+ "$ref": "#/$defs/markdown"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/margin"
+ }
+ ]
+ },
+ "markdown": {
+ "type": "object",
+ "title": "Markdown Styling",
+ "description": "Styling for markdown content of agenda item notes",
+ "x-example": {
+ "markdown": {
+ "font": {},
+ "header": {},
+ "header_1": {},
+ "header_2": {},
+ "header_3": {},
+ "paragraph": {},
+ "unordered_list": {},
+ "unordered_list_point": {},
+ "ordered_list": {},
+ "ordered_list_point": {},
+ "task_list": {},
+ "task_list_point": {},
+ "link": {},
+ "code": {},
+ "blockquote": {},
+ "codeblock": {},
+ "table": {}
+ }
+ },
+ "properties": {
+ "font": {
+ "$ref": "#/$defs/font"
+ },
+ "paragraph": {
+ "title": "Markdown paragraph",
+ "description": "A block of text",
+ "type": "object",
+ "properties": {
+ "align": {
+ "type": "string",
+ "enum": [
+ "left",
+ "center",
+ "right",
+ "justify"
+ ]
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ },
+ {
+ "$ref": "#/$defs/padding"
+ }
+ ],
+ "x-example": {
+ "paragraph": {
+ "align": "justify",
+ "padding_bottom": "2mm"
+ }
+ }
+ },
+ "table": {
+ "type": "object",
+ "title": "Markdown table",
+ "x-example": {
+ "table": {
+ "auto_width": true,
+ "header": {
+ "background_color": "F0F0F0",
+ "no_repeating": true,
+ "size": 12
+ },
+ "cell": {
+ "background_color": "000FFF",
+ "size": 10
+ }
+ }
+ },
+ "properties": {
+ "auto_width": {
+ "title": "Automatic column widths",
+ "description": "Table columns should fit the content, equal spacing of columns if value is `false`",
+ "type": "boolean"
+ },
+ "header": {
+ "$ref": "#/$defs/table_header"
+ },
+ "cell": {
+ "$ref": "#/$defs/table_cell"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/margin"
+ },
+ {
+ "$ref": "#/$defs/border"
+ }
+ ]
+ },
+ "html_table": {
+ "type": "object",
+ "title": "HTML table",
+ "x-example": {
+ "table": {
+ "auto_width": true,
+ "header": {
+ "background_color": "F0F0F0",
+ "no_repeating": true,
+ "size": 12
+ },
+ "cell": {
+ "background_color": "000FFF",
+ "size": 10
+ }
+ }
+ },
+ "properties": {
+ "auto_width": {
+ "title": "Automatic column widths",
+ "description": "Table columns should fit the content, equal spacing of columns if value is `false`",
+ "type": "boolean"
+ },
+ "header": {
+ "$ref": "#/$defs/table_header"
+ },
+ "cell": {
+ "$ref": "#/$defs/table_cell"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/margin"
+ },
+ {
+ "$ref": "#/$defs/border"
+ }
+ ]
+ },
+ "headless_table": {
+ "type": "object",
+ "title": "Markdown headless table",
+ "description": "Tables without or empty header rows can be styled differently.",
+ "x-example": {
+ "headless_table": {
+ "auto_width": true,
+ "cell": {
+ "style": "underline",
+ "background_color": "000FFF"
+ }
+ }
+ },
+ "properties": {
+ "auto_width": {
+ "title": "Automatic column widths",
+ "description": "Table columns should fit the content, equal spacing of columns if value is `false`",
+ "type": "boolean"
+ },
+ "cell": {
+ "$ref": "#/$defs/table_cell"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/margin"
+ },
+ {
+ "$ref": "#/$defs/border"
+ }
+ ]
+ },
+ "code": {
+ "type": "object",
+ "title": "Markdown code",
+ "description": "Styling to denote a word or phrase as code",
+ "x-example": {
+ "code": {
+ "font": "Consolas",
+ "color": "880000"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ }
+ ]
+ },
+ "codeblock": {
+ "type": "object",
+ "title": "Markdown code block",
+ "description": "Styling to denote a paragraph as code",
+ "x-example": {
+ "codeblock": {
+ "background_color": "F5F5F5",
+ "font": "Consolas",
+ "size": 8,
+ "color": "880000",
+ "padding": "3mm",
+ "margin_top": "2mm",
+ "margin_bottom": "2mm"
+ }
+ },
+ "properties": {
+ "background_color": {
+ "$ref": "#/$defs/color"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ },
+ {
+ "$ref": "#/$defs/padding"
+ },
+ {
+ "$ref": "#/$defs/margin"
+ }
+ ]
+ },
+ "link": {
+ "type": "object",
+ "title": "Markdown Link",
+ "description": "Styling a clickable link",
+ "x-example": {
+ "link": {
+ "color": "000088"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ }
+ ]
+ },
+ "image": {
+ "type": "object",
+ "title": "Markdown image",
+ "description": "Styling of images",
+ "x-example": {
+ "image": {
+ "max_width": "50mm",
+ "margin": "2mm",
+ "margin_bottom": "3mm",
+ "align": "center",
+ "caption": {
+ "align": "center",
+ "size": 8
+ }
+ }
+ },
+ "properties": {
+ "max_width": {
+ "$ref": "#/$defs/measurement",
+ "title": "Maximum width of the image"
+ },
+ "align": {
+ "$ref": "#/$defs/alignment"
+ },
+ "caption": {
+ "title": "Image caption",
+ "description": "Styling for the caption below an image",
+ "type": "object",
+ "properties": {
+ "align": {
+ "type": "string",
+ "enum": [
+ "left",
+ "center",
+ "right",
+ "justify"
+ ]
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ },
+ {
+ "$ref": "#/$defs/padding"
+ }
+ ]
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/margin"
+ }
+ ]
+ },
+ "hrule": {
+ "type": "object",
+ "title": "Markdown horizontal rule",
+ "description": "Styling for horizontal lines",
+ "properties": {
+ "line_width": {
+ "title": "Sets the stroke width of the horizontal rule",
+ "$ref": "#/$defs/measurement"
+ }
+ },
+ "x-example": {
+ "hrule": {
+ "line_width": 1
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/margin"
+ }
+ ]
+ },
+ "header": {
+ "title": "Markdown header",
+ "description": "Default styling for headers on all levels. use header_`x` as key for header level `x`.",
+ "$ref": "#/$defs/header"
+ },
+ "blockquote": {
+ "type": "object",
+ "title": "Markdown blockquote",
+ "description": "Styling to denote a paragraph as quote",
+ "x-example": {
+ "blockquote": {
+ "background_color": "f4f9ff",
+ "size": 14,
+ "styles": [
+ "italic"
+ ],
+ "color": "0f3b66",
+ "border_color": "b8d6f4",
+ "border_width": 1,
+ "no_border_right": true,
+ "no_border_left": false,
+ "no_border_bottom": true,
+ "no_border_top": true
+ }
+ },
+ "properties": {
+ "background_color": {
+ "$ref": "#/$defs/color"
+ }
+ },
+ "allOf": [
+ {
+ "$ref": "#/$defs/font"
+ },
+ {
+ "$ref": "#/$defs/border"
+ },
+ {
+ "$ref": "#/$defs/padding"
+ },
+ {
+ "$ref": "#/$defs/margin"
+ }
+ ]
+ },
+ "ordered_list": {
+ "title": "Markdown ordered list",
+ "description": "Default styling for ordered lists on all levels. use ordered_list_`x` as key for ordered list level `x`.",
+ "$ref": "#/$defs/ordered_list"
+ },
+ "ordered_list_point": {
+ "title": "Markdown ordered list point",
+ "description": "Default styling for ordered list points on all levels. use ordered_list_point_`x` as key for ordered list points level `x`.",
+ "$ref": "#/$defs/ordered_list_point"
+ },
+ "unordered_list": {
+ "title": "Markdown unordered list",
+ "description": "Default styling for unordered lists on all levels. use unordered_list_`x` as key for unordered list level `x`.",
+ "$ref": "#/$defs/unordered_list"
+ },
+ "unordered_list_point": {
+ "title": "Markdown unordered list point",
+ "description": "Default styling for unordered list points on all levels. use unordered_list_point_`x` as key for unordered list points level `x`.",
+ "$ref": "#/$defs/unordered_list_point"
+ },
+ "task_list": {
+ "title": "Markdown task list",
+ "x-example": {
+ "task_list": {
+ "spacing": "2mm"
+ }
+ },
+ "$ref": "#/$defs/unordered_list"
+ },
+ "task_list_point": {
+ "title": "Markdown task list point",
+ "$ref": "#/$defs/task_list_point"
+ },
+ "alerts": {
+ "$ref": "#/$defs/alerts"
+ }
+ },
+ "patternProperties": {
+ "^ordered_list_point_\\d+": {
+ "title": "Markdown ordered list point level",
+ "$ref": "#/$defs/ordered_list_point"
+ },
+ "^ordered_list_\\d+": {
+ "title": "Markdown ordered list level",
+ "$ref": "#/$defs/ordered_list"
+ },
+ "^unordered_list_point_\\d+": {
+ "title": "Markdown unordered list point level",
+ "$ref": "#/$defs/unordered_list_point"
+ },
+ "^unordered_list_\\d+": {
+ "title": "Markdown unordered List Level",
+ "$ref": "#/$defs/unordered_list"
+ },
+ "^header_\\d+": {
+ "title": "Markdown header level",
+ "$ref": "#/$defs/header"
+ }
+ }
+ }
+ }
+}
diff --git a/app/models/work_package/pdf_export/export/meetings/standard.yml b/app/models/work_package/pdf_export/export/meetings/standard.yml
new file mode 100644
index 00000000000..ad146b47d4b
--- /dev/null
+++ b/app/models/work_package/pdf_export/export/meetings/standard.yml
@@ -0,0 +1,459 @@
+page:
+ page_size: "A4"
+ margin_top: 60
+ margin_bottom: 60
+ margin_left: 36
+ margin_right: 36
+ page_break_threshold: 100
+ link_color: "175A8E"
+
+page_header:
+ offset: 20
+ size: 8
+
+page_footer:
+ offset: -30
+ size: 8
+ spacing: 6
+
+page_logo:
+ height: 20
+ align: "right"
+
+page_heading:
+ size: 14
+ styles: [ "bold" ]
+ margin_bottom: 2
+
+page_subtitle:
+ margin_top: 4
+ margin_bottom: 10
+ size: 10
+
+cover:
+ header:
+ logo_height: 25
+ border:
+ color: 'd3dee3'
+ height: 1
+ offset: 6
+ footer:
+ size: 10
+ color: '414d5f'
+ offset: 30
+ hero:
+ padding_right: 144
+ padding_top: 120
+ title:
+ max_height: 30
+ spacing: 10
+ font: 'SpaceMono'
+ color: '414d5f'
+ size: 10
+ heading:
+ spacing: 14
+ color: '414d5f'
+ styles:
+ - bold
+ size: 16
+ dates:
+ spacing: 4
+ max_height: 16
+ color: '414d5f'
+ size: 10
+ styles:
+ - bold
+ subheading:
+ max_height: 30
+ color: '414d5f'
+ size: 10
+
+notes:
+ markdown_margin:
+ margin: 16
+ markdown:
+ font:
+ size: 10
+ leading: 3
+ header:
+ size: 8
+ styles: [ "bold" ]
+ padding_top: 4
+ header_1:
+ size: 10
+ header_2:
+ size: 10
+ header_3:
+ size: 9
+ paragraph:
+ align: "left"
+ unordered_list:
+ spacing: 1
+ unordered_list_point:
+ spacing: 4
+ ordered_list:
+ spacing: 1
+ ordered_list_point:
+ spacing: 4
+ spanning: true
+ list_style_type: decimal
+ ordered_list_point_2:
+ list_style_type: lower-latin
+ ordered_list_point_3:
+ list_style_type: lower-roman
+ ordered_list_point_4:
+ list_style_type: upper-latin
+ ordered_list_point_5:
+ list_style_type: upper-roman
+ task_list:
+ spacing: 1
+ task_list_point:
+ spacing: 4
+ checked: "☑"
+ unchecked: "☐"
+ link:
+ color: "175A8E"
+ styles: [ ]
+ code:
+ color: "880000"
+ size: 9
+ font: "SpaceMono"
+ blockquote:
+ background_color: "f4f9ff"
+ size: 10
+ styles: [ "italic" ]
+ color: "0f3b66"
+ border_color: "b8d6f4"
+ border_width: 1
+ padding: 4
+ padding_left: 6
+ margin_top: 4
+ margin_bottom: 4
+ no_border_left: false
+ no_border_right: true
+ no_border_bottom: true
+ no_border_top: true
+ image:
+ align: "center"
+ margin_bottom: 4
+ caption:
+ size: 8
+ align: "center"
+ codeblock:
+ background_color: "F5F5F5"
+ color: "880000"
+ padding: 10
+ size: 8
+ margin_top: 10
+ margin_bottom: 10
+ font: "SpaceMono"
+ table:
+ auto_width: true
+ margin_top: 4
+ margin_bottom: 4
+ header:
+ size: 9
+ styles: [ "bold" ]
+ background_color: "F0F0F0"
+ cell:
+ size: 8
+ border_width: 0.25
+ padding: 5
+ html_table:
+ auto_width: true
+ margin_top: 4
+ margin_bottom: 4
+ header:
+ size: 9
+ styles: [ "bold" ]
+ cell:
+ size: 8
+ border_width: 0.25
+ padding: 5
+ alerts:
+ NOTE:
+ border_color: '0969da'
+ alert_color: '0969da'
+ padding: '4mm'
+ size: 10
+ styles: [ ]
+ border_width: 2
+ no_border_right: true
+ no_border_left: false
+ no_border_bottom: true
+ no_border_top: true
+ TIP:
+ border_color: '1a7f37'
+ alert_color: '1a7f37'
+ padding: '4mm'
+ size: 10
+ styles: [ ]
+ border_width: 2
+ no_border_right: true
+ no_border_left: false
+ no_border_bottom: true
+ no_border_top: true
+ IMPORTANT:
+ border_color: '8250df'
+ alert_color: '8250df'
+ padding: '4mm'
+ size: 10
+ styles: [ ]
+ border_width: 2
+ no_border_right: true
+ no_border_left: false
+ no_border_bottom: true
+ no_border_top: true
+ WARNING:
+ border_color: 'bf8700'
+ alert_color: 'bf8700'
+ padding: '4mm'
+ size: 10
+ styles: [ ]
+ border_width: 2
+ no_border_right: true
+ no_border_left: false
+ no_border_bottom: true
+ no_border_top: true
+ CAUTION:
+ border_color: 'd1242f'
+ alert_color: 'd1242f'
+ size: 10
+ styles: [ ]
+ padding: '4mm'
+ border_width: 2
+ no_border_right: true
+ no_border_left: false
+ no_border_bottom: true
+ no_border_top: true
+
+outcome:
+ indent: 15
+ title:
+ size: 10
+ styles: [ "bold" ]
+ margin_top: 5
+ margin_bottom: 5
+ markdown_margin:
+ margin: 16
+ markdown:
+ font:
+ size: 10
+ leading: 3
+ header:
+ size: 8
+ styles: [ "bold" ]
+ padding_top: 4
+ header_1:
+ size: 10
+ header_2:
+ size: 10
+ header_3:
+ size: 9
+ paragraph:
+ align: "left"
+ unordered_list:
+ spacing: 1
+ unordered_list_point:
+ spacing: 4
+ ordered_list:
+ spacing: 1
+ ordered_list_point:
+ spacing: 4
+ spanning: true
+ list_style_type: decimal
+ ordered_list_point_2:
+ list_style_type: lower-latin
+ ordered_list_point_3:
+ list_style_type: lower-roman
+ ordered_list_point_4:
+ list_style_type: upper-latin
+ ordered_list_point_5:
+ list_style_type: upper-roman
+ task_list:
+ spacing: 1
+ task_list_point:
+ spacing: 4
+ checked: "☑"
+ unchecked: "☐"
+ link:
+ color: "175A8E"
+ styles: [ ]
+ code:
+ color: "880000"
+ size: 9
+ font: "SpaceMono"
+ blockquote:
+ background_color: "f4f9ff"
+ size: 10
+ styles: [ "italic" ]
+ color: "0f3b66"
+ border_color: "b8d6f4"
+ border_width: 1
+ padding: 4
+ padding_left: 6
+ margin_top: 4
+ margin_bottom: 4
+ no_border_left: false
+ no_border_right: true
+ no_border_bottom: true
+ no_border_top: true
+ image:
+ align: "center"
+ margin_bottom: 4
+ caption:
+ size: 8
+ align: "center"
+ codeblock:
+ background_color: "F5F5F5"
+ color: "880000"
+ padding: 10
+ size: 8
+ margin_top: 10
+ margin_bottom: 10
+ font: "SpaceMono"
+ table:
+ auto_width: true
+ margin_top: 4
+ margin_bottom: 4
+ header:
+ size: 9
+ styles: [ "bold" ]
+ background_color: "F0F0F0"
+ cell:
+ size: 8
+ border_width: 0.25
+ padding: 5
+ html_table:
+ auto_width: true
+ margin_top: 4
+ margin_bottom: 4
+ header:
+ size: 9
+ styles: [ "bold" ]
+ cell:
+ size: 8
+ border_width: 0.25
+ padding: 5
+ alerts:
+ NOTE:
+ border_color: '0969da'
+ alert_color: '0969da'
+ padding: '4mm'
+ size: 10
+ styles: [ ]
+ border_width: 2
+ no_border_right: true
+ no_border_left: false
+ no_border_bottom: true
+ no_border_top: true
+ TIP:
+ border_color: '1a7f37'
+ alert_color: '1a7f37'
+ padding: '4mm'
+ size: 10
+ styles: [ ]
+ border_width: 2
+ no_border_right: true
+ no_border_left: false
+ no_border_bottom: true
+ no_border_top: true
+ IMPORTANT:
+ border_color: '8250df'
+ alert_color: '8250df'
+ padding: '4mm'
+ size: 10
+ styles: [ ]
+ border_width: 2
+ no_border_right: true
+ no_border_left: false
+ no_border_bottom: true
+ no_border_top: true
+ WARNING:
+ border_color: 'bf8700'
+ alert_color: 'bf8700'
+ padding: '4mm'
+ size: 10
+ styles: [ ]
+ border_width: 2
+ no_border_right: true
+ no_border_left: false
+ no_border_bottom: true
+ no_border_top: true
+ CAUTION:
+ border_color: 'd1242f'
+ alert_color: 'd1242f'
+ size: 10
+ styles: [ ]
+ padding: '4mm'
+ border_width: 2
+ no_border_right: true
+ no_border_left: false
+ no_border_bottom: true
+ no_border_top: true
+
+heading:
+ size: 12
+ styles: [ "bold" ]
+ margin_bottom: 8
+ hr:
+ color: "6E7781"
+ height: 1.5
+ margin_bottom: 10
+
+participants:
+ margin_bottom: 8
+ cell:
+ size: 10
+ padding_left: 0
+ padding_bottom: 7
+ no_border: true
+
+attachments:
+ margin_bottom: 8
+ cell:
+ size: 10
+ padding_left: 0
+ padding_bottom: 7
+ no_border: true
+
+agenda_section:
+ title:
+ size: 12
+ color: "000000"
+ styles: [ "bold" ]
+ subtitle:
+ size: 11
+ color: "636C76"
+ title_cell:
+ padding_top: 2
+ padding_bottom: 10
+ padding_left: 5
+ padding_right: 5
+ no_border: true
+ background_color: "EAEAEA"
+ title_margins:
+ margin_top: 15
+ margin_bottom: 5
+
+agenda_item:
+ indent: 5
+ title_margin:
+ margin_bottom: 10
+ title_cell:
+ padding_top: 0
+ padding_bottom: 0
+ padding_left: 5
+ padding_right: 5
+ no_border: true
+ title:
+ styles: [ "bold" ]
+ size: 11
+ subtitle:
+ color: "636C76"
+ size: 10
+ hr:
+ color: "D0D7DE"
+ height: 1
+ margin_top: 6
+ margin_bottom: 6
diff --git a/app/models/work_package/pdf_export/export/meetings/styles.rb b/app/models/work_package/pdf_export/export/meetings/styles.rb
new file mode 100644
index 00000000000..74559607aca
--- /dev/null
+++ b/app/models/work_package/pdf_export/export/meetings/styles.rb
@@ -0,0 +1,163 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+module WorkPackage::PDFExport::Export::Meetings::Styles
+ class PDFStyles
+ include MarkdownToPDF::Common
+ include MarkdownToPDF::StyleHelper
+ include WorkPackage::PDFExport::Common::Styles
+ include WorkPackage::PDFExport::Common::StylesPage
+ include WorkPackage::PDFExport::Common::StylesCover
+
+ def page_subtitle
+ resolve_font(@styles[:page_subtitle])
+ end
+
+ def page_subtitle_margins
+ resolve_margin(@styles[:page_subtitle])
+ end
+
+ def notes_markdown_margins
+ resolve_margin(@styles.dig(:work_package, :markdown_margin))
+ end
+
+ def notes_markdown_styling_yml
+ resolve_markdown_styling(@styles.dig(:notes, :markdown) || {})
+ end
+
+ def outcome_markdown_styling_yml
+ resolve_markdown_styling(@styles.dig(:outcome, :markdown) || {})
+ end
+
+ def heading
+ resolve_font(@styles[:heading])
+ end
+
+ def heading_hr
+ {
+ color: @styles.dig(:heading, :hr, :color),
+ height: resolve_pt(@styles.dig(:heading, :hr, :height), 1)
+ }
+ end
+
+ def heading_hr_margins
+ resolve_margin(@styles.dig(:heading, :hr))
+ end
+
+ def agenda_item_title_margins
+ resolve_margin(@styles.dig(:agenda_item, :title_margin))
+ end
+
+ def agenda_item_indent
+ @styles.dig(:agenda_item, :indent).presence || 5
+ end
+
+ def outcome_title
+ resolve_font(@styles.dig(:outcome, :title))
+ end
+
+ def outcome_title_margins
+ resolve_margin(@styles.dig(:outcome, :title))
+ end
+
+ def outcome_indent
+ @styles.dig(:outcome, :indent).presence || 15
+ end
+
+ def agenda_item_title
+ resolve_font(@styles.dig(:agenda_item, :title))
+ end
+
+ def agenda_item_title_cell
+ resolve_table_cell(@styles.dig(:agenda_item, :title_cell))
+ end
+
+ def agenda_item_subtitle
+ resolve_font(@styles.dig(:agenda_item, :subtitle))
+ end
+
+ def agenda_item_hr
+ {
+ color: @styles.dig(:agenda_item, :hr, :color),
+ height: resolve_pt(@styles.dig(:agenda_item, :hr, :height), 1)
+ }
+ end
+
+ def agenda_item_margins
+ resolve_margin(@styles.dig(:agenda_item, :hr))
+ end
+
+ def heading_margins
+ resolve_margin(@styles[:heading])
+ end
+
+ def participants_table_cell
+ resolve_table_cell(@styles.dig(:participants, :cell))
+ end
+
+ def participants_margins
+ resolve_margin(@styles[:participants])
+ end
+
+ def attachments_table_cell
+ resolve_table_cell(@styles.dig(:attachments, :cell))
+ end
+
+ def attachments_margins
+ resolve_margin(@styles[:attachments])
+ end
+
+ def agenda_section_title
+ resolve_font(@styles.dig(:agenda_section, :title))
+ end
+
+ def agenda_section_title_table_margins
+ resolve_margin(@styles.dig(:agenda_section, :title_margins))
+ end
+
+ def agenda_section_subtitle
+ resolve_font(@styles.dig(:agenda_section, :subtitle))
+ end
+
+ def agenda_section_title_cell
+ resolve_table_cell(@styles.dig(:agenda_section, :title_cell))
+ end
+ end
+
+ def styles
+ @styles ||= PDFStyles.new(styles_asset_path)
+ end
+
+ private
+
+ def styles_asset_path
+ File.dirname(File.expand_path(__FILE__))
+ end
+end
diff --git a/app/models/work_package/pdf_export/generator/generator.rb b/app/models/work_package/pdf_export/generator/generator.rb
index 921178f4f29..77c62858e8d 100644
--- a/app/models/work_package/pdf_export/generator/generator.rb
+++ b/app/models/work_package/pdf_export/generator/generator.rb
@@ -135,7 +135,7 @@ module WorkPackage::PDFExport::Generator::Generator
if src == logo_image_filename
logo_image_filename
else
- attachment_image_filepath(work_package, src)
+ attachment_image_filepath(src)
end
})
end
diff --git a/app/models/work_packages/scopes/covering_dates_and_days_of_week.rb b/app/models/work_packages/scopes/covering_dates_or_days_of_week.rb
similarity index 83%
rename from app/models/work_packages/scopes/covering_dates_and_days_of_week.rb
rename to app/models/work_packages/scopes/covering_dates_or_days_of_week.rb
index 7ccb5a27df5..26025a638a7 100644
--- a/app/models/work_packages/scopes/covering_dates_and_days_of_week.rb
+++ b/app/models/work_packages/scopes/covering_dates_or_days_of_week.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-module WorkPackages::Scopes::CoveringDatesAndDaysOfWeek
+module WorkPackages::Scopes::CoveringDatesOrDaysOfWeek
extend ActiveSupport::Concern
using CoreExtensions::SquishSql
@@ -38,7 +38,7 @@ module WorkPackages::Scopes::CoveringDatesAndDaysOfWeek
# @param dates Date[] An array of the Date objects.
# @param days_of_week number[] An array of the ISO days of the week to
# consider. 1 is Monday, 7 is Sunday.
- def covering_dates_and_days_of_week(days_of_week: [], dates: [])
+ def covering_dates_or_days_of_week(days_of_week: [], dates: [])
work_packages_periods_cte = work_packages_periods_cte_for_covering_work_packages
where_covers_periods(work_packages_periods_cte, days_of_week, dates)
end
@@ -59,30 +59,28 @@ module WorkPackages::Scopes::CoveringDatesAndDaysOfWeek
-- select work packages dates
WITH
-- cte returning a table with work package id, period start_date and end_date
- #{work_packages_periods_cte},
-
- -- All days between the start date of a work package and its due date
- covered_dates AS (
- SELECT
- id,
- generate_series(work_packages_periods.start_date,
- work_packages_periods.end_date,
- '1 day') AS date
- FROM work_packages_periods
- ),
-
- -- All days between the start date of a work package and its due date including the day of the week for each date
- covered_dates_and_wday AS (
- SELECT
- id,
- date,
- EXTRACT(isodow FROM date) dow
- FROM covered_dates
- )
+ #{work_packages_periods_cte}
-- select id of work packages covering the given days
- SELECT id FROM covered_dates_and_wday
- WHERE dow IN (:days_of_week) OR date IN (:dates)
+ SELECT id
+ FROM work_packages_periods
+ WHERE
+ -- Check if the range covers any of the provided days of week. It is
+ -- done by comparing number of days from start_date to first target
+ -- day of week with number of days in range. If number is less or
+ -- eqal, then the range covers the target day of week
+ EXISTS (
+ SELECT 1
+ FROM UNNEST(ARRAY[:days_of_week]::INT[]) AS target_dow
+ WHERE (target_dow + 7 - EXTRACT(ISODOW FROM start_date)::INT) % 7 <= (end_date - start_date)
+ )
+ OR
+ -- Check if the range covers any of the provided dates
+ EXISTS (
+ SELECT 1
+ FROM unnest(Array[:dates]::DATE[]) AS target_date
+ WHERE target_date BETWEEN start_date AND end_date
+ )
SQL
covering_work_packages_query_sql = sanitize_sql([covering_work_packages_query_sql, { days_of_week:, dates: }])
@@ -146,8 +144,8 @@ module WorkPackages::Scopes::CoveringDatesAndDaysOfWeek
work_packages_periods AS (
SELECT DISTINCT ON (succ_id)
pred_id as id,
- pred_date as start_date,
- succ_date as end_date
+ pred_date::DATE as start_date,
+ succ_date::DATE as end_date
FROM automatic_follows_relations
ORDER BY succ_id, pred_date ASC
)
diff --git a/app/seeders/basic_data/base_role_seeder.rb b/app/seeders/basic_data/base_role_seeder.rb
index f3a09bfb404..4f0bdf2a1e3 100644
--- a/app/seeders/basic_data/base_role_seeder.rb
+++ b/app/seeders/basic_data/base_role_seeder.rb
@@ -29,6 +29,8 @@ module BasicData
class BaseRoleSeeder < ModelSeeder
self.needs = []
+ self.attribute_names_for_lookups = %i[name]
+
def model_attributes(role_data)
{
type:,
diff --git a/app/seeders/basic_data/type_seeder.rb b/app/seeders/basic_data/type_seeder.rb
index 4fb5b0e51e5..4c933251793 100644
--- a/app/seeders/basic_data/type_seeder.rb
+++ b/app/seeders/basic_data/type_seeder.rb
@@ -33,6 +33,7 @@ module BasicData
BasicData::ColorSeeder,
BasicData::ColorSchemeSeeder
]
+ self.attribute_names_for_lookups = %i[name]
def model_attributes(type_data)
{
diff --git a/app/seeders/basic_data/workflow_seeder.rb b/app/seeders/basic_data/workflow_seeder.rb
index ea0fd18a9a4..df8e13207c8 100644
--- a/app/seeders/basic_data/workflow_seeder.rb
+++ b/app/seeders/basic_data/workflow_seeder.rb
@@ -26,40 +26,22 @@
# See COPYRIGHT and LICENSE files for more details.
#++
module BasicData
- class WorkflowSeeder < Seeder
+ class WorkflowSeeder < ModelSeeder
self.needs = [
BasicData::ProjectRoleSeeder,
BasicData::GlobalRoleSeeder,
BasicData::StatusSeeder,
BasicData::TypeSeeder
]
+ self.model_class = Workflow
+ self.seed_data_model_key = "workflows"
def seed_data!
- if any_types_or_statuses_or_workflows_already_configured?
- print_status " *** Skipping types, statuses and workflows as there are already some configured"
- else
- seed_statuses
- seed_types
- seed_workflows
- end
+ seed_workflows
end
private
- def any_types_or_statuses_or_workflows_already_configured?
- Type.where(is_standard: false).any? || Status.any? || Workflow.any?
- end
-
- def seed_statuses
- print_status " ↳ Statuses"
- BasicData::StatusSeeder.new(seed_data).seed!
- end
-
- def seed_types
- print_status " ↳ Types"
- BasicData::TypeSeeder.new(seed_data).seed!
- end
-
def seed_workflows
member = seed_data.find_reference(:default_role_member)
project_admin = seed_data.find_reference(:default_role_project_admin)
diff --git a/app/seeders/demo_data/project_seeder.rb b/app/seeders/demo_data/project_seeder.rb
index 5b4090e6e43..28ff40817da 100644
--- a/app/seeders/demo_data/project_seeder.rb
+++ b/app/seeders/demo_data/project_seeder.rb
@@ -60,6 +60,11 @@ module DemoData
]
end
+ def applicable?
+ seed_data.reference_exists?(:default_role_project_admin) &&
+ types_seed_data.all? { |type_reference| seed_data.reference_exists?(type_reference) }
+ end
+
private
attr_writer :project
@@ -94,7 +99,7 @@ module DemoData
def set_types
print_status " -Assigning types."
- project.types = seed_data.find_references(project_data.lookup("types"))
+ project.types = seed_data.find_references(types_seed_data)
end
def seed_categories
@@ -142,6 +147,10 @@ module DemoData
end
end
+ def types_seed_data
+ seed_data.lookup("types") || []
+ end
+
def project_attributes
parent = Project.find_by(identifier: project_data.lookup("parent"))
{
diff --git a/app/seeders/demo_data/projects_seeder.rb b/app/seeders/demo_data/projects_seeder.rb
index 1bcba578149..d6642f60e72 100644
--- a/app/seeders/demo_data/projects_seeder.rb
+++ b/app/seeders/demo_data/projects_seeder.rb
@@ -34,8 +34,8 @@ module DemoData
print_status " ↳ Updating settings"
seed_settings
- seed_data.each_data("projects") do |project_data|
- seed_project(project_data)
+ project_seeders.each do |project_seeder|
+ project_seeder.seed!
Setting.demo_projects_available = true
end
@@ -44,7 +44,7 @@ module DemoData
end
def applicable?
- Project.count.zero?
+ Project.count.zero? && project_seeders.all?(&:applicable?)
end
def seed_settings
@@ -55,11 +55,6 @@ module DemoData
end
end
- def seed_project(project_data)
- project_seeder = ProjectSeeder.new(project_data)
- project_seeder.seed!
- end
-
def seed_form_configuration
BasicData::TypeConfigurationSeeder.new(seed_data).seed!
end
@@ -74,5 +69,12 @@ module DemoData
welcome_on_homescreen: 1
}
end
+
+ private
+
+ def project_seeders
+ @project_seeders ||= seed_data.each_data("projects")
+ .map { |project_data| ProjectSeeder.new(project_data) }
+ end
end
end
diff --git a/app/seeders/development_data/projects_seeder.rb b/app/seeders/development_data/projects_seeder.rb
index 62d1930cccf..70395ff7459 100644
--- a/app/seeders/development_data/projects_seeder.rb
+++ b/app/seeders/development_data/projects_seeder.rb
@@ -47,7 +47,9 @@ module DevelopmentData
end
def applicable?
- recent_installation? && Project.where(identifier: project_identifiers).count == 0
+ recent_installation? &&
+ Project.where(identifier: project_identifiers).count == 0 &&
+ seed_data.reference_exists?(:default_role_project_admin)
end
# returns true if no projects have been created more than 1 hour ago,
diff --git a/app/seeders/development_data_seeder.rb b/app/seeders/development_data_seeder.rb
index a60ab31bd92..fc509d829de 100644
--- a/app/seeders/development_data_seeder.rb
+++ b/app/seeders/development_data_seeder.rb
@@ -37,6 +37,10 @@ class DevelopmentDataSeeder < CompositeSeeder
]
end
+ def applicable?
+ DevelopmentData::CustomFieldsSeeder.new.applicable?
+ end
+
def namespace
"DevelopmentData"
end
diff --git a/app/seeders/source/seed_data.rb b/app/seeders/source/seed_data.rb
index 55d0e9829ae..641d3eb81a7 100644
--- a/app/seeders/source/seed_data.rb
+++ b/app/seeders/source/seed_data.rb
@@ -36,7 +36,7 @@ class Source::SeedData
def store_reference(reference, record)
return if reference.nil?
- if registry.key?(reference)
+ if reference_exists?(reference)
raise ArgumentError, "an object with reference #{reference.inspect} is already registered"
end
@@ -53,7 +53,7 @@ class Source::SeedData
def find_reference(reference, *fallbacks, default: :__unset__)
return if reference.nil?
- existing_ref = [reference, *fallbacks].find { |ref| registry.key?(ref) }
+ existing_ref = [reference, *fallbacks].find { |ref| reference_exists?(ref) }
if existing_ref
registry[existing_ref]
elsif default != :__unset__
@@ -72,6 +72,10 @@ class Source::SeedData
Array(references).map { |reference| find_reference(reference, default:) }
end
+ def reference_exists?(reference)
+ registry.key?(reference)
+ end
+
# Get a `SeedData` instance with only the given top level keys.
#
# Used in tests to get the real statuses, types and other data.
@@ -110,7 +114,7 @@ class Source::SeedData
def each_data(path)
sub_data = fetch(path)
- return if sub_data.nil?
+ return to_enum(:each_data, path) unless block_given? || sub_data.nil?
sub_data.each_value do |item_data|
yield self.class.new(item_data, registry)
diff --git a/app/seeders/standard/basic_data_seeder.rb b/app/seeders/standard/basic_data_seeder.rb
index 9c75d4b59d6..a0f02771f4b 100644
--- a/app/seeders/standard/basic_data_seeder.rb
+++ b/app/seeders/standard/basic_data_seeder.rb
@@ -39,6 +39,8 @@ module Standard
::BasicData::ColorSchemeSeeder,
::BasicData::ProjectPhaseColorSeeder,
::BasicData::ProjectPhaseDefinitionSeeder,
+ ::BasicData::StatusSeeder,
+ ::BasicData::TypeSeeder,
::BasicData::WorkflowSeeder,
::BasicData::PrioritySeeder,
::BasicData::SettingSeeder,
diff --git a/app/services/project_life_cycle_steps/activation_service.rb b/app/services/project_phases/activation_service.rb
similarity index 97%
rename from app/services/project_life_cycle_steps/activation_service.rb
rename to app/services/project_phases/activation_service.rb
index fe2fef3707f..6af06964b56 100644
--- a/app/services/project_life_cycle_steps/activation_service.rb
+++ b/app/services/project_phases/activation_service.rb
@@ -28,7 +28,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-module ProjectLifeCycleSteps
+module ProjectPhases
class ActivationService < ::BaseServices::BaseContracted
alias_method :project, :model
@@ -88,7 +88,7 @@ module ProjectLifeCycleSteps
end
def default_contract_class
- ProjectLifeCycleSteps::ActivationContract
+ ProjectPhases::ActivationContract
end
end
end
diff --git a/app/services/project_life_cycle_steps/update_service.rb b/app/services/project_phases/reschedule_service.rb
similarity index 79%
rename from app/services/project_life_cycle_steps/update_service.rb
rename to app/services/project_phases/reschedule_service.rb
index d70c65dbaa4..17c23df3bd8 100644
--- a/app/services/project_life_cycle_steps/update_service.rb
+++ b/app/services/project_phases/reschedule_service.rb
@@ -28,24 +28,26 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-module ProjectLifeCycleSteps
- class UpdateService < ::BaseServices::Update
- delegate :project, to: :model
+module ProjectPhases
+ class RescheduleService < ::BaseServices::BaseContracted
+ alias_method :project, :model
- def after_perform(*)
- reschedule_following_phases if model.date_range_set?
-
- project.touch_and_save_journals
-
- super
+ def initialize(user:, project:, contract_class: nil, contract_options: {})
+ super(user:, contract_class:, contract_options:)
+ self.model = project
end
private
- def reschedule_following_phases
- from = initial_reschedule_date
+ def persist(service_call)
+ reschedule_phases(**params)
- following_phases.each do |phase|
+ service_call
+ end
+
+ def reschedule_phases(phases:, from:)
+ phases.each do |phase|
+ next unless phase.active?
next unless phase.date_range_set?
next unless phase.duration&.positive? # not updated using service that sets duration
@@ -58,14 +60,6 @@ module ProjectLifeCycleSteps
end
end
- def initial_reschedule_date
- model.active? ? model.finish_date + 1 : model.start_date
- end
-
- def following_phases
- project.available_phases.select { it.position > model.position }
- end
-
def calculate_date_range(from, duration:)
days = working_days_from(from, count: duration)
@@ -80,5 +74,9 @@ module ProjectLifeCycleSteps
end
days
end
+
+ def default_contract_class
+ ProjectPhases::RescheduleContract
+ end
end
end
diff --git a/app/services/project_life_cycle_steps/set_attributes_service.rb b/app/services/project_phases/set_attributes_service.rb
similarity index 98%
rename from app/services/project_life_cycle_steps/set_attributes_service.rb
rename to app/services/project_phases/set_attributes_service.rb
index f6292c95858..59d263b8a7d 100644
--- a/app/services/project_life_cycle_steps/set_attributes_service.rb
+++ b/app/services/project_phases/set_attributes_service.rb
@@ -26,7 +26,7 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-module ProjectLifeCycleSteps
+module ProjectPhases
class SetAttributesService < ::BaseServices::SetAttributes
def perform(*)
super.tap do
diff --git a/app/services/project_phases/update_service.rb b/app/services/project_phases/update_service.rb
new file mode 100644
index 00000000000..99357f683dc
--- /dev/null
+++ b/app/services/project_phases/update_service.rb
@@ -0,0 +1,58 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+module ProjectPhases
+ class UpdateService < ::BaseServices::Update
+ delegate :project, to: :model
+
+ def after_perform(*)
+ reschedule_following_phases if model.date_range_set?
+
+ project.touch_and_save_journals
+
+ super
+ end
+
+ private
+
+ def reschedule_following_phases
+ RescheduleService.new(user:, project:)
+ .call(phases: following_phases, from: initial_reschedule_date)
+ end
+
+ def initial_reschedule_date
+ model.active? ? model.finish_date + 1 : model.start_date
+ end
+
+ def following_phases
+ project.available_phases.select { it.position > model.position }
+ end
+ end
+end
diff --git a/modules/costs/app/components/my/time_tracking/view_mode_switcher_component.rb b/app/services/projects/copy/phases_dependent_service.rb
similarity index 62%
rename from modules/costs/app/components/my/time_tracking/view_mode_switcher_component.rb
rename to app/services/projects/copy/phases_dependent_service.rb
index 225dce321ae..e981186d6ad 100644
--- a/modules/costs/app/components/my/time_tracking/view_mode_switcher_component.rb
+++ b/app/services/projects/copy/phases_dependent_service.rb
@@ -28,29 +28,27 @@
# See COPYRIGHT and LICENSE files for more details.
# ++
-module My
- module TimeTracking
- class ViewModeSwitcherComponent < ApplicationComponent
- options :mode,
- :view_mode,
- :date
-
- def call
- render(Primer::Alpha::TabNav.new(label: I18n.t(:label_view_mode_switcher))) do |component|
- component.with_tab(selected: view_mode == :calendar, href: link(:calendar)) do |tab|
- tab.with_text { I18n.t(:label_calendar) }
- tab.with_icon(icon: :calendar)
- end
-
- component.with_tab(selected: view_mode == :list, href: link(:list)) do |tab|
- tab.with_text { I18n.t(:label_list) }
- tab.with_icon(icon: "op-view-list")
- end
- end
+module Projects
+ module Copy
+ class PhasesDependentService < Dependency
+ def self.human_name
+ I18n.t("label_life_cycle_step_plural")
end
- def link(new_view_mode)
- my_time_tracking_path(date: date, mode: mode, view_mode: new_view_mode)
+ def source_count
+ source.phases.count
+ end
+
+ def copy_dependency(_params)
+ source.phases.each do |source_phase|
+ target.phases.create! **source_phase.attributes.slice(
+ "definition_id",
+ "start_date",
+ "finish_date",
+ "active",
+ "duration"
+ )
+ end
end
end
end
diff --git a/app/services/projects/copy_service.rb b/app/services/projects/copy_service.rb
index 869b70e5e18..0885a94df22 100644
--- a/app/services/projects/copy_service.rb
+++ b/app/services/projects/copy_service.rb
@@ -33,7 +33,7 @@ module Projects
include Projects::Concerns::NewProjectService
def self.copy_dependencies
- [
+ dependencies = [
::Projects::Copy::MembersDependentService,
::Projects::Copy::VersionsDependentService,
::Projects::Copy::CategoriesDependentService,
@@ -43,8 +43,15 @@ module Projects
::Projects::Copy::QueriesDependentService,
::Projects::Copy::BoardsDependentService,
::Projects::Copy::OverviewDependentService,
+ ::Projects::Copy::PhasesDependentService,
::Projects::Copy::StoragesDependentService
]
+
+ if OpenProject::FeatureDecisions.stages_and_gates_active?
+ dependencies
+ else
+ dependencies - [::Projects::Copy::PhasesDependentService]
+ end
end
# Project Folders and File Links aren't dependent services anymore,
diff --git a/app/services/settings/working_days_and_hours_update_service.rb b/app/services/settings/working_days_and_hours_update_service.rb
index 676d12551c2..648a40870a0 100644
--- a/app/services/settings/working_days_and_hours_update_service.rb
+++ b/app/services/settings/working_days_and_hours_update_service.rb
@@ -58,11 +58,16 @@ class Settings::WorkingDaysAndHoursUpdateService < Settings::UpdateService
def after_perform(call)
super.tap do
- WorkPackages::ApplyWorkingDaysChangeJob.perform_later(
- user_id: User.current.id,
- previous_working_days:,
- previous_non_working_days:
- )
+ [
+ Projects::Phases::ApplyWorkingDaysChangeJob,
+ WorkPackages::ApplyWorkingDaysChangeJob
+ ].each do |job_class|
+ job_class.perform_later(
+ user_id: User.current.id,
+ previous_working_days:,
+ previous_non_working_days:
+ )
+ end
end
end
diff --git a/app/views/admin/custom_fields/hierarchy/items/index.html.erb b/app/views/admin/custom_fields/hierarchy/items/index.html.erb
index b9b6d5af06f..9d2f8e5f76e 100644
--- a/app/views/admin/custom_fields/hierarchy/items/index.html.erb
+++ b/app/views/admin/custom_fields/hierarchy/items/index.html.erb
@@ -31,4 +31,14 @@ See COPYRIGHT and LICENSE files for more details.
<%= render(Admin::CustomFields::EditFormHeaderComponent.new(custom_field: @custom_field, selected: :items)) %>
-<%= render(Admin::CustomFields::Hierarchy::ItemsComponent.new(item: @active_item)) %>
+<%=
+ render(Primer::Alpha::Layout.new(stacking_breakpoint: :md)) do |content|
+ content.with_main do
+ render(Admin::CustomFields::Hierarchy::ItemsComponent.new(item: @active_item))
+ end
+
+ content.with_sidebar(row_placement: :start, col_placement: :start, border: true, border_radius: 2, p: 3) do
+ render(Admin::CustomFields::Hierarchy::TreeViewComponent.new(custom_field: @custom_field, active_item: @active_item))
+ end
+ end
+%>
diff --git a/app/views/attribute_help_texts/index.html.erb b/app/views/attribute_help_texts/index.html.erb
index 9ffbb8195b1..25df5b291bb 100644
--- a/app/views/attribute_help_texts/index.html.erb
+++ b/app/views/attribute_help_texts/index.html.erb
@@ -26,6 +26,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
See COPYRIGHT and LICENSE files for more details.
++#%>
+<% html_title t(:label_administration), t(:"attribute_help_texts.label_plural") %>
<% tabs = [
{
diff --git a/app/views/custom_fields/new.html.erb b/app/views/custom_fields/new.html.erb
index 448c0fba16d..aac6a2f74dc 100644
--- a/app/views/custom_fields/new.html.erb
+++ b/app/views/custom_fields/new.html.erb
@@ -46,7 +46,7 @@ See COPYRIGHT and LICENSE files for more details.
<% content_controller "admin--custom-fields",
dynamic: true,
"admin--custom-fields-format-config-value": OpenProject::CustomFieldFormatDependent.stimulus_config,
- "admin--custom-fields-enterprise-edition-value": EnterpriseToken.allows_to?(:custom_field_hierarchies) %>
+ "admin--custom-fields-hierarchy-enabled-value": EnterpriseToken.allows_to?(:custom_field_hierarchies) %>
<%= labelled_tabular_form_for @custom_field, as: :custom_field,
url: custom_fields_path,
diff --git a/app/views/projects/settings/life_cycle_steps/index.html.erb b/app/views/projects/settings/life_cycle_steps/index.html.erb
index 65805a9c311..6cb826f2993 100644
--- a/app/views/projects/settings/life_cycle_steps/index.html.erb
+++ b/app/views/projects/settings/life_cycle_steps/index.html.erb
@@ -27,10 +27,10 @@ See COPYRIGHT and LICENSE files for more details.
++#%>
-<%= render(Projects::Settings::LifeCycleSteps::IndexPageHeaderComponent.new(project: @project)) %>
+<%= render(Projects::Settings::LifeCycle::IndexPageHeaderComponent.new(project: @project)) %>
<%= render(
- Projects::Settings::LifeCycleSteps::IndexComponent.new(
+ Projects::Settings::LifeCycle::IndexComponent.new(
project: @project,
life_cycle_definitions: @life_cycle_definitions
)
diff --git a/app/workers/application_job.rb b/app/workers/application_job.rb
index ba200d0d897..d2e3bb1f775 100644
--- a/app/workers/application_job.rb
+++ b/app/workers/application_job.rb
@@ -33,7 +33,6 @@ class ApplicationJob < ActiveJob::Base
include SharedJobSetup
include JobPriority
-
def job_scheduled_at
GoodJob::Job.where(id: job_id).pick(:scheduled_at)
end
diff --git a/app/workers/apply_working_days_change_job_base.rb b/app/workers/apply_working_days_change_job_base.rb
new file mode 100644
index 00000000000..5783235cf67
--- /dev/null
+++ b/app/workers/apply_working_days_change_job_base.rb
@@ -0,0 +1,82 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+# Common methods for ApplyWorkingDaysChangeJobs
+class ApplyWorkingDaysChangeJobBase < ApplicationJob
+ include JobConcurrency
+ queue_with_priority :above_normal
+
+ good_job_control_concurrency_with(
+ total_limit: 1
+ )
+
+ attr_reader :previous_working_days, :previous_non_working_days
+
+ def perform(user_id:, previous_working_days:, previous_non_working_days:)
+ @previous_working_days = previous_working_days
+ @previous_non_working_days = previous_non_working_days
+
+ user = User.find(user_id)
+
+ User.execute_as user do
+ apply_working_days_change
+ end
+ end
+
+ private
+
+ def apply_working_days_change
+ fail NoMethodError, "Must be overridden in subclass"
+ end
+
+ def journal_cause
+ @journal_cause ||= Journal::CausedByWorkingDayChanges.new(
+ working_days: changed_days,
+ non_working_days: changed_non_working_dates
+ )
+ end
+
+ def changed_days
+ # reverse order, so new working days map to true
+ @changed_days ||= changes_between(previous_working_days, Setting.working_days)
+ end
+
+ def changed_non_working_dates
+ # reverse order, as new non working dates map to false
+ @changed_non_working_dates ||= changes_between(NonWorkingDay.pluck(:date), previous_non_working_days)
+ end
+
+ def changes_between(list_a, list_b)
+ deleted = (list_a - list_b).index_with(false)
+ added = (list_b - list_a).index_with(true)
+
+ deleted.merge(added)
+ end
+end
diff --git a/app/workers/exports/export_job.rb b/app/workers/exports/export_job.rb
index 422e348bd2e..95b28bc110e 100644
--- a/app/workers/exports/export_job.rb
+++ b/app/workers/exports/export_job.rb
@@ -39,17 +39,31 @@ module Exports
raise NotImplementedError
end
+ def list_export?
+ true
+ end
+
def export!
result = exporter_instance.export!
handle_export_result(export, result)
end
def exporter_instance
+ list_export? ? exporter_instance_list : exporter_single_list
+ end
+
+ def exporter_instance_list
::Exports::Register
.list_exporter(model, mime_type)
.new(query, options)
end
+ def exporter_single_list
+ ::Exports::Register
+ .single_exporter(model, mime_type)
+ .new(query, options)
+ end
+
def handle_export_result(export, result)
case result.content
when File
diff --git a/app/workers/projects/phases/apply_working_days_change_job.rb b/app/workers/projects/phases/apply_working_days_change_job.rb
new file mode 100644
index 00000000000..92659930f76
--- /dev/null
+++ b/app/workers/projects/phases/apply_working_days_change_job.rb
@@ -0,0 +1,56 @@
+# frozen_string_literal: true
+
+#-- copyright
+# OpenProject is an open source project management software.
+# Copyright (C) the OpenProject GmbH
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License version 3.
+#
+# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
+# Copyright (C) 2006-2013 Jean-Philippe Lang
+# Copyright (C) 2010-2013 the ChiliProject Team
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# See COPYRIGHT and LICENSE files for more details.
+#++
+
+class Projects::Phases::ApplyWorkingDaysChangeJob < ApplyWorkingDaysChangeJobBase
+ private
+
+ def apply_working_days_change
+ Project.where(id: applicable_phases.select(:project_id)).find_each do |project|
+ phases = project.available_phases.to_a
+ from = phases.filter_map(&:start_date).first
+ next unless from
+
+ ProjectPhases::RescheduleService.new(user: User.current, project:).call(phases:, from:)
+
+ project.journal_cause = journal_cause
+
+ project.touch_and_save_journals
+ end
+ end
+
+ def applicable_phases
+ days_of_week = changed_days.keys
+ dates = changed_non_working_dates.keys
+
+ Project::Phase
+ .active
+ .covering_dates_or_days_of_week(days_of_week:, dates:)
+ end
+end
diff --git a/app/workers/work_packages/apply_working_days_change_job.rb b/app/workers/work_packages/apply_working_days_change_job.rb
index 8e3247ffc7a..d58e5cb9936 100644
--- a/app/workers/work_packages/apply_working_days_change_job.rb
+++ b/app/workers/work_packages/apply_working_days_change_job.rb
@@ -26,40 +26,17 @@
# See COPYRIGHT and LICENSE files for more details.
#++
-class WorkPackages::ApplyWorkingDaysChangeJob < ApplicationJob
- include JobConcurrency
- queue_with_priority :above_normal
-
- good_job_control_concurrency_with(
- total_limit: 1
- )
-
- attr_reader :previous_working_days, :previous_non_working_days
-
- def perform(user_id:, previous_working_days:, previous_non_working_days:)
- @previous_working_days = previous_working_days
- @previous_non_working_days = previous_non_working_days
-
- user = User.find(user_id)
-
- User.execute_as user do
- for_each_work_package(applicable_work_packages) do |work_package|
- apply_change_to_work_package(work_package)
- end
-
- applicable_predecessors.find_each do |predecessor|
- apply_change_to_predecessor(predecessor)
- end
- end
- end
-
+class WorkPackages::ApplyWorkingDaysChangeJob < ApplyWorkingDaysChangeJobBase
private
- def journal_cause
- @journal_cause ||= Journal::CausedByWorkingDayChanges.new(
- working_days: changed_days,
- non_working_days: changed_non_working_dates
- )
+ def apply_working_days_change
+ for_each_work_package(applicable_work_packages) do |work_package|
+ apply_change_to_work_package(work_package)
+ end
+
+ applicable_predecessors.find_each do |predecessor|
+ apply_change_to_predecessor(predecessor)
+ end
end
def apply_change_to_work_package(work_package)
@@ -82,29 +59,11 @@ class WorkPackages::ApplyWorkingDaysChangeJob < ApplicationJob
days_of_week = changed_days.keys
dates = changed_non_working_dates.keys
WorkPackage
- .covering_dates_and_days_of_week(days_of_week:, dates:)
+ .covering_dates_or_days_of_week(days_of_week:, dates:)
.order(WorkPackage.arel_table[:start_date].asc.nulls_first,
WorkPackage.arel_table[:due_date].asc)
end
- def changed_days
- previous = Set.new(previous_working_days)
- current = Set.new(Setting.working_days)
-
- # `^` is a Set method returning a new set containing elements exclusive to
- # each other
- (previous ^ current).index_with { |day| current.include?(day) }
- end
-
- def changed_non_working_dates
- previous = Set.new(previous_non_working_days)
- current = Set.new(NonWorkingDay.pluck(:date))
-
- # `^` is a Set method returning a new set containing elements exclusive to
- # each other
- (previous ^ current).index_with { |day| current.exclude?(day) }
- end
-
def applicable_predecessors
days_of_week = changed_days.keys
dates = changed_non_working_dates.keys
diff --git a/config/initializers/feature_decisions.rb b/config/initializers/feature_decisions.rb
index b1721a94fca..270b0f1441c 100644
--- a/config/initializers/feature_decisions.rb
+++ b/config/initializers/feature_decisions.rb
@@ -45,4 +45,5 @@ OpenProject::FeatureDecisions.add :built_in_oauth_applications,
description: "Allows the display and use of built-in OAuth applications."
OpenProject::FeatureDecisions.add :stages_and_gates,
- description: "Enables the under construction feature of phases."
+ description: "Enables the project phases feature.",
+ force_active: true
diff --git a/config/locales/crowdin/af.yml b/config/locales/crowdin/af.yml
index 5d27748ecd1..6f11dfd12fa 100644
--- a/config/locales/crowdin/af.yml
+++ b/config/locales/crowdin/af.yml
@@ -2412,7 +2412,7 @@ af:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2894,8 +2894,8 @@ af:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Projek-instellings"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "Bekyk alle projekte"
label_project_show_details: "Toon projekdetails"
@@ -3636,7 +3636,7 @@ af:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4337,8 +4337,12 @@ af:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/ar.yml b/config/locales/crowdin/ar.yml
index aed2e8899cd..32d2da5b857 100644
--- a/config/locales/crowdin/ar.yml
+++ b/config/locales/crowdin/ar.yml
@@ -2568,7 +2568,7 @@ ar:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -3050,8 +3050,8 @@ ar:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "إعدادات المشروع"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "عرض جميع المشاريع"
label_project_show_details: "Show project details"
@@ -3798,7 +3798,7 @@ ar:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "لاستخدام هذا التخزين للملفات، تذكر تفعيل الوحدة والتخزين المحدد في إعدادات المشروع لكل مشروع مرغوب."
subversion:
existing_title: "مستودع التخريب موجود"
@@ -4503,8 +4503,12 @@ ar:
code_500_missing_enterprise_token: "لا يمكن معالجة الطلب بسبب أن رمز المؤسسة غير صالح أو مفقود."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 التاريخ فقط)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/az.yml b/config/locales/crowdin/az.yml
index ab30ad2155c..1fc6e5bf8d6 100644
--- a/config/locales/crowdin/az.yml
+++ b/config/locales/crowdin/az.yml
@@ -2412,7 +2412,7 @@ az:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2894,8 +2894,8 @@ az:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Project settings"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "View all projects"
label_project_show_details: "Show project details"
@@ -3636,7 +3636,7 @@ az:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4337,8 +4337,12 @@ az:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/be.yml b/config/locales/crowdin/be.yml
index 50a03f5f894..db5c9bdbc50 100644
--- a/config/locales/crowdin/be.yml
+++ b/config/locales/crowdin/be.yml
@@ -2490,7 +2490,7 @@ be:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2972,8 +2972,8 @@ be:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Project settings"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "View all projects"
label_project_show_details: "Show project details"
@@ -3718,7 +3718,7 @@ be:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4421,8 +4421,12 @@ be:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/bg.yml b/config/locales/crowdin/bg.yml
index c18749cf21c..f6af536b44f 100644
--- a/config/locales/crowdin/bg.yml
+++ b/config/locales/crowdin/bg.yml
@@ -2412,7 +2412,7 @@ bg:
static_token_name: "RSS токен"
disabled_text: "RSS токените не са разрешени от администратора. Моля, свържете се с администратора си, за да използвате тази функция."
storages:
- title: "Файлови Хранилища"
+ title: "File storages"
text_hint: "Токените за файловите хранилища свързват тази инстанция на OpenProject с външно хранилище на файлове."
empty_text_hint: "С акаунта ви не е свързан достъп до хранилище."
revoke_token: "Наистина ли искате да премахнете този символ? Ще трябва да влезете отново на %{storage}"
@@ -2894,8 +2894,8 @@ bg:
label_project_custom_field_plural: "Атрибути на проекта"
label_project_settings: "Настройки на проекта"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "Файлови Хранилища"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "Покажи всички проекти"
label_project_show_details: "Show project details"
@@ -3636,7 +3636,7 @@ bg:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "Настройка на хранилища за файлове"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Съществуващо хранилище за подверсии"
@@ -4337,8 +4337,12 @@ bg:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "ГГГГ-ММ-ДД (само за дата ISO 8601)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/ca.yml b/config/locales/crowdin/ca.yml
index 9aa3ba55f82..ed998ef2d05 100644
--- a/config/locales/crowdin/ca.yml
+++ b/config/locales/crowdin/ca.yml
@@ -2409,7 +2409,7 @@ ca:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "Emmagatzematges de fitxers"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2891,8 +2891,8 @@ ca:
label_project_custom_field_plural: "Atributs de projecte"
label_project_settings: "Configuració del projecte"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "Emmagatzematges de fitxers"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "Veure tots els projectes"
label_project_show_details: "Mostra detalls del projecte"
@@ -3627,7 +3627,7 @@ ca:
oauth_application_details: "El valor secret de client no serà accessible de nou un cop tanquis aquesta pestanya. Si us plau, còpia aquests valors a la configuració de \"Nextcloud OpenProject Integration\":"
oauth_application_details_link_text: "Ves a la pàgina de configuracions"
setup_documentation_details: "Si necessites ajuda configurant un nou emmagatzematge de fitxer si us plau, comprova la nostra documentació:"
- setup_documentation_details_link_text: "Configuració d'emmagatzematge de fitxers"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "Per tal d'utilitzar aquest emmagatzematge de fitxers recorda activar el mòdul i l'emmagatzematge específic a la configuració del projecte desitjat."
subversion:
existing_title: "Repositori de Subversion existent"
@@ -4328,8 +4328,12 @@ ca:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "No s'ha pogut trobar o s'ha eliminat el paquet de treball que estàs buscant."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "AAAA-MM-DD ( només dates ISO 8601)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (qualsevol data o temps compatible amb la ISO 8601)"
diff --git a/config/locales/crowdin/ckb-IR.yml b/config/locales/crowdin/ckb-IR.yml
index a7c0daf4443..13a98c09c19 100644
--- a/config/locales/crowdin/ckb-IR.yml
+++ b/config/locales/crowdin/ckb-IR.yml
@@ -2412,7 +2412,7 @@ ckb-IR:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2894,8 +2894,8 @@ ckb-IR:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Project settings"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "View all projects"
label_project_show_details: "Show project details"
@@ -3636,7 +3636,7 @@ ckb-IR:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4337,8 +4337,12 @@ ckb-IR:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/cs.yml b/config/locales/crowdin/cs.yml
index c797909fe8f..092e11a9c3c 100644
--- a/config/locales/crowdin/cs.yml
+++ b/config/locales/crowdin/cs.yml
@@ -2490,7 +2490,7 @@ cs:
static_token_name: "RSS token"
disabled_text: "API tokeny nejsou administrátorem povoleny. Pro použití této funkce kontaktujte svého správce."
storages:
- title: "Úložiště souborů"
+ title: "File storages"
text_hint: "Tokeny úložiště souborů připojují tuto OpenProject instanci s externím úložištěm souborů."
empty_text_hint: "K vašemu účtu není připojen žádný přístup k úložišti."
revoke_token: "Opravdu chcete odstranit tento token? Budete se muset znovu přihlásit na %{storage}"
@@ -2972,8 +2972,8 @@ cs:
label_project_custom_field_plural: "Atributy projektu"
label_project_settings: "Nastavení projektu"
label_project_attributes_settings: ""
- label_project_storage_plural: "Úložiště souborů"
- label_project_storage_project_folder: "Úložiště souborů: Složky projektů"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projekty využívající diskový prostor %{used_disk_space}"
label_project_view_all: "Zobrazit všechny projekty - seznam"
label_project_show_details: "Zobrazit detail projektu"
@@ -3717,7 +3717,7 @@ cs:
oauth_application_details: "Tajná hodnota klienta nebude po zavření tohoto okna přístupná. Zkopírujte tyto hodnoty do Nextcloud OpenProject Integration nastavení:"
oauth_application_details_link_text: "Přejít na stránku nastavení"
setup_documentation_details: "Pokud potřebujete pomoci s nastavením nového úložiště souborů, prosím zkonzultujte dokumentaci: "
- setup_documentation_details_link_text: "Nastavení úložiště souborů"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "Pro použití tohoto úložiště souborů nezapomeňte aktivovat modul a konkrétní úložiště v nastavení projektu každého požadovaného projektu."
subversion:
existing_title: "Existující repozitář Subversion"
@@ -4419,8 +4419,12 @@ cs:
code_500_missing_enterprise_token: "Požadavek nelze zpracovat kvůli neplatnému nebo chybějícímu tokenu Enterprise."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "Pracovní balíček, který hledáte, nebyl nalezen nebo byl odstraněn."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "RRRR-MM-DD (pouze ISO 8601 datum)"
datetime: "RRRR-MM-DDThh:mm:ss[.lll][+hh:mm] (jakýkoli kompatibilní datový prvek podle ISO 8601)"
diff --git a/config/locales/crowdin/da.yml b/config/locales/crowdin/da.yml
index b78f5890974..4e1befa0b63 100644
--- a/config/locales/crowdin/da.yml
+++ b/config/locales/crowdin/da.yml
@@ -2410,7 +2410,7 @@ da:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2892,8 +2892,8 @@ da:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Projektindstillinger"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "Se alle projekter"
label_project_show_details: "Show project details"
@@ -3632,7 +3632,7 @@ da:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Eksisterende underversions-repositorie"
@@ -4333,8 +4333,12 @@ da:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml
index 6cc24857981..952679ae0ce 100644
--- a/config/locales/crowdin/de.yml
+++ b/config/locales/crowdin/de.yml
@@ -681,7 +681,7 @@ de:
automatic: "Automatisch"
manual: "Manuell"
show_relations: "Beziehungen anzeigen"
- update_inputs_aria_live_message: "Date picker updated. %{message}"
+ update_inputs_aria_live_message: "Datumsauswahl aktualisiert. %{message}"
tabs:
aria_label: "Datumsauswahl Reiter"
children: "Untergeordnete Arbeitspakete"
@@ -751,8 +751,7 @@ de:
lag:
subject: "Verzögerung"
caption: |-
- The minimum number of working days to keep in between the two work packages.
- It can also be negative.
+ Die minimale Anzahl von Arbeitstagen zwischen den zwei Arbeitspaketen; kann auch negativ sein.
relations:
label_new_child_created: "Neues Arbeitspaket erstellt und als Kind hinzugefügt"
label_relates_singular: "Beziehung mit"
@@ -968,10 +967,10 @@ de:
project/phase:
date_range: "Zeitraum"
definition: "Definition"
- duration: "Duration"
- start_date: "Start date"
- start_date_caption: "Follows the previous phase."
- finish_date: "Finish date"
+ duration: "Dauer"
+ start_date: "Anfangstermin"
+ start_date_caption: "Folgt der vorherigen Phase."
+ finish_date: "Endtermin"
project/phase_definition:
name: "Name"
color: "Farbe"
@@ -1284,11 +1283,11 @@ de:
project/phase:
attributes:
start_date:
- must_be_before_finish_date: "must be before the finish date."
- non_continuous_dates: "can't be earlier than the previous phase's end date."
+ must_be_before_finish_date: "muss vor dem Enddatum liegen."
+ non_continuous_dates: "kann nicht vor dem Enddatum der vorherigen Phase liegen."
finish_date:
- must_be_after_start_date: "must be after the start date."
- cannot_be_a_non_working_day: "can't be a non-working day."
+ must_be_after_start_date: "muss nach dem Startdatum liegen."
+ cannot_be_a_non_working_day: "kann kein arbeitsfreier Tag sein."
query:
attributes:
project:
@@ -2414,7 +2413,7 @@ de:
unknown_storage: "Unbekannter Speicher"
notifications:
reasons:
- assigned: "Beauftragter"
+ assigned: "Zugewiesen an"
dateAlert: "Datumsalarm"
mentioned: "Erwähnt"
responsible: "Verantwortlich"
@@ -2596,8 +2595,8 @@ de:
label_deleted_custom_item: "(gelöschter Eintrag)"
label_deleted_custom_option: "(gelöschte Option)"
label_empty_element: "(leer)"
- label_go_back: "Go back one menu level"
- label_go_forward: "Open %{module} sub-menu"
+ label_go_back: "Eine Menüebene zurückgehen"
+ label_go_forward: "Öffne %{module} Untermenü"
label_missing_or_hidden_custom_option: "(Fehlender Wert oder fehlende Zugriffsberechtigungen)"
label_descending: "Absteigend"
label_details: "Details"
@@ -2897,7 +2896,7 @@ de:
label_query_new: "Neuer Bericht"
label_query_plural: "Benutzerdefinierte Berichte"
label_read: "Lesen ..."
- label_read_documentation: "Read documentation"
+ label_read_documentation: "Dokumentation lesen"
label_register: "Neues Konto erstellen"
label_register_with_developer: "Als Entwickler anmelden"
label_registered_on: "Angemeldet am"
@@ -3629,7 +3628,7 @@ de:
oauth_application_details: "Der Client Geheimcode wird nach dem Schließen dieses Fensters nicht mehr zugänglich sein. Bitte kopieren Sie diese Werte in die Nextcloud OpenProject Integrationseinstellungen:"
oauth_application_details_link_text: "Zu den Einstellungen gehen"
setup_documentation_details: "Wenn Sie Hilfe bei der Konfiguration eines neuen Datei-Speichers benötigen, konsultieren Sie bitte die Dokumentation: "
- setup_documentation_details_link_text: "Datei-Speicher einrichten"
+ setup_documentation_details_link_text: "Dateispeicher einrichten"
show_warning_details: "Um diesen Dateispeicher nutzen zu können, müssen Sie das Modul und den spezifischen Speicher in den Projekteinstellungen jedes gewünschten Projekts aktivieren."
subversion:
existing_title: "Vorhandenes Subversion Projektarchiv"
@@ -4328,9 +4327,13 @@ de:
code_500_outbound_request_failure: "Eine ausgehende Anfrage an eine andere Ressource ist mit dem Statuscode %{status_code} fehlgeschlagen."
code_500_missing_enterprise_token: "Die Anfrage kann wegen ungültigem oder fehlenden Enterprise Token nicht bearbeitet werden."
bad_request:
- emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ emoji_reactions_activity_type_not_supported: "Dieser Aktivitätstyp unterstützt keine Emoji-Reaktionen."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ Sie können nur eine Erinnerung gleichzeitig für ein Arbeitspaket festlegen. Bitte löschen oder aktualisieren Sie die bestehende Erinnerung.
not_found:
work_package: "Das von Ihnen gesuchte Arbeitspaket konnte nicht gefunden werden oder wurde gelöscht."
+ reminder: "Die Erinnerung, die Sie suchen, konnte nicht gefunden werden oder wurde gelöscht."
expected:
date: "YYYY-MM-DD (Datum nach ISO 8601)"
datetime: "JJJJ-MM-TTThh:mm:ss[.lll][+hh:mm] (kompatible ISO 8601-Datum)"
diff --git a/config/locales/crowdin/el.yml b/config/locales/crowdin/el.yml
index 5371cd108ec..ebc85a88f65 100644
--- a/config/locales/crowdin/el.yml
+++ b/config/locales/crowdin/el.yml
@@ -2408,7 +2408,7 @@ el:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2890,8 +2890,8 @@ el:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Ρυθμίσεις έργου"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "Εμφάνιση όλων των έργων"
label_project_show_details: "Εμφάνιση λεπτομερειών έργου"
@@ -3631,7 +3631,7 @@ el:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Υπάρχον αποθετήριο Subversion"
@@ -4331,8 +4331,12 @@ el:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "ΕΕΕΕ-ΜΜ-ΗΗ (ISO 8601 ημερομηνία μόνο)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/eo.yml b/config/locales/crowdin/eo.yml
index a8df62e1e63..6de046a90b9 100644
--- a/config/locales/crowdin/eo.yml
+++ b/config/locales/crowdin/eo.yml
@@ -2412,7 +2412,7 @@ eo:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2894,8 +2894,8 @@ eo:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Projektaj agordoj"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "Vidi ĉiujn projektojn"
label_project_show_details: "Montri projektajn detalojn"
@@ -3636,7 +3636,7 @@ eo:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4337,8 +4337,12 @@ eo:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml
index 45357c75cc4..9d7aee0acbb 100644
--- a/config/locales/crowdin/es.yml
+++ b/config/locales/crowdin/es.yml
@@ -2410,7 +2410,7 @@ es:
static_token_name: "Token RSS"
disabled_text: "Los tokens RSS no están habilitados por el administrador. Póngase en contacto con su administrador para utilizar esta función."
storages:
- title: "Almacenamiento de archivos"
+ title: "File storages"
text_hint: "Los tokens de Almacenamiento de archivos conectan esta instancia de OpenProject con un Almacenamiento de archivos externo."
empty_text_hint: "No hay acceso de almacenamiento vinculado a su cuenta."
revoke_token: "¿Realmente desea eliminar este token? Tendrá que volver a iniciar sesión en %{storage}"
@@ -2892,8 +2892,8 @@ es:
label_project_custom_field_plural: "Atributos del proyecto"
label_project_settings: "Configuración del proyecto"
label_project_attributes_settings: "Ajustes de los atributos del proyecto"
- label_project_storage_plural: "Almacenes de archivos"
- label_project_storage_project_folder: "Almacenes de archivos: Carpetas de proyectos"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} proyectos utilizando %{used_disk_space} espacio de disco"
label_project_view_all: "Ver todos los proyectos"
label_project_show_details: "Mostrar los detalles del proyecto"
@@ -3633,7 +3633,7 @@ es:
oauth_application_details: "La clave secreta de cliente no será accesible una vez se cierre esta ventana. Por favor, copie estos valores en la configuración de la integración de OpenProject en Nextcloud:"
oauth_application_details_link_text: "Ir a la página de configuración"
setup_documentation_details: "Si necesita ayuda para configurar un nuevo almacenamiento de archivos, compruebe la documentación: "
- setup_documentation_details_link_text: "Configuración de almacenamiento de archivos"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "Para utilizar este almacenamiento recuerde activar el módulo y el almacenamiento específico en la configuración de cada proyecto deseado."
subversion:
existing_title: "Subversion existentes de repositorio"
@@ -4333,8 +4333,12 @@ es:
code_500_missing_enterprise_token: "La solicitud no puede ser manejada debido a un token Enterprise inválido o inexistente."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "No se encuentra el paquete de trabajo que busca, o bien se ha eliminado."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "AAAA-MM-DD (ISO 8601 fecha solamente)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (cualquier valor de fecha/hora compatible con el formato ISO 8601)"
diff --git a/config/locales/crowdin/et.yml b/config/locales/crowdin/et.yml
index 5a6ea5e8cf2..6c6960ce200 100644
--- a/config/locales/crowdin/et.yml
+++ b/config/locales/crowdin/et.yml
@@ -2412,7 +2412,7 @@ et:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2894,8 +2894,8 @@ et:
label_project_custom_field_plural: "Projekti omadused"
label_project_settings: "Projekti sätted"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "Vaata kõiki projekte"
label_project_show_details: "Show project details"
@@ -3636,7 +3636,7 @@ et:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4337,8 +4337,12 @@ et:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/eu.yml b/config/locales/crowdin/eu.yml
index 6fe2445a405..59f02481313 100644
--- a/config/locales/crowdin/eu.yml
+++ b/config/locales/crowdin/eu.yml
@@ -2412,7 +2412,7 @@ eu:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2894,8 +2894,8 @@ eu:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Project settings"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "View all projects"
label_project_show_details: "Show project details"
@@ -3636,7 +3636,7 @@ eu:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4337,8 +4337,12 @@ eu:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/fa.yml b/config/locales/crowdin/fa.yml
index f3e4353c50c..2a1507de125 100644
--- a/config/locales/crowdin/fa.yml
+++ b/config/locales/crowdin/fa.yml
@@ -997,7 +997,7 @@ fa:
sort_by: "Sort results by"
filters: "فیلترها"
timeline_labels: "برچسب های خط زمان"
- timeline_visible: "نمایش Gant chart"
+ timeline_visible: "نمایش نمودار گانت"
timeline_zoom_level: "Gantt chart zoom level"
timestamps: "Baseline timestamps"
sort_criteria: "Sort criteria"
@@ -2412,7 +2412,7 @@ fa:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2894,8 +2894,8 @@ fa:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Project settings"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "View all projects"
label_project_show_details: "نمایش جزئیات پروژه"
@@ -3636,7 +3636,7 @@ fa:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4337,8 +4337,12 @@ fa:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/fi.yml b/config/locales/crowdin/fi.yml
index 042771bfed1..b28105b4b6c 100644
--- a/config/locales/crowdin/fi.yml
+++ b/config/locales/crowdin/fi.yml
@@ -2412,7 +2412,7 @@ fi:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2894,8 +2894,8 @@ fi:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Projektiasetukset"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "Kaikki projektit"
label_project_show_details: "Show project details"
@@ -3636,7 +3636,7 @@ fi:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4337,8 +4337,12 @@ fi:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/fil.yml b/config/locales/crowdin/fil.yml
index 90169852a2c..93a9e4b654c 100644
--- a/config/locales/crowdin/fil.yml
+++ b/config/locales/crowdin/fil.yml
@@ -2412,7 +2412,7 @@ fil:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2894,8 +2894,8 @@ fil:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Ang mga setting ng proyekto"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "Tingnan lahat ang mga proyekto"
label_project_show_details: "Ipakita ang mga detalye ng proyekto"
@@ -3634,7 +3634,7 @@ fil:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Umiiral na subversion respository"
@@ -4335,8 +4335,12 @@ fil:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml
index 5bf8cb40cda..62647547b71 100644
--- a/config/locales/crowdin/fr.yml
+++ b/config/locales/crowdin/fr.yml
@@ -2410,7 +2410,7 @@ fr:
static_token_name: "Jeton RSS"
disabled_text: "Les jetons RSS ne sont pas activés par l'administrateur. Veuillez contacter votre administrateur pour utiliser cette fonctionnalité."
storages:
- title: "Espaces de stockage des fichiers"
+ title: "File storages"
text_hint: "Les jetons de stockage de fichiers connectent cette instance OpenProject à une solution de stockage de fichiers externe."
empty_text_hint: "Il n'y a pas d'accès à l'espace de stockage lié à votre compte."
revoke_token: "Voulez-vous vraiment supprimer ce jeton ? Vous devrez vous reconnecter sur %{storage}"
@@ -2892,8 +2892,8 @@ fr:
label_project_custom_field_plural: "Attributs du projet"
label_project_settings: "Paramètres du projet"
label_project_attributes_settings: "Paramètres des attributs du projet"
- label_project_storage_plural: "Espaces de stockage des fichiers"
- label_project_storage_project_folder: "Espaces de stockage des fichiers : dossiers du projet"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projets utilisant %{used_disk_space} d'espace disque"
label_project_view_all: "Afficher tous les projets"
label_project_show_details: "Afficher les détails du projet"
@@ -3634,7 +3634,7 @@ fr:
oauth_application_details: "La clé secrète du client ne sera plus accessible après la fermeture de cette fenêtre. Veuillez copier ces valeurs dans les paramètres d'intégration Nextcloud OpenProject :"
oauth_application_details_link_text: "Aller à la page des paramètres"
setup_documentation_details: "Si vous avez besoin d'aide pour configurer un nouvel espace de stockage des fichiers, veuillez consulter la documentation : "
- setup_documentation_details_link_text: "Configuration de l'espace de stockage des fichiers"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "Pour utiliser ce stockage de fichiers, n'oubliez pas d'activer le module et le stockage spécifique dans les paramètres du projet de chaque projet souhaité."
subversion:
existing_title: "Dépôt Subversion existant"
@@ -4334,8 +4334,12 @@ fr:
code_500_missing_enterprise_token: "La requête ne peut pas être traitée en raison d'un jeton Entreprise invalide ou manquant."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "Le lot de travaux que vous cherchez est introuvable ou a été supprimé."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "AAAA-MM-JJ (date ISO 8601 uniquement)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (n'importe quelle date heure compatible ISO 8601)"
diff --git a/config/locales/crowdin/he.yml b/config/locales/crowdin/he.yml
index bdea6d8e95b..00268517039 100644
--- a/config/locales/crowdin/he.yml
+++ b/config/locales/crowdin/he.yml
@@ -2490,7 +2490,7 @@ he:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2972,8 +2972,8 @@ he:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "הגדרות הפרוייקט"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "הצג את כל הפרוייקטים"
label_project_show_details: "Show project details"
@@ -3718,7 +3718,7 @@ he:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4421,8 +4421,12 @@ he:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/hi.yml b/config/locales/crowdin/hi.yml
index 91480316020..06ce396af54 100644
--- a/config/locales/crowdin/hi.yml
+++ b/config/locales/crowdin/hi.yml
@@ -2410,7 +2410,7 @@ hi:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2892,8 +2892,8 @@ hi:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "परियोजना सेटिंग्स"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "सभी प्रोजेक्ट्स देखें"
label_project_show_details: "Show project details"
@@ -3634,7 +3634,7 @@ hi:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4335,8 +4335,12 @@ hi:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/hr.yml b/config/locales/crowdin/hr.yml
index fc5428e661a..559aee29986 100644
--- a/config/locales/crowdin/hr.yml
+++ b/config/locales/crowdin/hr.yml
@@ -2451,7 +2451,7 @@ hr:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2933,8 +2933,8 @@ hr:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Postavke projekta"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "Pogledaj sve projekte"
label_project_show_details: "Prikaži detalje o projektu"
@@ -3677,7 +3677,7 @@ hr:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Postojeći Subversion repozitorij"
@@ -4379,8 +4379,12 @@ hr:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/hu.yml b/config/locales/crowdin/hu.yml
index 1f3c8d5add0..9129ec093be 100644
--- a/config/locales/crowdin/hu.yml
+++ b/config/locales/crowdin/hu.yml
@@ -2411,7 +2411,7 @@ hu:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2893,8 +2893,8 @@ hu:
label_project_custom_field_plural: "Projekt attribútumok"
label_project_settings: "Projekt beállítások"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "Minden projekt megtekintése"
label_project_show_details: "Projekt részleteinek megjelenítése"
@@ -3634,7 +3634,7 @@ hu:
oauth_application_details: "Az ablak bezárása után az ügyfél titkos értéke nem lesz többé elérhető. Kérjük, másolja be ezeket az értékeket a Nextcloud OpenProject Integration beállításaiba:"
oauth_application_details_link_text: "Menjen a beállítások oldalra"
setup_documentation_details: "Ha segítségre van szüksége egy új fájltároló beállításához, kérjük, ellenőrizze a dokumentációt:"
- setup_documentation_details_link_text: "Fájltárolók beállítása"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Meglévő Subversion tároló"
@@ -4335,8 +4335,12 @@ hu:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "A keresett munkacsomag nem található, vagy törölve lett."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "ÉÉÉÉ-HH-NN (ISO 8601 dátum kötelező)"
datetime: "ÉÉÉÉ-HH-NNÓó:pp:ss[.lll][+óó:pp] (bármely kompatibilis ISO 8601 dátumidő)"
diff --git a/config/locales/crowdin/id.yml b/config/locales/crowdin/id.yml
index 13e32ebf26c..e6579a397c4 100644
--- a/config/locales/crowdin/id.yml
+++ b/config/locales/crowdin/id.yml
@@ -2369,7 +2369,7 @@ id:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2851,8 +2851,8 @@ id:
label_project_custom_field_plural: "Atribut proyek"
label_project_settings: "Projek setting"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "Lihat semua Project"
label_project_show_details: "Tampilkan detail proyek"
@@ -3588,7 +3588,7 @@ id:
oauth_application_details: "Nilai rahasia klien tidak akan dapat diakses lagi setelah Anda menutup jendela ini. Harap salin nilai-nilai ini ke pengaturan Nextcloud OpenProject Integration:"
oauth_application_details_link_text: "Buka halaman pengaturan"
setup_documentation_details: "Jika Anda memerlukan bantuan untuk mengonfigurasi penyimpanan file baru, harap periksa dokumentasinya:"
- setup_documentation_details_link_text: "Pengaturan Penyimpanan File"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Repository Subversion yang sudah ada"
@@ -4288,8 +4288,12 @@ id:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "Paket pekerjaan yang Anda cari tidak dapat ditemukan atau telah dihapus."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (setiap waktu ISO 8601 yang kompatibel)"
diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml
index 429fa2fdc61..3bb7a19167b 100644
--- a/config/locales/crowdin/it.yml
+++ b/config/locales/crowdin/it.yml
@@ -2409,7 +2409,7 @@ it:
static_token_name: "Token RSS"
disabled_text: "I token RSS non sono abilitati dall'amministratore. Contatta il tuo amministratore per utilizzare questa funzione."
storages:
- title: "Archiviazione dei file"
+ title: "File storages"
text_hint: "I token di archiviazione dei file connettono questa istanza OpenProject con un sistema di archiviazione file esterno."
empty_text_hint: "Non esiste alcun accesso allo spazio di archiviazione collegato al tuo account."
revoke_token: "Vuoi davvero rimuovere questo token? Dovrai effettuare nuovamente l'accesso su %{storage}"
@@ -2891,8 +2891,8 @@ it:
label_project_custom_field_plural: "Attributi del progetto"
label_project_settings: "Impostazioni progetto"
label_project_attributes_settings: "Impostazioni degli attributi del progetto"
- label_project_storage_plural: "Archiviazione dei file"
- label_project_storage_project_folder: "Archiviazione dei file: cartelle di progetto"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} progetti occupano uno spazio su disco di %{used_disk_space}"
label_project_view_all: "Vedi tutti i progetti"
label_project_show_details: "Mostra dettagli progetto"
@@ -3633,7 +3633,7 @@ it:
oauth_application_details: "Il valore segreto del client non sarà nuovamente accessibile dopo aver chiuso questa finestra. Copia questi valori nelle impostazioni d'integrazione di Nextcloud OpenProject:"
oauth_application_details_link_text: "Vai alla pagina delle impostazioni"
setup_documentation_details: "Se hai bisogno di aiuto per configurare un nuovo archivio file, controlla la documentazione: "
- setup_documentation_details_link_text: "Configurazione archivi file"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "Per utilizzare questo archivio di file ricordarsi di attivare il modulo e l'archivio specifico nelle impostazioni del progetto di ogni progetto desiderato."
subversion:
existing_title: "Archivio Subversion preesistente"
@@ -4334,8 +4334,12 @@ it:
code_500_missing_enterprise_token: "La richiesta non può essere gestita a causa di un token Enterprise non valido o mancante."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "La macro-attività che stai cercando non può essere trovata o è stata eliminata."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "AAAA-MM-GG (solo date ISO 8601)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (qualsiasi formato data e ora compatibile con ISO 8601)"
diff --git a/config/locales/crowdin/ja.yml b/config/locales/crowdin/ja.yml
index 78353666086..d3d5c32d3f9 100644
--- a/config/locales/crowdin/ja.yml
+++ b/config/locales/crowdin/ja.yml
@@ -1208,7 +1208,7 @@ ja:
custom_fields_project:
attributes:
project_ids:
- blank: "Please select a project."
+ blank: "プロジェクトを選択してください。"
custom_actions:
only_one_allowed: "(%{name}) 1 つの値のみ可能です。"
empty: "(%{name}) 値を空にすることはできません。"
@@ -2038,7 +2038,7 @@ ja:
title: Internal comments
description: "Internal comments allow an internal team to communicate amongst themselves privately. These are only visible to certain project roles and will never be visible publicly."
internal_comments_inline:
- title: "Write internal comments only a small group can see"
+ title: "内部コメントはグループ内のメンバーのみ閲覧できます"
description: " "
enumeration_activities: "タイムトラッキングアクティビティ"
enumeration_work_package_priorities: "ワークパッケージの優先度"
@@ -2371,7 +2371,7 @@ ja:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2600,7 +2600,7 @@ ja:
label_enterprise_edition: "エンタープライズ版"
label_enterprise_support: "Enterprise support"
label_environment: "環境"
- label_estimates_and_progress: "Estimates and progress"
+ label_estimates_and_progress: "見積もりと進捗"
label_equals: "等しい"
label_equals_with_descendants: "is any with descendants"
label_everywhere: "どこにでも"
@@ -2853,8 +2853,8 @@ ja:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "プロジェクトの設定"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "全プロジェクトを表示"
label_project_show_details: "プロジェクトの詳細を表示"
@@ -2976,7 +2976,7 @@ ja:
label_used_by_types: "タイプで使用"
label_used_in_projects: "プロジェクトで使用"
label_user: "ユーザ"
- label_user_and_permission: "Users and permissions"
+ label_user_and_permission: "ユーザーと権限"
label_user_named: "ユーザー名 %{name}"
label_user_activity: "%{value}の活動"
label_user_anonymous: "匿名ユーザ"
@@ -2990,7 +2990,7 @@ ja:
label_user_plural: "ユーザ"
label_user_search: "ユーザーを検索:"
label_user_settings: "ユーザー設定"
- label_users_settings: "Users settings"
+ label_users_settings: "ユーザー設定"
label_version_new: "新しいバージョン"
label_version_edit: "バージョンを編集"
label_version_plural: "バージョン"
@@ -3344,29 +3344,29 @@ ja:
text_getting_started_description: "Get a quick overview of project management and team collaboration with OpenProject. You can restart this video from the help menu."
welcome: "Welcome to %{app_title}"
select_language: "言語を選択してください"
- permission_add_work_package_comments: "Add comments"
+ permission_add_work_package_comments: "コメントの追加"
permission_add_work_packages: "ワークパッケージの追加"
permission_add_messages: "メッセージの投稿"
permission_add_project: "プロジェクトの作成"
permission_add_work_package_attachments: "添付ファイルを追加"
permission_add_work_package_attachments_explanation: "Allows adding attachments without Edit work packages permission"
- permission_add_internal_comments: "Write internal comments"
+ permission_add_internal_comments: "内部コメントの追加"
permission_archive_project: "プロジェクトをアーカイブ"
- permission_create_user: "Create users"
- permission_manage_user: "Edit users"
+ permission_create_user: "ユーザーの作成"
+ permission_manage_user: "ユーザーの編集"
permission_manage_placeholder_user: "プレースホルダーユーザーの作成、編集、削除"
permission_add_subprojects: "子プロジェクトの追加"
permission_add_work_package_watchers: "ウォッチャーの追加"
permission_assign_versions: "バージョンの割り当て"
permission_browse_repository: "リポジトリに読み取り専用のアクセス (参照およびチェックアウト)"
permission_change_wiki_parent_page: "親Wikiページの変更"
- permission_change_work_package_status: "Change work package status"
+ permission_change_work_package_status: "ワークパッケージのステータス変更"
permission_change_work_package_status_explanation: "Allows changing status without Edit work packages permission"
permission_comment_news: "ニュースへのコメント"
permission_commit_access: "リポジトリに読み取り/書き込みアクセス (コミット)"
permission_copy_projects: "プロジェクトのコピー"
permission_copy_work_packages: "作業項目をコピー"
- permission_create_backup: "バックアップを作成する"
+ permission_create_backup: "バックアップの作成"
permission_delete_work_package_watchers: "ウォッチャーの削除"
permission_delete_work_packages: "ワークパッケージの削除"
permission_delete_messages: "メッセージの削除"
@@ -3375,18 +3375,18 @@ ja:
permission_delete_timelines: "タイムラインの削除"
permission_delete_wiki_pages: "Wikiページの削除"
permission_delete_wiki_pages_attachments: "添付ファイルの削除"
- permission_edit_work_package_comments: "Moderate comments"
+ permission_edit_work_package_comments: "コメントの承認"
permission_edit_work_package_comments_explanation: "Caution: Users with this permission are able to edit anyone's comment."
permission_edit_work_packages: "ワークパッケージの編集"
permission_edit_messages: "メッセージの編集"
- permission_edit_own_internal_comments: "Edit own internal comments"
- permission_edit_own_work_package_comments: "Edit own comments"
+ permission_edit_own_internal_comments: "自分がした内部コメントの編集"
+ permission_edit_own_work_package_comments: "自分がしたコメントの編集"
permission_edit_own_messages: "自分の投稿したメッセージの編集"
permission_edit_own_time_entries: "自分が記入した作業時間の編集"
- permission_edit_others_internal_comments: "Moderate internal comments"
+ permission_edit_others_internal_comments: "内部コメントの承認"
permission_edit_others_internal_comments_explanation: "Caution: Users with this permission are able to edit other users' internal comments."
permission_edit_project: "プロジェクトの編集"
- permission_edit_project_attributes: "Edit project attributes"
+ permission_edit_project_attributes: "プロジェクト属性の編集"
permission_edit_project_phases: "Edit project phases"
permission_edit_reportings: "レポートの編集"
permission_edit_time_entries: "他のユーザーの作業時間を編集"
@@ -3415,8 +3415,8 @@ ja:
permission_rename_wiki_pages: "Wikiページ名の変更"
permission_save_queries: "ビューを保存"
permission_search_project: "Search project"
- permission_select_custom_fields: "Select custom fields"
- permission_select_project_custom_fields: "Select project attributes"
+ permission_select_custom_fields: "カスタムフィールドの選択"
+ permission_select_project_custom_fields: "プロジェクト属性の選択"
permission_select_project_phases: "Select project phases"
permission_select_project_phases_explanation: "Activate/Deactivate the phases in a project. Enables the user to select the life cycle appropriate for the project as inactive phases will not be visible in the project overview page nor the project list."
permission_select_project_modules: "プロジェクトでモジュールの選択"
@@ -3425,7 +3425,7 @@ ja:
permission_manage_own_reminders: "Create own reminders"
permission_view_project: "View projects"
permission_view_changesets: "OpenProject にリポジトリのリビジョンを表示"
- permission_view_internal_comments: "View internal comments"
+ permission_view_internal_comments: "内部コメントの閲覧"
permission_view_commit_author_statistics: "コミット作成者の統計情報の閲覧"
permission_view_dashboards: "View dashboards"
permission_view_work_package_watchers: "ウォッチャー一覧の閲覧"
@@ -3437,18 +3437,18 @@ ja:
permission_view_shared_work_packages: "View work package shares"
permission_view_time_entries: "作業時間記録の閲覧"
permission_view_timelines: "タイムラインの閲覧"
- permission_view_user_email: "View users' mail addresses"
+ permission_view_user_email: "ユーザーのメールアドレス閲覧"
permission_view_wiki_edits: "Wiki履歴の閲覧"
permission_view_wiki_pages: "Wikiの閲覧"
- permission_work_package_assigned: "Become assignee/responsible"
+ permission_work_package_assigned: "担当者/責任者になる"
permission_work_package_assigned_explanation: "それぞれのプロジェクトで、ワークパッケージはこの役割をもつユーザーおよびグループに割り当てることができます。"
permission_view_project_activity: "View project activity"
- permission_view_project_attributes: "View project attributes"
+ permission_view_project_attributes: "プロジェクト属性の閲覧"
permission_view_project_phases: "View project phases"
permission_save_bcf_queries: "Save BCF queries"
permission_manage_public_bcf_queries: "Manage public BCF queries"
permission_edit_attribute_help_texts: "Edit attribute help texts"
- permission_manage_public_project_queries: "Manage public project lists"
+ permission_manage_public_project_queries: "公開プロジェクトリストの管理"
permission_view_project_query: "View project query"
permission_edit_project_query: "Edit project query"
placeholders:
@@ -3593,7 +3593,7 @@ ja:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "このファイルストレージを使用するには、各プロジェクトのプロジェクト設定でモジュールと特定のストレージを有効にする必要があります。"
subversion:
existing_title: "既存の Subversion リポジトリ"
@@ -3676,7 +3676,7 @@ ja:
setting_commit_ref_keywords: "参照用キーワード"
setting_consent_time: "同意時間"
setting_consent_info: "同意文"
- setting_consent_required: "同意が必要です。"
+ setting_consent_required: "同意を求める"
setting_consent_decline_mail: "連絡先メールアドレスに同意します。"
setting_cross_project_work_package_relations: "他プロジェクトとの間にワークパッケージの関連付けを許可する"
setting_first_week_of_year: "年の最初の週に含む"
@@ -3792,10 +3792,10 @@ ja:
setting_total_percent_complete_mode_simple_average_caption_html: >-
Work is ignored and the total % Complete will be a simple average of % Complete values of work packages in the hierarchy.
setting_accessibility_mode_for_anonymous: "匿名ユーザ向けにアクセシビリティモードを有効"
- setting_user_format: "Users name format"
+ setting_user_format: "ユーザー名の形式"
setting_user_default_timezone: "ユーザーのデフォルトのタイム ゾーン"
- setting_users_deletable_by_admins: "管理者によるユーザアカウントが削除可能"
- setting_users_deletable_by_self: "ユーザによる自分のアカウント削除を許可"
+ setting_users_deletable_by_admins: "管理者によるユーザアカウント削除を許可"
+ setting_users_deletable_by_self: "自分のアカウント削除を許可"
setting_welcome_text: "ようこそブロックのテキスト"
setting_welcome_title: "ようこそブロックのタイトル"
setting_welcome_on_homescreen: "ホーム画面にようこそブロックを表示"
@@ -3863,7 +3863,7 @@ ja:
heading: "Project attributes"
label_new_attribute: "Project attribute"
label_new_section: "セクション"
- label_edit_section: "Edit title"
+ label_edit_section: "タイトルの編集"
label_section_actions: "Section actions"
heading_description: "These project attributes appear in the overview page of each project. You can add new attributes, group them into sections and re-order them as you please. These attributes can be enabled or disabled but not re-ordered at a project level."
label_project_custom_field_actions: "Project attribute actions"
@@ -3901,7 +3901,7 @@ ja:
session: "セッション"
user:
default_preferences: "デフォルト設定"
- display_format: "Display format"
+ display_format: "表示形式"
deletion: "削除"
working_days:
section_work_week: "作業週"
@@ -4103,8 +4103,8 @@ ja:
error_status_change_failed: "次のエラーによりユーザのステータスの変更が失敗しました:%{errors}"
invite: メールでユーザを招待
invited: 招待済み
- lock: "永続ロックする"
- locked: "永続ロック"
+ lock: "ロックする"
+ locked: "ロック済み"
no_login: "このユーザは、パスワードを使用してログイン認証します。パスワードによってのログインは無効なので、ユーザがログインできません。"
password_change_unsupported: パスワードの変更はサポートされていません。
registered: "登録済み"
@@ -4292,8 +4292,12 @@ ja:
code_500_missing_enterprise_token: "Enterprise トークンが無効または見つからないため、リクエストを処理できません。"
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 日付のみ)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
@@ -4486,6 +4490,6 @@ ja:
description: "Integration of OmniAuth strategy providers for authentication in OpenProject."
plugin_openproject_auth_saml:
name: "OmniAuth SAML / シングルサインオン"
- description: "OmniAuthSAMLプロバイダをOpenProjectに追加します"
+ description: "OmniAuthSAMLプロバイダをOpenProjectに追加"
enterprise_plans:
legacy_enterprise: "Enterprise Plan"
diff --git a/config/locales/crowdin/js-af.yml b/config/locales/crowdin/js-af.yml
index ac3c70ee570..03b343a9166 100644
--- a/config/locales/crowdin/js-af.yml
+++ b/config/locales/crowdin/js-af.yml
@@ -358,10 +358,10 @@ af:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ af:
label_version_plural: "Weergawes"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1035,9 +1035,15 @@ af:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-ar.yml b/config/locales/crowdin/js-ar.yml
index bf238e59101..d63be22f34f 100644
--- a/config/locales/crowdin/js-ar.yml
+++ b/config/locales/crowdin/js-ar.yml
@@ -358,10 +358,10 @@ ar:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ ar:
label_version_plural: "الإصدارات"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1039,9 +1039,15 @@ ar:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-az.yml b/config/locales/crowdin/js-az.yml
index f921eab4dcc..45515de590e 100644
--- a/config/locales/crowdin/js-az.yml
+++ b/config/locales/crowdin/js-az.yml
@@ -358,10 +358,10 @@ az:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ az:
label_version_plural: "Versions"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1035,9 +1035,15 @@ az:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-be.yml b/config/locales/crowdin/js-be.yml
index 6dc1bf8de6f..e7ab7103fa8 100644
--- a/config/locales/crowdin/js-be.yml
+++ b/config/locales/crowdin/js-be.yml
@@ -358,10 +358,10 @@ be:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ be:
label_version_plural: "Versions"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1037,9 +1037,15 @@ be:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-bg.yml b/config/locales/crowdin/js-bg.yml
index 3f72c81ed3c..562822493aa 100644
--- a/config/locales/crowdin/js-bg.yml
+++ b/config/locales/crowdin/js-bg.yml
@@ -358,10 +358,10 @@ bg:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ bg:
label_version_plural: "Версии"
label_view_has_changed: "Този изглед има не запазени промени. Кликнете, за да ги запишете."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1035,9 +1035,15 @@ bg:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "Датите на този работен пакет се извеждат автоматично от неговите деца. Активирайте „Ръчно планиране“, за да зададете датите."
is_switched_from_manual_to_automatic: "Датите на този работен пакет може да се наложи да бъдат преизчислени след преминаване от ръчно към автоматично планиране поради връзки с други работни пакети."
diff --git a/config/locales/crowdin/js-ca.yml b/config/locales/crowdin/js-ca.yml
index e39550b3e8c..78d6c081282 100644
--- a/config/locales/crowdin/js-ca.yml
+++ b/config/locales/crowdin/js-ca.yml
@@ -358,10 +358,10 @@ ca:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "S'ha produït un error en carregar les dades."
@@ -566,7 +566,7 @@ ca:
label_version_plural: "Versions"
label_view_has_changed: "Aquesta vista té canvis sense guardar. Fes clic per guardar-los."
help_texts:
- show_modal: "Mostra el text d'ajuda d'atributs"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Omet"
@@ -1035,9 +1035,15 @@ ca:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "Les dates d'aquest paquet de treball estan derivades automàticament dels seus fills. Activa la \"Planificació manual\" per canviar les dates."
is_switched_from_manual_to_automatic: "Pot ser que les dates d'aquest paquet de treball no es tornin a calcular automàticament en canviar de planificació manual a automàtica a causa de les relacions amb altres paquets de treball."
diff --git a/config/locales/crowdin/js-ckb-IR.yml b/config/locales/crowdin/js-ckb-IR.yml
index 52287217d80..6eb73115501 100644
--- a/config/locales/crowdin/js-ckb-IR.yml
+++ b/config/locales/crowdin/js-ckb-IR.yml
@@ -358,10 +358,10 @@ ckb-IR:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ ckb-IR:
label_version_plural: "Versions"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1035,9 +1035,15 @@ ckb-IR:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-cs.yml b/config/locales/crowdin/js-cs.yml
index 7efa753b444..333973a82da 100644
--- a/config/locales/crowdin/js-cs.yml
+++ b/config/locales/crowdin/js-cs.yml
@@ -357,10 +357,10 @@ cs:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Přihlásit kalendář k odběru"
inital_setup_error_message: "Při načítání dat došlo k chybě."
@@ -565,7 +565,7 @@ cs:
label_version_plural: "Verze"
label_view_has_changed: "Toto zobrazení obsahuje neuložené změny. Klepnutím je uložíte."
help_texts:
- show_modal: "Zobrazit položku nápovědy atributu"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Přeskočit"
@@ -1036,9 +1036,15 @@ cs:
reminders:
button_label: "Nastavit připomínku"
title:
- new: "Nastavit připomenutí"
+ new: "Set a reminder"
edit: "Upravit připomínku"
subtitle: "Za tento pracovní balíček obdržíte oznámení ve zvoleném čase."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "Data tohoto pracovního balíčku jsou automaticky odvozena od jeho dětí. Aktivujte 'Manuální plánování' pro ručné nastavení dat."
is_switched_from_manual_to_automatic: "Data tohoto pracovního balíčku budou možná muset být přepočítána po přepnutí z manuálu na automatické plánování kvůli vztahům s ostatními pracovními balíčky."
diff --git a/config/locales/crowdin/js-da.yml b/config/locales/crowdin/js-da.yml
index f9f54e053eb..580c8ad8be1 100644
--- a/config/locales/crowdin/js-da.yml
+++ b/config/locales/crowdin/js-da.yml
@@ -357,10 +357,10 @@ da:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -565,7 +565,7 @@ da:
label_version_plural: "Versioner"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Vis attributten til hjælpetekst"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Spring over"
@@ -1034,9 +1034,15 @@ da:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-de.yml b/config/locales/crowdin/js-de.yml
index b10a64df4c5..0b48e6f9b89 100644
--- a/config/locales/crowdin/js-de.yml
+++ b/config/locales/crowdin/js-de.yml
@@ -357,10 +357,10 @@ de:
learn_about: "Erfahren Sie mehr über die neuen Funktionen"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- Die Version enthält verschiedene neue Funktionen und Verbesserungen wie
Meeting Backlogs und das Ende der klassischen Meetings.
Aktualisierte Enterprise-Add-on-Pläne.
Interne Kommentare in Arbeitspaketen (Enterprise-Add-on).
Separates Zeiterfassungsmodul mit Kalenderansicht.
Das "Beziehungen"-Tab zeigt übergeordnete Arbeitspakete an.
Übergabe in die Community-Version: Graphen auf Projektübersichtsseite.
+ Die Version enthält verschiedene neue Funktionen und Verbesserungen wie
Strukturieren Sie den Projektlebenszyklus mit Phasen und Phasen-Gates.
Meetings im PDF-Format exportieren.
Setzen Sie leichter Erinnerungen.
Benutzen Sie negative Verzögerung für Arbeitspaketdaten.
Bäume für benutzerdefinierte Hierarchiefelder anzeigen.
Profitieren Sie von einer verbesserten Zugänglichkeit für die Datumsauswahl mit ARIA Live-Regionen.
ical_sharing_modal:
title: "Kalender abonnieren"
inital_setup_error_message: "Beim Abrufen der Daten ist ein Fehler aufgetreten."
@@ -565,7 +565,7 @@ de:
label_version_plural: "Versionen"
label_view_has_changed: "Diese Ansicht hat ungespeicherte Änderungen. Klicken, um sie zu speichern."
help_texts:
- show_modal: "Hilfe-Text für dieses Attribut anzeigen"
+ show_modal: "Hilfetext anzeigen"
onboarding:
buttons:
skip: "Überspringen"
@@ -610,7 +610,7 @@ de:
reasons:
mentioned: "Erwähnt"
watched: "Beobachter"
- assigned: "Beauftragter"
+ assigned: "Zugewiesen an"
#The enum value is named 'responsible' in the database and that is what is transported through the API
#up to the frontend.
responsible: "Verantwortlich"
@@ -686,7 +686,7 @@ de:
global:
immediately:
title: "Beteiligt"
- description: "Benachrichtigungen für alle Aktivitäten in Arbeitspaketen, an denen Sie beteiligt sind (Beauftragter, Verantwortlicher oder Beobachter)."
+ description: "Benachrichtigungen für alle Aktivitäten in Arbeitspaketen, an denen Sie beteiligt sind (Zugewiesen an, Verantwortlicher oder Beobachter)."
delayed:
title: "Nicht beteiligt"
description: "Zusätzliche Benachrichtigungen für Aktivitäten in allen Projekten."
@@ -1037,6 +1037,12 @@ de:
new: "Erinnerung einrichten"
edit: "Erinnerung bearbeiten"
subtitle: "Sie erhalten zum ausgewählten Zeitpunkt eine Benachrichtigung für dieses Arbeitspaket."
+ presets:
+ tomorrow: "Morgen"
+ three_days: "In 3 Tagen"
+ week: "In einer Woche"
+ month: "In einem Monat"
+ custom: "Zu einem bestimmten Datum/Zeitpunkt"
scheduling:
is_parent: "Die Termine dieses Arbeitspakets werden automatisch von seinen Kindern aggregiert. Aktivieren Sie \"Manuelle Planung\", um die Termine frei zu setzen."
is_switched_from_manual_to_automatic: "Die Termine dieses Arbeitspakets müssen nach dem Wechsel auf automatische Planung neu berechnet werden."
diff --git a/config/locales/crowdin/js-el.yml b/config/locales/crowdin/js-el.yml
index 6ebf4cfdcb7..d8bce19eb42 100644
--- a/config/locales/crowdin/js-el.yml
+++ b/config/locales/crowdin/js-el.yml
@@ -357,10 +357,10 @@ el:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -565,7 +565,7 @@ el:
label_version_plural: "Εκδόσεις"
label_view_has_changed: "Η προβολή έχει μη αποθηκευμένες αλλαγές. Κάντε κλικ για τις αποθηκεύσετε."
help_texts:
- show_modal: "Εμφανίστε το χαρακτηριστικό καταχώρησης κειμένου βοήθειας"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Παράλειψη"
@@ -1034,9 +1034,15 @@ el:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "Οι ημερομηνίες αυτού του πακέτου εργασίας προκύπτουν αυτόματα από τα παιδιά του. Ενεργοποιήστε τον \"Χειροκίνητο προγραμματισμό\" για να ορίσετε τις ημερομηνίες."
is_switched_from_manual_to_automatic: "Οι ημερομηνίες αυτού του πακέτου εργασίας μπορεί να χρειαστεί να υπολογιστούν εκ νέου μετά τη μετάβαση από χειροκίνητο σε αυτόματο προγραμματισμό λόγω των σχέσεων με άλλα πακέτα εργασίας."
diff --git a/config/locales/crowdin/js-eo.yml b/config/locales/crowdin/js-eo.yml
index 2cd5404374d..59c9a265422 100644
--- a/config/locales/crowdin/js-eo.yml
+++ b/config/locales/crowdin/js-eo.yml
@@ -358,10 +358,10 @@ eo:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ eo:
label_version_plural: "Versioj"
label_view_has_changed: "Tiun ĉi vido havas ne registritajn ŝanĝojn. Klaku por registri ilin."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1035,9 +1035,15 @@ eo:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-es.yml b/config/locales/crowdin/js-es.yml
index 6b142150ad1..9f6f687bfd6 100644
--- a/config/locales/crowdin/js-es.yml
+++ b/config/locales/crowdin/js-es.yml
@@ -358,10 +358,10 @@ es:
learn_about: "Más información sobre todas las nuevas funciones"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- La versión contiene varias funciones nuevas y mejoras, como
Backlogs de reuniones y fin de las reuniones clásicas.
Actualización de los planes Enterprise.
Comentarios internos en los paquetes de trabajo (extensión Enterprise).
Asuntos de paquetes de trabajo generados automáticamente (extensión Enterprise).
Módulo de seguimiento del tiempo independiente con vista de calendario.
Relación parental mostrada en la pestaña de relaciones de paquetes de trabajo.
Lanzamiento a la Comunidad: Gráficos en la página de vista general del proyecto.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Suscribirse al calendario"
inital_setup_error_message: "Se ha producido un error al obtener los datos."
@@ -566,7 +566,7 @@ es:
label_version_plural: "Versiones"
label_view_has_changed: "Esta vista tiene cambios sin guardar. Haga clic para guardarlos."
help_texts:
- show_modal: "Mostrar texto de ayuda de atributo"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Saltar"
@@ -1035,9 +1035,15 @@ es:
reminders:
button_label: "Establecer recordatorio"
title:
- new: "Establecer recordatorio"
+ new: "Set a reminder"
edit: "Editar recordatorio"
subtitle: "Recibirá una notificación para este paquete de trabajo en el momento elegido."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "Las fechas de este paquete de trabajo son deducidas automáticamente de sus sub-elementos. Active 'Programación manual' para establecer las fechas."
is_switched_from_manual_to_automatic: "Las fechas de este paquete de trabajo pueden necesitar ser recalculadas después de pasar de programación manual a programación automática debido a las relaciones con otros paquetes de trabajo."
diff --git a/config/locales/crowdin/js-et.yml b/config/locales/crowdin/js-et.yml
index b216d7ba56a..619f6aa180c 100644
--- a/config/locales/crowdin/js-et.yml
+++ b/config/locales/crowdin/js-et.yml
@@ -358,10 +358,10 @@ et:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ et:
label_version_plural: "Versioonid"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1035,9 +1035,15 @@ et:
reminders:
button_label: "Määra meeldetuletus"
title:
- new: "Määra meeldetuletus"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-eu.yml b/config/locales/crowdin/js-eu.yml
index 98c02da20cf..fddaa745148 100644
--- a/config/locales/crowdin/js-eu.yml
+++ b/config/locales/crowdin/js-eu.yml
@@ -358,10 +358,10 @@ eu:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ eu:
label_version_plural: "Bertsioak"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1035,9 +1035,15 @@ eu:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-fa.yml b/config/locales/crowdin/js-fa.yml
index 60d1e326e73..5d8936cae5d 100644
--- a/config/locales/crowdin/js-fa.yml
+++ b/config/locales/crowdin/js-fa.yml
@@ -358,10 +358,10 @@ fa:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ fa:
label_version_plural: "نسخه ها"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "صرفنظر"
@@ -1035,9 +1035,15 @@ fa:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-fi.yml b/config/locales/crowdin/js-fi.yml
index 9c0f8737d05..22b8459d721 100644
--- a/config/locales/crowdin/js-fi.yml
+++ b/config/locales/crowdin/js-fi.yml
@@ -358,10 +358,10 @@ fi:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ fi:
label_version_plural: "Versiot"
label_view_has_changed: "Tallenna muutokset tarvittaessa"
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Ohita"
@@ -1035,9 +1035,15 @@ fi:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-fil.yml b/config/locales/crowdin/js-fil.yml
index 00d3ee316be..ce11e8f9c58 100644
--- a/config/locales/crowdin/js-fil.yml
+++ b/config/locales/crowdin/js-fil.yml
@@ -358,10 +358,10 @@ fil:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ fil:
label_version_plural: "Mga bersyon"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Magpakita ng katangian tekstong tulong entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1035,9 +1035,15 @@ fil:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-fr.yml b/config/locales/crowdin/js-fr.yml
index 4917d83e2a8..be82b00488c 100644
--- a/config/locales/crowdin/js-fr.yml
+++ b/config/locales/crowdin/js-fr.yml
@@ -358,10 +358,10 @@ fr:
learn_about: "En savoir plus sur les nouvelles fonctionnalités"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- La version contient diverses nouvelles fonctionnalités et améliorations, telles que les
backlogs de réunions et la fin des réunions classiques.
Abonnements Enterprise mis à jour.
Commentaires internes dans les lots de travaux (add-on Enterprise).
Sujets de lot de travaux générés automatiquement (add-on Enterprise).
Module de suivi du temps séparé avec vue calendrier.
La relation parent s'affiche dans l'onglet des relations du lot de travaux.
Publication dans la communauté : graphiques sur la page de présentation du projet.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "S'abonner au calendrier"
inital_setup_error_message: "Une erreur est survenue lors de la récupération des données."
@@ -566,7 +566,7 @@ fr:
label_version_plural: "Versions"
label_view_has_changed: "Cette vue a des changements non sauvegardés. Cliquez pour les enregistrer."
help_texts:
- show_modal: "Afficher l’aide de l’attribut de saisie de texte"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Passer"
@@ -1035,9 +1035,15 @@ fr:
reminders:
button_label: "Définir un rappel"
title:
- new: "Définir un rappel"
+ new: "Set a reminder"
edit: "Modifier un rappel"
subtitle: "Vous recevrez une notification pour ce lot de travaux au moment choisi."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "Les dates de ce lot de travaux sont automatiquement déduites de ses enfants. Activez la « Planification manuelle » pour définir les dates."
is_switched_from_manual_to_automatic: "Les dates de ce lot de travaux peuvent avoir besoin d'être recalculées après avoir passé de la planification manuelle à la planification automatique en raison de relations avec d'autres lots de travaux."
diff --git a/config/locales/crowdin/js-he.yml b/config/locales/crowdin/js-he.yml
index 08b580badd7..6b4ca3680ce 100644
--- a/config/locales/crowdin/js-he.yml
+++ b/config/locales/crowdin/js-he.yml
@@ -358,10 +358,10 @@ he:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ he:
label_version_plural: "גירסאות"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1037,9 +1037,15 @@ he:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-hi.yml b/config/locales/crowdin/js-hi.yml
index 8ba32d3adb8..4b88bf66931 100644
--- a/config/locales/crowdin/js-hi.yml
+++ b/config/locales/crowdin/js-hi.yml
@@ -358,10 +358,10 @@ hi:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ hi:
label_version_plural: "संस्करण"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1035,9 +1035,15 @@ hi:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-hr.yml b/config/locales/crowdin/js-hr.yml
index 45f526451b9..5f76c02ad16 100644
--- a/config/locales/crowdin/js-hr.yml
+++ b/config/locales/crowdin/js-hr.yml
@@ -358,10 +358,10 @@ hr:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ hr:
label_version_plural: "Verzije"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1036,9 +1036,15 @@ hr:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-hu.yml b/config/locales/crowdin/js-hu.yml
index f4300c49b02..a046a3b0ba8 100644
--- a/config/locales/crowdin/js-hu.yml
+++ b/config/locales/crowdin/js-hu.yml
@@ -358,10 +358,10 @@ hu:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ hu:
label_version_plural: "Verzió"
label_view_has_changed: "Ez a nézet nem mentett változtatásokat tartalmaz. Kattintson a mentéshez."
help_texts:
- show_modal: "Attribútum-súgószöveg mutatása"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Kihagyás"
@@ -1035,9 +1035,15 @@ hu:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "A munkacsomag dátumait automatikusan levezetik a gyermekeiből. A dátumok beállításához aktiválja a „Kézi ütemezést”"
is_switched_from_manual_to_automatic: "Ennek a munkacsomagnak a dátumait újra kell kalkulálni, miután a kézi üzemmódról az automatikus ütemezésre váltott, más munkacsomagokkal való kapcsolat miatt.\n"
diff --git a/config/locales/crowdin/js-id.yml b/config/locales/crowdin/js-id.yml
index 27448a97993..6c22942536f 100644
--- a/config/locales/crowdin/js-id.yml
+++ b/config/locales/crowdin/js-id.yml
@@ -358,10 +358,10 @@ id:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ id:
label_version_plural: "Versi"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Tampilkan atribut-atribut teks bantuan yang dimasukkan"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1034,9 +1034,15 @@ id:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-it.yml b/config/locales/crowdin/js-it.yml
index 2e6c96d4ea6..d10639fbf16 100644
--- a/config/locales/crowdin/js-it.yml
+++ b/config/locales/crowdin/js-it.yml
@@ -358,10 +358,10 @@ it:
learn_about: "Scopri di più su tutte le nuove funzionalità"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- Questa versione contiene diverse nuove funzionalità e miglioramenti, come
Backlog di riunioni e la fine delle riunioni classiche.
Piani Enterprise aggiornati.
Commenti interni nelle macro-attività (componente aggiuntivo Enterprise).
Oggetti delle macro-attività generati automaticamente (componente aggiuntivo Enterprise).
Modulo di monitoraggio del tempo separato con visualizzazione calendario.
Relazione genitore visibile nella scheda Relazioni delle macro-attività.
Rilascio in Community: grafici nella pagina di panoramica del progetto.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Iscriviti al calendario"
inital_setup_error_message: "Si è verificato un errore recuperando i dati."
@@ -566,7 +566,7 @@ it:
label_version_plural: "Versioni"
label_view_has_changed: "Questa vista ha modifiche non salvate. Clicca per salvarle."
help_texts:
- show_modal: "Mostra l'immissione di testo della guida dell'attributo"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Salta"
@@ -1035,9 +1035,15 @@ it:
reminders:
button_label: "Imposta promemoria"
title:
- new: "Imposta promemoria"
+ new: "Set a reminder"
edit: "Modifica promemoria"
subtitle: "Riceverai una notifica per questa macro-attività all'ora scelta."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "Le date di questa macro-attività vengono automaticamente dedotte dai suoi figli. Attiva 'Programmazione manuale' per impostare le date."
is_switched_from_manual_to_automatic: "Potrebbe essere necessario ricalcolare le date di questa macro-attività dopo il passaggio dalla programmazione manuale alla programmazione automatica a causa delle relazioni con altre macro-attività."
diff --git a/config/locales/crowdin/js-ja.yml b/config/locales/crowdin/js-ja.yml
index 0c277e4245f..9b6c005ade0 100644
--- a/config/locales/crowdin/js-ja.yml
+++ b/config/locales/crowdin/js-ja.yml
@@ -324,7 +324,7 @@ ja:
farRight: "右端"
description: >
Select the attributes you want to be shown in the respective positions of the Gantt chart at all times. Note that when hovering over an element, its date labels will be shown instead of these attributes.
- button_activate: "ガントチャートの表示"
+ button_activate: "ガントチャートを表示"
button_deactivate: "ガントチャートを隠す"
filter:
noneSelection: "(なし)"
@@ -332,7 +332,7 @@ ja:
notification: "関連を作成するには、強調表示されたワークパッケージをクリックします。キャンセルするにはエスケープキーを押してください。"
zoom:
in: "拡大"
- out: "拡大"
+ out: "縮小"
auto: "自動ズーム"
days: "日"
weeks: "週"
@@ -359,10 +359,10 @@ ja:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -429,7 +429,7 @@ ja:
label_expanded: "展開"
label_expand_all: "全てを展開"
label_expand_project_menu: "プロジェクトメニューを展開"
- label_export: "外部出力"
+ label_export: "エクスポート"
label_export_preparing: "エクスポートは準備中です。まもなくダウンロードされます。"
label_favorites: "Favorites"
label_filename: "ファイル"
@@ -546,28 +546,28 @@ ja:
label_custom_queries: "非公開"
label_columns: "列"
label_attachments: 添付ファイル
- label_drop_files: "Drop files here to attach files."
- label_drop_or_click_files: "Drop files here or click to attach files."
+ label_drop_files: "ここにファイルをドロップして添付。"
+ label_drop_or_click_files: "ここにファイルをドロップするかクリックしてファイルを添付。"
label_drop_folders_hint: フォルダを添付ファイルとしてアップロードすることはできません。 単一のファイルを選択してください。
label_add_attachments: "ファイルを添付"
label_formattable_attachment_hint: "このフィールドにドロップ、またはクリップボードから貼り付けて、ファイルを添付およびリンクします。"
- label_remove_file: "%{fileName}を削除"
- label_remove_watcher: "ウォッチャー%{name}を削除"
+ label_remove_file: "%{fileName} を削除"
+ label_remove_watcher: "ウォッチャー %{name} を削除"
label_remove_all_files: 全てのファイルを削除
- label_add_description: "%{file}の説明を追加"
+ label_add_description: "%{file} の説明を追加"
label_upload_notification: "ファイルをアップロード中..."
- label_work_package_upload_notification: "作業項目#%{id}: %{subject}用ファイルをアップロード中"
- label_wp_id_added_by: "#%{id}が%{author}によって追加されました"
+ label_work_package_upload_notification: "作業項目#%{id}: %{subject} 用ファイルをアップロード中"
+ label_wp_id_added_by: "#%{id} が %{author} によって追加されました"
label_files_to_upload: "これらのファイルをアップロードします:"
label_rejected_files: "これらのファイルをアップロードできません:"
- label_rejected_files_reason: "ファイルサイズが%{maximumFilesize}を越えたために、これらのファイルをアップロードできません"
+ label_rejected_files_reason: "ファイルサイズが %{maximumFilesize} を越えたために、これらのファイルをアップロードできません"
label_wait: "構成をお待ちください..."
- label_upload_counter: "%{count}ファイルの中に%{done}が完了"
+ label_upload_counter: "%{done} / %{count} 個のファイルが完了"
label_validation_error: "次のエラーのために作業項目を保存できませんでした:"
label_version_plural: "バージョン"
label_view_has_changed: "このビューには未保存の変更があります。 クリックすると保存します。"
help_texts:
- show_modal: "テキスト入力属性のヘルプを表示"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "スキップ"
@@ -626,7 +626,7 @@ ja:
reminder: "Reminder"
date_alerts:
milestone_date: "Milestone date"
- overdue: "Overdue"
+ overdue: "期限切れ"
overdue_since: "%{difference_in_days}以降。"
property_today: "は今日です。"
property_is: "は%{difference_in_days}後。"
@@ -762,7 +762,7 @@ ja:
last_day: "Last day"
text_are_you_sure: "よろしいですか?"
text_data_lost: "All entered data will be lost."
- text_user_wrote: "%{value}が書き込みました:"
+ text_user_wrote: "%{value} が書き込みました:"
types:
attribute_groups:
error_duplicate_group_name: "名前 %{group} が複数回使用されています。グループ名は一意にする必要があります。"
@@ -919,7 +919,7 @@ ja:
message_work_package_status_blocked: "ステータスがクローズでクローズされたバージョンが割り当てられているため、ワークパッケージのステータスは書き込みできません。"
placeholder_filter_by_text: "タイトル、説明、コメント、..."
progress:
- title: "Work estimates and progress"
+ title: "作業見積もりと進捗"
baseline:
addition_label: "Added to view within the comparison time period"
removal_label: "Removed from view within the comparison time period"
@@ -991,11 +991,11 @@ ja:
default_queries:
manually_sorted: "New manually sorted query"
latest_activity: "最新の活動"
- created_by_me: "私が作成した"
- assigned_to_me: "私に割り当てられた"
- recently_created: "最近作成された"
+ created_by_me: "自分が作成したもの"
+ assigned_to_me: "自分の担当するもの"
+ recently_created: "最近作成されたもの"
all_open: "未完了"
- overdue: "Overdue"
+ overdue: "期限の過ぎたもの"
summary: "サマリ"
shared_with_users: "ユーザーと共有"
shared_with_me: "Shared with me"
@@ -1035,9 +1035,15 @@ ja:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "このワークパッケージの日付は、その子から自動的に推定されます。日付を設定するには、「手動スケジューリング」を有効にします。"
is_switched_from_manual_to_automatic: "他のワークパッケージとの関連により、手動スケジューリングから自動スケジューリングに切り替えた後に、このワークパッケージの日付を再計算する必要がある場合があります。"
@@ -1073,7 +1079,7 @@ ja:
priority: "優先度"
type: "タイプ"
sorting_mode:
- description: "ワークパッケージを並び替えるモードを選択:"
+ description: "並び替えモードを選択:"
automatic: "自動"
manually: "手動"
warning: "自動並び替えモードをアクティブにすると、以前のソートが失われます。"
@@ -1102,7 +1108,7 @@ ja:
hide_sums: "合計の非表示"
save: "保存"
save_as: "名前をつけて保存"
- export: "外部出力"
+ export: "エクスポート"
visibility_settings: "表示の設定"
share_calendar: "Subscribe to calendar"
page_settings: "ビューの名前を変更..."
@@ -1152,8 +1158,8 @@ ja:
null_value_label: "値なし"
clear_value_label: "-"
errors:
- required: "%{field}を空にできません"
- number: "%{field}は有効な数値ではありません"
+ required: "%{field} を空にできません"
+ number: "%{field} は有効な数値ではありません"
maxlength: "%{field} は %{maxLength} 以上の桁の数字を入れることはできません"
minlength: "%{field} は %{minLength} 未満の桁の数字を入れることはできません"
messages_on_field: "このフィールドは無効です: %{messages}"
@@ -1172,7 +1178,7 @@ ja:
zero: "0 h"
day:
one: "1 day"
- other: "%{count}日間"
+ other: "%{count} 日間"
zero: "0 days"
word:
other: "%{count} words"
@@ -1213,7 +1219,7 @@ ja:
no_results: "プロジェクトが見つかりませんでした"
no_invite_rights: "このプロジェクトにメンバーを招待することは許可されていません"
type:
- required: "招待するタイプを選択してください "
+ required: "招待するタイプを選択してください"
user:
title: "ユーザ"
description: "選択したプロジェクトで割り当てられたロールに基づく権限"
@@ -1269,15 +1275,15 @@ ja:
no_results: "You have no favorite projects"
no_results_subtext: "Add one or multiple projects as favorite through their overview or in a project list."
include_projects:
- toggle_title: "Include projects"
+ toggle_title: "対象プロジェクト"
title: "プロジェクト"
- clear_selection: "Clear selection"
+ clear_selection: "選択をクリア"
apply: "適用"
selected_filter:
all: "すべてのプロジェクト"
- selected: "Only selected"
- search_placeholder: "Search project..."
- include_subprojects: "Include all sub-projects"
+ selected: "選択したもののみ"
+ search_placeholder: "プロジェクトを検索…"
+ include_subprojects: "すべてのサブプロジェクトを含む"
tooltip:
include_all_selected: "Project already included since Include all sub-projects is enabled."
current_project: "This is the current project you are in."
@@ -1292,8 +1298,8 @@ ja:
help_description: "Reference time zone for the baseline."
time_description: "In your local time: %{datetime}"
time: "時間"
- from: "日付指定: "
- to: "から"
+ from: "From"
+ to: "To"
drop_down:
none: "-"
yesterday: "昨日"
diff --git a/config/locales/crowdin/js-ka.yml b/config/locales/crowdin/js-ka.yml
index 361996a2276..4fcd7f44d12 100644
--- a/config/locales/crowdin/js-ka.yml
+++ b/config/locales/crowdin/js-ka.yml
@@ -358,10 +358,10 @@ ka:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ ka:
label_version_plural: "ვერსიები"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "გამოტოვება"
@@ -1035,9 +1035,15 @@ ka:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-kk.yml b/config/locales/crowdin/js-kk.yml
index c8ce8d3eefe..35348bfec66 100644
--- a/config/locales/crowdin/js-kk.yml
+++ b/config/locales/crowdin/js-kk.yml
@@ -358,10 +358,10 @@ kk:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ kk:
label_version_plural: "Versions"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1035,9 +1035,15 @@ kk:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-ko.yml b/config/locales/crowdin/js-ko.yml
index 569b3107c76..6e30aca6dc3 100644
--- a/config/locales/crowdin/js-ko.yml
+++ b/config/locales/crowdin/js-ko.yml
@@ -358,10 +358,10 @@ ko:
learn_about: "새로운 모든 기능에 대해 자세히 알아보기"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- 이 릴리스에는 다음과 같은 다양한 새로운 기능과 개선 사항이 포함되어 있습니다.
미팅 백로그 및 기존 미팅 종료.
업데이트된 Enterprise 플랜.
작업 패키지의 내부 코멘트(Enterprise 추가 기능).
자동으로 생성되는 작업 패키지 제목(Enterprise 추가 기능).
달력 보기가 있는 별도의 시간 추적 모듈.
작업 패키지 관계 탭에 표시되는 부모 관계.
커뮤니티 릴리스: 프로젝트 개요 페이지의 그래프.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "캘린더 구독"
inital_setup_error_message: "데이터를 가져오는 중에 오류가 발생했습니다."
@@ -566,7 +566,7 @@ ko:
label_version_plural: "버전"
label_view_has_changed: "이 보기에는 저장되지 않은 변경 사항이 있습니다. 클릭하여 저장하십시오."
help_texts:
- show_modal: "특성 도움말 텍스트 항목 표시"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "건너뛰기"
@@ -1034,9 +1034,15 @@ ko:
reminders:
button_label: "미리 알림 설정"
title:
- new: "미리 알림 설정"
+ new: "Set a reminder"
edit: "미리 알림 편집"
subtitle: "선택한 시간에 이 작업 패키지에 대한 알림을 받게 됩니다."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "이 작업 패키지의 날짜는 자식으로부터 자동으로 추정됩니다. '수동 스케줄링'을 활성화하여 날짜를 설정할 수 있습니다."
is_switched_from_manual_to_automatic: "다른 작업 패키지와의 관계로 인해 수동 스케줄링에서 자동 스케줄링으로 전환한 후 이 작업 패키지의 날짜를 다시 계산해야 할 수 있습니다."
diff --git a/config/locales/crowdin/js-lt.yml b/config/locales/crowdin/js-lt.yml
index fe470c41290..2b10d465121 100644
--- a/config/locales/crowdin/js-lt.yml
+++ b/config/locales/crowdin/js-lt.yml
@@ -358,10 +358,10 @@ lt:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Prenumeruoti kalendorių"
inital_setup_error_message: "Gaunant duomenis įvyko klaida."
@@ -566,7 +566,7 @@ lt:
label_version_plural: "Versijos"
label_view_has_changed: "Šiame vaizde yra neįrašytų pakeitimų. Spauskite, kad juos įrašytumėte."
help_texts:
- show_modal: "Rodyti atributo pagalbos teksto įrašą"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Praleisti"
@@ -1037,9 +1037,15 @@ lt:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "Šio darbų paketo datos yra automatiškai nustatomos pagal jo vaikų datas. Norėdami nustatyti kitokias datas įjunkite „Rankinį tvarkaraščio parinkimą“"
is_switched_from_manual_to_automatic: "Po perjungimo iš rankinio į automatinį tvarkaraščio parinkimą, šio darbų paketo datas gali reikėti perskaičiuoti, nes yra sąryšių su kitais darbų paketais."
diff --git a/config/locales/crowdin/js-lv.yml b/config/locales/crowdin/js-lv.yml
index 4ebfec85acb..926f8e19b8f 100644
--- a/config/locales/crowdin/js-lv.yml
+++ b/config/locales/crowdin/js-lv.yml
@@ -358,10 +358,10 @@ lv:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ lv:
label_version_plural: "Versijas"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1036,9 +1036,15 @@ lv:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-mn.yml b/config/locales/crowdin/js-mn.yml
index 9aa733fd672..e83df3837dd 100644
--- a/config/locales/crowdin/js-mn.yml
+++ b/config/locales/crowdin/js-mn.yml
@@ -358,10 +358,10 @@ mn:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ mn:
label_version_plural: "Versions"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1035,9 +1035,15 @@ mn:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-ms.yml b/config/locales/crowdin/js-ms.yml
index 7733a2fa20b..a39cfbd8bcf 100644
--- a/config/locales/crowdin/js-ms.yml
+++ b/config/locales/crowdin/js-ms.yml
@@ -358,10 +358,10 @@ ms:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Langgan kalendar"
inital_setup_error_message: "Ralat berlaku ketika sedang mengambil data."
@@ -566,7 +566,7 @@ ms:
label_version_plural: "Versi-versi"
label_view_has_changed: "Paparan ini mempunyai perubahan yang tidak disimpan. Klik untuk simpan mereka."
help_texts:
- show_modal: "Paparkan entri atribut teks bantuan"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Langkau"
@@ -1034,9 +1034,15 @@ ms:
reminders:
button_label: "Tetapkan peringatan"
title:
- new: "Tetapkan peringatan"
+ new: "Set a reminder"
edit: "Sunting peringatan"
subtitle: "Anda akan menerima pemberitahuan untuk pakej kerja ini pada masa yang dipilih."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "Tarikh pakej kerja ini disimpulkan secara automatik dari anaknya. Aktifkan 'Penjadualan Manual' untuk tetapkan tarikh."
is_switched_from_manual_to_automatic: "Tarikh pakej kerja ini mungkin perlu dikira semula selepas menukar dari penjadualan manual ke automatik kerana hubungan dengan pakej kerja lain."
diff --git a/config/locales/crowdin/js-ne.yml b/config/locales/crowdin/js-ne.yml
index 04f76761104..9ea78264bb5 100644
--- a/config/locales/crowdin/js-ne.yml
+++ b/config/locales/crowdin/js-ne.yml
@@ -358,10 +358,10 @@ ne:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ ne:
label_version_plural: "Versions"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1035,9 +1035,15 @@ ne:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-nl.yml b/config/locales/crowdin/js-nl.yml
index d99db0e283e..ba16a3dea63 100644
--- a/config/locales/crowdin/js-nl.yml
+++ b/config/locales/crowdin/js-nl.yml
@@ -358,10 +358,10 @@ nl:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Abonneren op agenda"
inital_setup_error_message: "Er is een fout opgetreden tijdens het ophalen van gegevens."
@@ -566,7 +566,7 @@ nl:
label_version_plural: "Versies"
label_view_has_changed: "Deze weergave heeft niet-opgeslagen wijzigingen. Klik om ze op te slaan."
help_texts:
- show_modal: "Toon kenmerk help tekstinvoer"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Overslaan"
@@ -1035,9 +1035,15 @@ nl:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-no.yml b/config/locales/crowdin/js-no.yml
index b21dad22e90..d5ea099da32 100644
--- a/config/locales/crowdin/js-no.yml
+++ b/config/locales/crowdin/js-no.yml
@@ -358,10 +358,10 @@
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Abonner på kalender"
inital_setup_error_message: "En feil oppstod under henting av data."
@@ -566,7 +566,7 @@
label_version_plural: "Versjoner"
label_view_has_changed: "Denne visningen har ulagrede endringer. Klikk for å lagre dem."
help_texts:
- show_modal: "Vis oppføring for hjelpetekst"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Hopp over"
@@ -1035,9 +1035,15 @@
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "Datoene for denne arbeidspakken trekkes automatisk fra de underordnede. Aktiver 'Manuell planlegging' for å angi datoene."
is_switched_from_manual_to_automatic: "Datoene for denne arbeidspakken må eventuelt beregnes på nytt etter å ha byttet fra manual til automatisk planlegging på grunn av relasjoner med andre arbeidspakker."
diff --git a/config/locales/crowdin/js-pl.yml b/config/locales/crowdin/js-pl.yml
index 8cc25a1c74f..5b778c1925b 100644
--- a/config/locales/crowdin/js-pl.yml
+++ b/config/locales/crowdin/js-pl.yml
@@ -358,10 +358,10 @@ pl:
learn_about: "Dowiedz się więcej o wszystkich nowych funkcjach"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- Wydanie zawiera różne nowe funkcje i ulepszenia, takie jak
Backlogi spotkań i koniec klasycznych spotkań.
Zaktualizowane plany Enterprise.
Komentarze wewnętrzne w pakietach roboczych (dodatek wersji Enterprise).
Automatycznie generowane tematy pakietów roboczych (dodatek wersji Enterprise).
Oddzielny moduł śledzenia czasu z widokiem kalendarza.
Relacja nadrzędna wyświetlana na karcie relacji pakietu roboczego.
Wydanie dla społeczności: wykresy na stronie przeglądu projektu.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subskrybuj kalendarz"
inital_setup_error_message: "Podczas pobierania danych wystąpił błąd."
@@ -566,7 +566,7 @@ pl:
label_version_plural: "Wersje"
label_view_has_changed: "Ten widok zawiera niezapisane zmiany. Kliknij, aby je zapisać."
help_texts:
- show_modal: "Pokaż atrybut wpisu tekstu pomocy"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Omiń"
@@ -1037,9 +1037,15 @@ pl:
reminders:
button_label: "Ustaw przypomnienie"
title:
- new: "Ustaw przypomnienie"
+ new: "Set a reminder"
edit: "Edytuj przypomnienie"
subtitle: "W wybranym terminie otrzymasz powiadomienie dotyczące tego pakietu roboczego."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "Daty tego pakietu roboczego są automatycznie odejmowane od jego elementów podrzędnych. Włącz funkcję Planowanie ręczne, aby ustawić daty."
is_switched_from_manual_to_automatic: "Po przełączeniu planowania z ręcznego na automatyczne konieczne może być ponowne obliczenie dat tego pakietu roboczego ze względu na jego powiązania z innymi pakietami roboczymi."
diff --git a/config/locales/crowdin/js-pt-BR.yml b/config/locales/crowdin/js-pt-BR.yml
index 629f08d7fb0..404216ffa01 100644
--- a/config/locales/crowdin/js-pt-BR.yml
+++ b/config/locales/crowdin/js-pt-BR.yml
@@ -357,10 +357,10 @@ pt-BR:
learn_about: "Saiba mais sobre todos os novos recursos"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- A versão contém diversos novos recursos e melhorias, como:
Backlogs de reuniões e a descontinuação das reuniões clássicas.
Atualização dos planos Enterprise.
Comentários internos em pacotes de trabalho (complemento do Enterprise).
Assuntos de pacotes de trabalho gerados automaticamente (complemento do Enterprise).
Módulo de acompanhamento de tempo com visualização em calendário.
Relação de pai exibida na aba de relações de pacotes de trabalho.
Versão para a Comunidade: Gráficos na página de visão geral do projeto.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Assinar calendário"
inital_setup_error_message: "Ocorreu um erro ao buscar dados."
@@ -565,7 +565,7 @@ pt-BR:
label_version_plural: "Versões"
label_view_has_changed: "Esta visão tem alterações não salvas. Clique para salvá-las."
help_texts:
- show_modal: "Mostrar entrada de texto de ajuda do atributo"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Pular"
@@ -1034,9 +1034,15 @@ pt-BR:
reminders:
button_label: "Definir lembrete"
title:
- new: "Definir lembrete"
+ new: "Set a reminder"
edit: "Editar lembrete"
subtitle: "Você receberá uma notificação para este pacote de trabalho no horário selecionado."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "As datas deste pacote de trabalho são deduzidas automaticamente de seus filhos. Ative o 'Planejamento manual' para definir as datas."
is_switched_from_manual_to_automatic: "As datas deste pacote de trabalho podem precisar ser recalculadas após a alteração de planejamento manual para automático devido a relações com outros pacotes de trabalho."
diff --git a/config/locales/crowdin/js-pt-PT.yml b/config/locales/crowdin/js-pt-PT.yml
index ca9691e5ba2..eb5bcb416c0 100644
--- a/config/locales/crowdin/js-pt-PT.yml
+++ b/config/locales/crowdin/js-pt-PT.yml
@@ -358,10 +358,10 @@ pt-PT:
learn_about: "Saiba mais sobre todas as novas funcionalidades"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- A versão inclui várias novas funcionalidades e melhorias, tais como
Backlogs de reuniões e o final das reuniões clássicas.
Planos Enterprise atualizados.
Comentários internos em pacotes de trabalho (complemento Enterprise).
Assuntos de pacotes de trabalho gerados automaticamente (complemento Enterprise).
Módulo de controlo de tempo individual com vista de calendário.
Relação de projeto principal exibida no separador de relações do pacote de trabalho.
Versão para Community: gráficos na página de visão geral do projeto.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscrever o calendário"
inital_setup_error_message: "Ocorreu um erro ao recuperar os dados."
@@ -566,7 +566,7 @@ pt-PT:
label_version_plural: "Versões"
label_view_has_changed: "Esta vista tem alterações não guardadas. Clique para guardá-las."
help_texts:
- show_modal: "Mostrar entrada do texto de ajuda de atributos"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Saltar"
@@ -1035,9 +1035,15 @@ pt-PT:
reminders:
button_label: "Definir lembrete"
title:
- new: "Definir lembrete"
+ new: "Set a reminder"
edit: "Editar lembrete"
subtitle: "Irá receber uma notificação para este pacote de trabalho na hora selecionada."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "As datas deste pacote de trabalho são deduzidas automaticamente dos seus filhos. Ative o 'Agendamento manual' para definir as datas."
is_switched_from_manual_to_automatic: "As datas deste pacote de trabalho podem precisar de ser recalculadas após mudar de agendamento manual para automático, devido a relações com outros pacotes de trabalho."
diff --git a/config/locales/crowdin/js-ro.yml b/config/locales/crowdin/js-ro.yml
index 2818f387bab..2a25be015ac 100644
--- a/config/locales/crowdin/js-ro.yml
+++ b/config/locales/crowdin/js-ro.yml
@@ -357,10 +357,10 @@ ro:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- Versiunea conține diverse caracteristici noi și îmbunătățiri, cum ar fi
Întâlniri în așteptare și sfârșitul întâlnirilor clasice.
Planuri Enterprise actualizate.
Comentarii interne în pachetele de lucru (add-on Enterprise).
Subiecte generate automat pentru pachetele de lucru (add-on Enterprise).
Modul separat de urmărire a timpului cu vedere calendaristică.
Relația părinte afișată în fila relații pachet de lucru.
Versiune pentru comunitate: Grafice pe pagina de prezentare generală a proiectului.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -565,7 +565,7 @@ ro:
label_version_plural: "Versiuni"
label_view_has_changed: "Această vizualizare are modificări nesalvate. Faceți clic pentru a le salva."
help_texts:
- show_modal: "Afișare text de ajutor pentru atributul de intrare"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Sari"
@@ -1035,9 +1035,15 @@ ro:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "Datele acestui pachet de lucru sunt deduse automat din copiii săi. Activați \"Programare manuală\" pentru a stabili datele."
is_switched_from_manual_to_automatic: "Este posibil ca datele acestui pachet de lucru să trebuiască să fie recalculate după trecerea de la programarea manuală la cea automată din cauza relațiilor cu alte pachete de lucru."
diff --git a/config/locales/crowdin/js-ru.yml b/config/locales/crowdin/js-ru.yml
index 285049adef4..a6d18f17a2e 100644
--- a/config/locales/crowdin/js-ru.yml
+++ b/config/locales/crowdin/js-ru.yml
@@ -357,10 +357,10 @@ ru:
learn_about: "Узнайте больше о всех новых функциях"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- В этом выпуске представлены различные новые функции и улучшения, такие как
Списки отложенных совещаний и окончание классических совещаний.
Обновлены корпоративные планы.
Внутренние комментарии в рабочих пакетах (корпоративное дополнение).
Автоматически сгенерированные темы рабочих пакетов (корпоративное дополнение).
Отдельный модуль отслеживания рабочего времени с возможностью просмотра календаря.
Родительская связь отображается на вкладке "Связи с рабочим пакетом".
Сообщение сообществу: графики на странице обзора проекта.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Подписаться на календарь"
inital_setup_error_message: "Произошла ошибка при получении данных."
@@ -565,7 +565,7 @@ ru:
label_version_plural: "Этапы"
label_view_has_changed: "Это представление имеет несохраненные изменения. Кликните, чтобы сохранить их."
help_texts:
- show_modal: "Показать текстовую справку по атрибутам"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Пропустить"
@@ -1039,6 +1039,12 @@ ru:
new: "Установить напоминание"
edit: "Редактировать напоминание"
subtitle: "Вы получите уведомление о данном пакете работ в выбранное время."
+ presets:
+ tomorrow: "Завтра"
+ three_days: "Через 3 дня"
+ week: "Через неделю"
+ month: "Через месяц"
+ custom: "На определенную дату/время"
scheduling:
is_parent: "Даты этого пакета работ выводятся автоматически из дочерних пакетов работ. Используйте «Ручной планировщик», чтобы установить даты."
is_switched_from_manual_to_automatic: "Даты этого пакета работ могут быть пересчитаны после переключения с ручного на автоматическое планирование из-за связей с другими пакетами работ."
diff --git a/config/locales/crowdin/js-rw.yml b/config/locales/crowdin/js-rw.yml
index 0b7cb4b1304..2f93bf91e8c 100644
--- a/config/locales/crowdin/js-rw.yml
+++ b/config/locales/crowdin/js-rw.yml
@@ -358,10 +358,10 @@ rw:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ rw:
label_version_plural: "Versions"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1035,9 +1035,15 @@ rw:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-si.yml b/config/locales/crowdin/js-si.yml
index b462b3cd562..a6b91477724 100644
--- a/config/locales/crowdin/js-si.yml
+++ b/config/locales/crowdin/js-si.yml
@@ -358,10 +358,10 @@ si:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ si:
label_version_plural: "අනුවාද"
label_view_has_changed: "මෙම මතය නොගැලවූ වෙනස්කම් ඇත. ඒවා සුරැකීමට ක්ලික් කරන්න."
help_texts:
- show_modal: "ගුණාංග උපකාරක පෙළ ප්රවේශය පෙන්වන්න"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "මගහරින්න"
@@ -1035,9 +1035,15 @@ si:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-sk.yml b/config/locales/crowdin/js-sk.yml
index 4321d8121e4..2f6c4e903c9 100644
--- a/config/locales/crowdin/js-sk.yml
+++ b/config/locales/crowdin/js-sk.yml
@@ -358,10 +358,10 @@ sk:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ sk:
label_version_plural: "Verzie"
label_view_has_changed: "V tomto náhľade sú neuložené zmeny. Klikni pre uloženie."
help_texts:
- show_modal: "Zobraziť nápovedu pre tento atribút"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Preskočiť"
@@ -1037,9 +1037,15 @@ sk:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-sl.yml b/config/locales/crowdin/js-sl.yml
index 87f35e628c7..235623250ab 100644
--- a/config/locales/crowdin/js-sl.yml
+++ b/config/locales/crowdin/js-sl.yml
@@ -357,10 +357,10 @@ sl:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -565,7 +565,7 @@ sl:
label_version_plural: "Različice"
label_view_has_changed: "Ta pogled ima ne shranjene spremembe. kliknite za shranjevanje. "
help_texts:
- show_modal: "Prikaži vnos besedila za pomoč atributu"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Preskoči"
@@ -1036,9 +1036,15 @@ sl:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "Datumi tega delovnega paketa so samodejno ugotovljeni od njegovih podrazredov. Za nastavitev datumov aktivirajte 'Ročno razvrščanje'."
is_switched_from_manual_to_automatic: "Datumi delovnega paketa se bodo lahko, da morali preračunati po menjavi iz ročnega v samodejno razvrščanje zaradi razmerij z ostalimi delovnimi paketi."
diff --git a/config/locales/crowdin/js-sr.yml b/config/locales/crowdin/js-sr.yml
index eb37f8eead0..514d59b055f 100644
--- a/config/locales/crowdin/js-sr.yml
+++ b/config/locales/crowdin/js-sr.yml
@@ -358,10 +358,10 @@ sr:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ sr:
label_version_plural: "Versions"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1036,9 +1036,15 @@ sr:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-sv.yml b/config/locales/crowdin/js-sv.yml
index a50aaee60b2..068f75fa905 100644
--- a/config/locales/crowdin/js-sv.yml
+++ b/config/locales/crowdin/js-sv.yml
@@ -357,10 +357,10 @@ sv:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -565,7 +565,7 @@ sv:
label_version_plural: "Versioner"
label_view_has_changed: "Denna vy har osparade ändringar. Klicka för att spara dem."
help_texts:
- show_modal: "Visa attribut hjälp textinmatning"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Hoppa över"
@@ -1034,9 +1034,15 @@ sv:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-th.yml b/config/locales/crowdin/js-th.yml
index bcc02a2c6cc..af9f6d809d2 100644
--- a/config/locales/crowdin/js-th.yml
+++ b/config/locales/crowdin/js-th.yml
@@ -358,10 +358,10 @@ th:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ th:
label_version_plural: "เวอร์ชั่น"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1034,9 +1034,15 @@ th:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-tr.yml b/config/locales/crowdin/js-tr.yml
index ec39246504e..0ae3e89ab02 100644
--- a/config/locales/crowdin/js-tr.yml
+++ b/config/locales/crowdin/js-tr.yml
@@ -357,10 +357,10 @@ tr:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Takvime abone ol"
inital_setup_error_message: "Veri alınırken bir hata oluştu."
@@ -565,7 +565,7 @@ tr:
label_version_plural: "Sürümler"
label_view_has_changed: "Bu görünüm kaydedilmemiş değişikliklere sahip. Onları kaydetmek için tıklayın."
help_texts:
- show_modal: "Metin giriş öznitelik yardımını göster"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Atla"
@@ -1034,9 +1034,15 @@ tr:
reminders:
button_label: "Hatırlatma ayarla"
title:
- new: "Hatırlatma ayarla"
+ new: "Set a reminder"
edit: "Hatırlatma düzenle"
subtitle: "Seçilen zamanda bu iş paketi için bir bildirim alacaksınız."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "Bu çalışma paketinin tarihleri otomatik olarak çocuklarından çıkarılır. Tarihleri ayarlamak için 'Manuel zamanlama'yı etkinleştirin."
is_switched_from_manual_to_automatic: "Bu çalışma paketinin tarihlerinin, diğer çalışma paketleriyle olan ilişkiler nedeniyle manuelden otomatik zamanlamaya geçtikten sonra yeniden hesaplanması gerekebilir."
diff --git a/config/locales/crowdin/js-uk.yml b/config/locales/crowdin/js-uk.yml
index bc3650881dd..7a866bc7995 100644
--- a/config/locales/crowdin/js-uk.yml
+++ b/config/locales/crowdin/js-uk.yml
@@ -358,10 +358,10 @@ uk:
learn_about: "Докладніше про всі нові функції"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- Цей випуск містить кілька нових і поліпшених функцій.
Можливість перегляду черги завдань наприкінці класичної наради.
Оновлені плани Enterprise.
Внутрішні коментарі в пакетах робіт (надбудова Enterprise).
Автоматичне створення тем пакетів робіт (надбудова Enterprise).
Окремий модуль обліку часу з поданням календаря.
Відображення зв’язку з батьківським елементом на вкладці зв’язків пакета робіт.
Оновлення в Community: графіки на сторінці огляду проєкту.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Підписатися на календар"
inital_setup_error_message: "Під час отримання даних сталася помилка."
@@ -566,7 +566,7 @@ uk:
label_version_plural: "Версії"
label_view_has_changed: "Це подання містить незбережені зміни. Натисніть, щоб переглянути їх."
help_texts:
- show_modal: "Показати вміст атрибута тексту довідки"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Пропустити"
@@ -1037,9 +1037,15 @@ uk:
reminders:
button_label: "Установити нагадування"
title:
- new: "Установити нагадування"
+ new: "Set a reminder"
edit: "Редагувати нагадування"
subtitle: "Ви отримаєте сповіщення про цей пакет робіт у вибраний час."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "Дати цього пакета робіт автоматично виводяться з його дочірніх елементів. Активуйте «Ручне планування», щоб установити ці дати."
is_switched_from_manual_to_automatic: "Можливо, дати цього пакета робіт знадобиться перерахувати після переходу з ручного на автоматичне планування через зв’язок з іншими пакетами робіт."
diff --git a/config/locales/crowdin/js-uz.yml b/config/locales/crowdin/js-uz.yml
index 4cfcbd4a44d..e54341c063c 100644
--- a/config/locales/crowdin/js-uz.yml
+++ b/config/locales/crowdin/js-uz.yml
@@ -358,10 +358,10 @@ uz:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -566,7 +566,7 @@ uz:
label_version_plural: "Versions"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Skip"
@@ -1035,9 +1035,15 @@ uz:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/locales/crowdin/js-vi.yml b/config/locales/crowdin/js-vi.yml
index 962bf79b512..efc26785f00 100644
--- a/config/locales/crowdin/js-vi.yml
+++ b/config/locales/crowdin/js-vi.yml
@@ -358,10 +358,10 @@ vi:
learn_about: "Learn more about all new features"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- The release contains various new features and improvements, such as
Meeting backlogs and the end of classic meetings.
Updated Enterprise plans.
Internal comments in work packages (Enterprise add-on).
Automatically generated work package subjects (Enterprise add-on).
Separate time tracking module with calendar view.
Parent relation displayed in work package relations tab.
Release to Community: Graphs on project overview page.
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "Đăng ký lịch"
inital_setup_error_message: "Đã xảy ra lỗi khi lấy dữ liệu."
@@ -566,7 +566,7 @@ vi:
label_version_plural: "Các phiên bản"
label_view_has_changed: "Chế độ xem này có các thay đổi chưa được lưu. Nhấp để lưu chúng."
help_texts:
- show_modal: "Hiển thị văn bản trợ giúp thuộc tính"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "Bỏ qua"
@@ -1034,9 +1034,15 @@ vi:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "Ngày của gói công việc này được suy ra tự động từ các con của nó. Kích hoạt 'Lên lịch thủ công' để đặt ngày."
is_switched_from_manual_to_automatic: "Ngày của gói công việc này có thể cần phải được tính toán lại sau khi chuyển từ lên lịch thủ công sang tự động do mối quan hệ với các gói công việc khác."
diff --git a/config/locales/crowdin/js-zh-CN.yml b/config/locales/crowdin/js-zh-CN.yml
index 9df7df57900..091509ef4ae 100644
--- a/config/locales/crowdin/js-zh-CN.yml
+++ b/config/locales/crowdin/js-zh-CN.yml
@@ -357,10 +357,10 @@ zh-CN:
learn_about: "详细了解所有新功能"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- 此版本包含各种新功能和改进,例如
会议待办和经典会议结束。
更新了企业计划。
工作文件包中的内部评论(企业附加组件)。
自动生成的工作文件包主题(企业附加组件)。
带有日历视图的单独时间跟踪模块。
工作文件包关系选项卡中显示的父关系。
发布到社区:项目概述页面上的图表。
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "订阅日历"
inital_setup_error_message: "获取数据时发生错误。"
@@ -565,7 +565,7 @@ zh-CN:
label_version_plural: "版本"
label_view_has_changed: "此视图有未保存的更改。单击以保存。"
help_texts:
- show_modal: "显示属性帮助文本项"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "跳过"
@@ -1036,6 +1036,12 @@ zh-CN:
new: "设置提醒"
edit: "编辑提醒"
subtitle: "您将在所选时间收到此工作包的通知。"
+ presets:
+ tomorrow: "明天"
+ three_days: "3天内"
+ week: "一周内"
+ month: "一个月内"
+ custom: "在某个特定日期/时间"
scheduling:
is_parent: "此工作包的日期会自动从其子项推导出。可激活“手动计划”来设置日期。"
is_switched_from_manual_to_automatic: "由于与其他工作包的关系,在从手动计划切换为自动计划后,此工作包的日期可能需要重新计算。"
diff --git a/config/locales/crowdin/js-zh-TW.yml b/config/locales/crowdin/js-zh-TW.yml
index b7f3e59f0af..6c92316410f 100644
--- a/config/locales/crowdin/js-zh-TW.yml
+++ b/config/locales/crowdin/js-zh-TW.yml
@@ -356,11 +356,10 @@ zh-TW:
learn_about: "瞭解更多新功能的資訊"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
- 此版本包含多項新功能與改進,例如:
-
會議待辦事項功能,以及經典會議的結束。
企業方案更新。
工作項目中的內部留言(企業附加功能)。
自動產生的工作項目標題(企業附加功能)。
獨立的時間追蹤模組,包含行事曆檢視。
在工作項目的關聯分頁中顯示父階關係。
開放給社群:專案總覽頁的圖表功能。
+ The release contains various new features and improvements, such as
Structure the project life cycle with phases and phase gates.
Export meetings in PDF format.
Set smart default options for reminders.
Use negative lag for work package dates.
Display hierarchy trees for hierarchy custom fields.
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
title: "訂閱日曆"
inital_setup_error_message: "更新資料時發生錯誤"
@@ -565,7 +564,7 @@ zh-TW:
label_version_plural: "版本"
label_view_has_changed: "變動未儲存,請點按儲存。"
help_texts:
- show_modal: "顯示屬性說明文字項目"
+ show_modal: "Show help text"
onboarding:
buttons:
skip: "略過"
@@ -1033,9 +1032,15 @@ zh-TW:
reminders:
button_label: "設定提醒"
title:
- new: "設定提醒"
+ new: "Set a reminder"
edit: "編輯提醒"
subtitle: "您會在選擇的時間收到此工作項目的通知。"
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "此工作包的日期會自動從其子項推導出。可啟用“手動計劃”來設置日期。"
is_switched_from_manual_to_automatic: "由於與其他工作包的關係,在從手動計劃切換為自動計劃後,此工作包的日期可能需要重新計算。"
diff --git a/config/locales/crowdin/ka.yml b/config/locales/crowdin/ka.yml
index 285533d3ecf..61251e15d9d 100644
--- a/config/locales/crowdin/ka.yml
+++ b/config/locales/crowdin/ka.yml
@@ -2412,7 +2412,7 @@ ka:
static_token_name: "RSS კოდი"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "ფაილების საცავი"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2894,8 +2894,8 @@ ka:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Project settings"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "ფაილების საცავი"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "View all projects"
label_project_show_details: "Show project details"
@@ -3636,7 +3636,7 @@ ka:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4337,8 +4337,12 @@ ka:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/kk.yml b/config/locales/crowdin/kk.yml
index e08564d160d..288595c38ae 100644
--- a/config/locales/crowdin/kk.yml
+++ b/config/locales/crowdin/kk.yml
@@ -2412,7 +2412,7 @@ kk:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2894,8 +2894,8 @@ kk:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Project settings"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "View all projects"
label_project_show_details: "Show project details"
@@ -3636,7 +3636,7 @@ kk:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4337,8 +4337,12 @@ kk:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml
index 9d702ace52c..7a3b7bf00cf 100644
--- a/config/locales/crowdin/ko.yml
+++ b/config/locales/crowdin/ko.yml
@@ -2373,7 +2373,7 @@ ko:
static_token_name: "RSS 토큰"
disabled_text: "관리자가 RSS 토큰을 활성화하지 않았습니다. 이 기능을 사용하려면 관리자에게 문의하세요."
storages:
- title: "파일 저장소"
+ title: "File storages"
text_hint: "파일 저장소 토큰은 이 OpenProject 인스턴스를 외부 파일 저장소에 연결합니다."
empty_text_hint: "사용자 계정에 연결된 저장소 액세스 권한이 없습니다."
revoke_token: "이 토큰을 제거하시겠습니까? %{storage}에서 다시 로그인해야 합니다."
@@ -2855,8 +2855,8 @@ ko:
label_project_custom_field_plural: "프로젝트 특성"
label_project_settings: "프로젝트 설정"
label_project_attributes_settings: "프로젝트 특성 설정"
- label_project_storage_plural: "파일 저장소"
- label_project_storage_project_folder: "파일 저장소: 프로젝트 폴더"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{used_disk_space} 디스크 공간을 사용하고 있는 %{count}개 프로젝트"
label_project_view_all: "모든 프로젝트 보기"
label_project_show_details: "프로젝트 세부 정보 표시"
@@ -3592,7 +3592,7 @@ ko:
oauth_application_details: "이 창을 닫으면 클라이언트 비밀 값에 다시 액세스할 수 없습니다. 다음 값을 Nextcloud OpenProject Integration 설정에 복사하세요:"
oauth_application_details_link_text: "설정 페이지로 이동"
setup_documentation_details: "새 파일 저장소를 구성하는 데 도움이 필요하면 설명서를 확인하세요. "
- setup_documentation_details_link_text: "파일 저장소 설정"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "이 파일 저장소를 사용하려면 원하는 각 프로젝트의 프로젝트 설정에서 모듈과 특정 저장소를 활성화해야 합니다."
subversion:
existing_title: "기존 Subversion 리포지토리"
@@ -4292,8 +4292,12 @@ ko:
code_500_missing_enterprise_token: "Enterprise 토큰이 유효하지 않거나 누락되어 요청을 처리할 수 없습니다."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "원하는 작업 패키지를 찾을 수 없거나 삭제되었습니다."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD(ISO 8601 날짜만)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm](호환되는 모든 ISO 8601 날짜/시간)"
diff --git a/config/locales/crowdin/lt.yml b/config/locales/crowdin/lt.yml
index ee66787d49b..757a7d41487 100644
--- a/config/locales/crowdin/lt.yml
+++ b/config/locales/crowdin/lt.yml
@@ -2487,7 +2487,7 @@ lt:
static_token_name: "RSS žetonas"
disabled_text: "Administratorius neįjungė RSS žetonų. Prašome susisiekti su administratoriumi, kad galėtumėte naudoti šią savybę."
storages:
- title: "Failų saugyklos"
+ title: "File storages"
text_hint: "Failų saugyklų žetonai jungia šį OpenProject egzempliorių su išorine failų saugykla."
empty_text_hint: "Su jūsų paskyra nėra susietos saugyklos prieigos."
revoke_token: "Ar tikrai norite išimti šį žetoną? Jums vėl reikės prisijungti prie %{storage}"
@@ -2969,8 +2969,8 @@ lt:
label_project_custom_field_plural: "Projekto atributai"
label_project_settings: "Projekto nustatymai"
label_project_attributes_settings: "Projekto atributų nustatymai"
- label_project_storage_plural: "Failų saugyklos"
- label_project_storage_project_folder: "Failų saugyklos: projekto aplankai"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projektai, naudojantys %{used_disk_space} disko vietos"
label_project_view_all: "Peržiūrėti visus projektus"
label_project_show_details: "Rodyti detalią projekto informaciją"
@@ -3712,7 +3712,7 @@ lt:
oauth_application_details: "Kliento slapta reikšmė daugiau nebebus prieinama po to, kai uždarysite šį langą. Prašome nukopijuoti šias reikšmes į Nextcloud OpenProject integracijos nustatymus:"
oauth_application_details_link_text: "Eiti į nustatymų puslapį"
setup_documentation_details: "Jei jums reikia pagalbos konfigūruojant naują failų saugyklą, prašome skaityti dokumentaciją: "
- setup_documentation_details_link_text: "Failų saugyklos nustatymas"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "Norėdami naudoti šią failų talpyklą, nepamirškite aktyvuoti modulį ir konkrečią saugyklą projekto nustatymuose kiekvienam reikiamam projektui."
subversion:
existing_title: "Esama Subversion repozitorija"
@@ -4414,8 +4414,12 @@ lt:
code_500_missing_enterprise_token: "Užklausos nepavyko apdoroti dėl netinkamo ar trūkstamo Enterprise žetono."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "Jūsų ieškomas darbo paketas nerastas arba ištrintas."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (bet kokia ISO 8601 data/laikas)"
diff --git a/config/locales/crowdin/lv.yml b/config/locales/crowdin/lv.yml
index 113fa113f2d..542f4344bd0 100644
--- a/config/locales/crowdin/lv.yml
+++ b/config/locales/crowdin/lv.yml
@@ -2451,7 +2451,7 @@ lv:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2933,8 +2933,8 @@ lv:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Project settings"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "Skatīt visus projektus"
label_project_show_details: "Show project details"
@@ -3677,7 +3677,7 @@ lv:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4379,8 +4379,12 @@ lv:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/mn.yml b/config/locales/crowdin/mn.yml
index ca095af6e93..110ac04268d 100644
--- a/config/locales/crowdin/mn.yml
+++ b/config/locales/crowdin/mn.yml
@@ -2412,7 +2412,7 @@ mn:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2894,8 +2894,8 @@ mn:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Project settings"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "View all projects"
label_project_show_details: "Show project details"
@@ -3636,7 +3636,7 @@ mn:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4337,8 +4337,12 @@ mn:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/ms.yml b/config/locales/crowdin/ms.yml
index b516e827486..9924dfa939e 100644
--- a/config/locales/crowdin/ms.yml
+++ b/config/locales/crowdin/ms.yml
@@ -2371,7 +2371,7 @@ ms:
static_token_name: "Token RSS"
disabled_text: "Token RSS tidak diaktifkan oleh pentadbir. Sila hubungi pentadbir anda untuk menggunakan fitur ini."
storages:
- title: "Storan Fail"
+ title: "File storages"
text_hint: "Token Storan Fail menyambungkan contoh OpenProject dengan Storan Fail luaran."
empty_text_hint: "Tiada akses storan terpaut pada akaun anda."
revoke_token: "Adakah anda ingin membuang token ini? Anda perlu log masuk semula di %{storage}"
@@ -2853,8 +2853,8 @@ ms:
label_project_custom_field_plural: "Atribut projek"
label_project_settings: "Tetapan projek"
label_project_attributes_settings: "Tetapan atribut projek"
- label_project_storage_plural: "Storan Fail"
- label_project_storage_project_folder: "Storan Fail: Folder projek"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projek menggunakan %{used_disk_space} ruang cakera"
label_project_view_all: "Lihat semua projek"
label_project_show_details: "Paparkan butiran projek"
@@ -3592,7 +3592,7 @@ ms:
oauth_application_details: "Nilai rahsia pelanggan tidak akan dapat untuk diakses lagi setelah anda menutup tetingkap ini. Sila salin nilai-nilai ini ke tetapan Integrasi Nextcloud OpenProject:"
oauth_application_details_link_text: "Pergi ke halaman tetapan"
setup_documentation_details: "Jika anda memerlukan bantuan mengkonfigurasikan storan fail baharu, sila lihat dokumentasi berikut:"
- setup_documentation_details_link_text: "Penyediaan Storan Fail"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "Untuk gunakan storan fail ini, ingat untuk mengaktifkan modul dan storan khusus di tetapan projek setiap projek yang dikehendaki."
subversion:
existing_title: "Repositori Subversion sedia ada"
@@ -4292,8 +4292,12 @@ ms:
code_500_missing_enterprise_token: "Permintaan tidak boleh dikendalikan kerana token Enterprise yang tidak sah atau hilang."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "Pakej kerja yang anda cari tidak dapat ditemui atau telah dipadamkan."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "TTTT-BB-HH (ISO 8601 tarikh sahaja)"
datetime: "TTTT-BB-HHTjj:mm:ss[.lll][+jj:mm] (mana-mana tarikh masa ISO 8601 yang sesuai)"
diff --git a/config/locales/crowdin/ne.yml b/config/locales/crowdin/ne.yml
index 0c75566616a..ec928cc7d18 100644
--- a/config/locales/crowdin/ne.yml
+++ b/config/locales/crowdin/ne.yml
@@ -2412,7 +2412,7 @@ ne:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2894,8 +2894,8 @@ ne:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Project settings"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "View all projects"
label_project_show_details: "Show project details"
@@ -3636,7 +3636,7 @@ ne:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4337,8 +4337,12 @@ ne:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/nl.yml b/config/locales/crowdin/nl.yml
index 7a90dc49d44..ccf4c1879a5 100644
--- a/config/locales/crowdin/nl.yml
+++ b/config/locales/crowdin/nl.yml
@@ -2408,7 +2408,7 @@ nl:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "Bestandsopslag"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "Er is geen opslagtoegang gekoppeld aan uw account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2890,8 +2890,8 @@ nl:
label_project_custom_field_plural: "Projectkenmerken"
label_project_settings: "Project Instellingen"
label_project_attributes_settings: "Project kenmerken instellingen"
- label_project_storage_plural: "Bestandsopslag"
- label_project_storage_project_folder: "Bestandsopslag: Projectmappen"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projecten die %{used_disk_space} schijfruimte gebruiken"
label_project_view_all: "Bekijk alle projecten"
label_project_show_details: "Toon project details"
@@ -3631,7 +3631,7 @@ nl:
oauth_application_details: "De klantgeheim waarde zal niet meer toegankelijk zijn nadat u dit venster sluit. Kopieer deze waarden in de Nextcloud OpenProject integratie-instellingen:"
oauth_application_details_link_text: "Ga naar instellingen pagina"
setup_documentation_details: "Als u hulp nodig heeft bij het configureren van een nieuw bestand controleer dan de documentatie: "
- setup_documentation_details_link_text: "Bestandsopslag setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "Als u deze bestandsopslag wilt gebruiken, moet u de module en de specifieke opslag activeren in de projectinstellingen van elk gewenst project."
subversion:
existing_title: "Bestaande Subversion-repository"
@@ -4331,8 +4331,12 @@ nl:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "Het werkpakket dat u zoekt kan niet gevonden of verwijderd worden."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "JJJJ-MM-DD (alleen ISO 8601 datum)"
datetime: "YYYY-MM-DDDThh:mm:ss[.lll][+h:mm] (elk compatibel ISO 8601 datetime)"
diff --git a/config/locales/crowdin/no.yml b/config/locales/crowdin/no.yml
index 2ab23098746..273c1bbc85a 100644
--- a/config/locales/crowdin/no.yml
+++ b/config/locales/crowdin/no.yml
@@ -2411,7 +2411,7 @@
static_token_name: "RSS nøkkel"
disabled_text: "RSS-nøkler er ikke aktivert av administrator. Kontakt systemansvarlig for å bruke denne funksjonen."
storages:
- title: "Fillagringer"
+ title: "File storages"
text_hint: "Fillagrings-nøkler kobler til dette OpenProjectets instansen med et eksternt fillager."
empty_text_hint: "Det er ingen lagringstilgang knyttet til kontoen din."
revoke_token: "Vil du virkelig fjerne denne nøkkelen? Du må logge inn igjen på %{storage}"
@@ -2893,8 +2893,8 @@
label_project_custom_field_plural: "Prosjektegenskaper"
label_project_settings: "Prosjektinnstillinger"
label_project_attributes_settings: "Innstillinger for prosjektegenskaper"
- label_project_storage_plural: "Fillagringer"
- label_project_storage_project_folder: "Fillagringer: Prosjektmapper"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} prosjekter som bruker %{used_disk_space} diskplass"
label_project_view_all: "Vis alle prosjekter"
label_project_show_details: "Vis prosjektdetaljer"
@@ -3635,7 +3635,7 @@
oauth_application_details: "Den hemmelige verdien for klienten blir ikke tilgjengelig igjen etter at du har lukket dette vinduet. Kopier disse verdiene inn i Nextcloud OpenProject integrasjonsinnstillinger:"
oauth_application_details_link_text: "Gå til innstillingssiden"
setup_documentation_details: "Hvis du trenger hjelp til å konfigurere en ny fillagring, bør du kontrollere dokumentasjonen: "
- setup_documentation_details_link_text: "Fillagring satt opp"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "For å bruke denne fillagringen, husk å aktivere modulen og spesifikk lagring i prosjektinnstillingene for hvert ønsket prosjekt."
subversion:
existing_title: "Eksisterende subversion kodelager"
@@ -4336,8 +4336,12 @@
code_500_missing_enterprise_token: "Forespørselen kan ikke håndteres på grunn av ugyldig eller manglende Enterprise nøkkel."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "Arbeidspakken du leter etter kan ikke bli funnet eller den har blitt slettet."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (kun dato (ISO 8601)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (enhver kompatibel ISO 8601 datetime)"
diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml
index a9e7d9afc1d..dffeefda61c 100644
--- a/config/locales/crowdin/pl.yml
+++ b/config/locales/crowdin/pl.yml
@@ -2487,7 +2487,7 @@ pl:
static_token_name: "Token RSS"
disabled_text: "Tokeny RSS nie zostały włączone przez administratora. Aby użyć tej funkcji, skontaktuj się z administratorem."
storages:
- title: "Magazyny plików"
+ title: "File storages"
text_hint: "Tokeny magazynów plików łączą to wystąpienie OpenProject z zewnętrznym magazynem plików."
empty_text_hint: "Nie ma dostępu do magazynu podłączonego do Twojego konta."
revoke_token: "Czy na pewno chcesz usunąć ten token? Trzeba będzie zalogować się ponownie w %{storage}"
@@ -2969,8 +2969,8 @@ pl:
label_project_custom_field_plural: "Atrybuty projektu"
label_project_settings: "Ustawienia projektu"
label_project_attributes_settings: "Ustawienia atrybutów projektu"
- label_project_storage_plural: "Magazyny plików"
- label_project_storage_project_folder: "Magazyny plików: foldery projektów"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "Projekty (%{count}) zajmują %{used_disk_space} miejsca na dysku"
label_project_view_all: "Zobacz wszystkie projekty"
label_project_show_details: "Pokaż szczegóły projektu"
@@ -3712,7 +3712,7 @@ pl:
oauth_application_details: "Wartość kod klienta nie będzie ponownie dostępna po zamknięciu tego okna. Skopiuj tę wartości do ustawień Nextcloud OpenProject Integration:"
oauth_application_details_link_text: "Przejdź do ustawień"
setup_documentation_details: "Jeśli potrzebujesz pomocy w konfiguracji nowego magazynu plików, sprawdź dokumentację: "
- setup_documentation_details_link_text: "Konfiguracja magazynów plików"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "Aby wykorzystać ten magazyn plików należy aktywować moduł i konkretny magazyn w ustawieniach projektu dla każdego żądanego projektu."
subversion:
existing_title: "Istniejące repozytorium Subversion"
@@ -4415,8 +4415,12 @@ pl:
code_500_missing_enterprise_token: "Żądania nie można obsłużyć z powodu nieprawidłowego lub brakującego tokena wersji Enterprise."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "Pakiet roboczy, którego szukasz nie został znaleziony lub został usunięty."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "RRRR-MM-DD (tylko data ISO 8601)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (dowolna data i godzina zgodne z ISO 8601)"
diff --git a/config/locales/crowdin/pt-BR.yml b/config/locales/crowdin/pt-BR.yml
index 780bb364984..4a80b6c571e 100644
--- a/config/locales/crowdin/pt-BR.yml
+++ b/config/locales/crowdin/pt-BR.yml
@@ -2409,7 +2409,7 @@ pt-BR:
static_token_name: "Token de RSS"
disabled_text: "Os tokens de RSS não estão habilitados pelo administrador. Entre em contato com o administrador para utilizar este recurso."
storages:
- title: "Armazenamentos de arquivo"
+ title: "File storages"
text_hint: "Tokens de Armazenamento de Arquivo conectam esta instância do OpenProject a um Armazenamento de Arquivos externo."
empty_text_hint: "Não há nenhum acesso de armazenamento vinculado à sua conta."
revoke_token: "Você realmente deseja remover este token? Você precisará fazer login novamente no %{storage}"
@@ -2891,8 +2891,8 @@ pt-BR:
label_project_custom_field_plural: "Atributos do projeto"
label_project_settings: "Configurações do projeto"
label_project_attributes_settings: "Configurações de atributos de projeto"
- label_project_storage_plural: "Armazenamentos de arquivo"
- label_project_storage_project_folder: "Armazenamentos de arquivos: pastas do Projeto"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projetos usando %{used_disk_space} do espaço em disco"
label_project_view_all: "Ver todos os projetos"
label_project_show_details: "Mostrar detalhes do projeto"
@@ -3632,7 +3632,7 @@ pt-BR:
oauth_application_details: "O valor secreto do cliente não poderá ser acessado novamente após esta janela ser fechada. Copie estes valores nas configurações de Integração do Nextcloud OpenProject:"
oauth_application_details_link_text: "Ir para a página de configurações"
setup_documentation_details: "Se você precisar de ajuda para configurar um novo armazenamento de arquivos, confira a documentação:"
- setup_documentation_details_link_text: "Configuração de armazenamento"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "Para usar este armazenamento de arquivos, lembre-se de ativar o módulo e o armazenamento específico nas configurações de projeto de cada projeto desejado."
subversion:
existing_title: "Repositório Subversion existente"
@@ -4332,8 +4332,12 @@ pt-BR:
code_500_missing_enterprise_token: "O pedido não pode ser manipulado devido a um token Enterprise inválido ou ausente."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "O pacote de trabalho que você está procurando não pode ser encontrado ou foi excluído."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "AAAA-MM-DD (somente data no formato ISO 8601)"
datetime: "AAAA-MM-DDThh:mm:ss[.lll][+hh:mm] (qualquer data e hora compatível com a ISO 8601)"
diff --git a/config/locales/crowdin/pt-PT.yml b/config/locales/crowdin/pt-PT.yml
index 7aa117b08a3..bc04cb63aaf 100644
--- a/config/locales/crowdin/pt-PT.yml
+++ b/config/locales/crowdin/pt-PT.yml
@@ -2409,7 +2409,7 @@ pt-PT:
static_token_name: "Token RSS"
disabled_text: "Os tokens RSS não são ativados pelo administrador. Contacte o seu administrador para utilizar esta funcionalidade."
storages:
- title: "Armazenamentos de ficheiros"
+ title: "File storages"
text_hint: "Os tokens de armazenamento de ficheiros ligam esta instância do OpenProject a um armazenamento de ficheiros externo."
empty_text_hint: "Não existe um acesso ao armazenamento associado à sua conta."
revoke_token: "Tem a certeza de que deseja remover este token? Terá de iniciar sessão novamente em %{storage}"
@@ -2891,8 +2891,8 @@ pt-PT:
label_project_custom_field_plural: "Atributos do projeto"
label_project_settings: "Configurações do projeto"
label_project_attributes_settings: "Definições dos atributos do projeto"
- label_project_storage_plural: "Armazenamentos de ficheiros"
- label_project_storage_project_folder: "Armazenamentos de ficheiros: pastas do projeto"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projetos utilizam %{used_disk_space} espaço no disco"
label_project_view_all: "Ver todos os projetos"
label_project_show_details: "Mostrar detalhes do projeto"
@@ -3630,7 +3630,7 @@ pt-PT:
oauth_application_details: "O valor secreto do cliente não estará acessível novamente após fechar esta janela. Copie esses valores para as definições de integração do OpenProject da Nextcloud:"
oauth_application_details_link_text: "Ir para a página de definições"
setup_documentation_details: "Se precisar de ajuda para configurar um novo armazenamento de ficheiros, verifique a documentação: "
- setup_documentation_details_link_text: "Definição de armazenamentos"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "Para usar esse armazenamento de ficheiros, lembre-se de ativar o módulo e o armazenamento específico nas definições do projeto de cada projeto desejado."
subversion:
existing_title: "Repositório Subversion existente"
@@ -4331,8 +4331,12 @@ pt-PT:
code_500_missing_enterprise_token: "O pedido não pode ser tratado devido a um token empresarial inválido ou em falta."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "O pacote de trabalho que procura não foi encontrado ou foi eliminado."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "AAAA-MM-DD (Data ISO 8601 apenas)"
datetime: "AAAA-MM-DDThh:mm:ss[.lll][+hh:mm] (qualquer data ISO 8601 compatível)"
diff --git a/config/locales/crowdin/ro.yml b/config/locales/crowdin/ro.yml
index 6a68ee93f68..e46134d7eca 100644
--- a/config/locales/crowdin/ro.yml
+++ b/config/locales/crowdin/ro.yml
@@ -2451,7 +2451,7 @@ ro:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2933,8 +2933,8 @@ ro:
label_project_custom_field_plural: "Atribute proiect"
label_project_settings: "Setările proiectului"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} proiecte care utilizează %{used_disk_space} spațiu pe disc"
label_project_view_all: "Vizualizează toate proiectele"
label_project_show_details: "Arată detaliile proietului"
@@ -3676,7 +3676,7 @@ ro:
oauth_application_details: "Valoarea secretă a clientului nu va mai fi accesibilă după ce închideți această fereastră. Vă rugăm să copiați aceste valori în setările Nextcloud OpenProject Integration:"
oauth_application_details_link_text: "Mergi la pagina setări"
setup_documentation_details: "Dacă aveți nevoie de ajutor pentru configurarea unui nou depozit de fișiere, consultați documentația: "
- setup_documentation_details_link_text: "Configurarea fișierelor de stocare"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "Pentru a utiliza acest spațiu de stocare a fișierelor, nu uita să activezi modulul și spațiul de stocare specific în setările de proiect ale fiecărui proiect dorit."
subversion:
existing_title: "Repo Subversion existent"
@@ -4378,8 +4378,12 @@ ro:
code_500_missing_enterprise_token: "Cererea nu poate fi gestionată din cauza token-ului Enterprise invalid sau lipsă."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "Pachetul de lucru pe care îl căutați nu poate fi găsit sau a fost șters."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "AAAA-MM-ZZ (doar formate ISO 8601)"
datetime: "AAAA-LL-ZZZZH:mm:ss[.lll][+h:mm] (orice dăți compatibile ISO 8601 dată-oră)"
diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml
index 09c6ed72fd8..020bffa4cc3 100644
--- a/config/locales/crowdin/ru.yml
+++ b/config/locales/crowdin/ru.yml
@@ -772,8 +772,8 @@ ru:
lag:
subject: "Отставание"
caption: |-
- The minimum number of working days to keep in between the two work packages.
- It can also be negative.
+ Минимальное количество рабочих дней, которое должно быть между двумя пакетами работ.
+ Оно также может быть отрицательным.
relations:
label_new_child_created: "Новый пакет работ создан и добавлен как дочерний"
label_relates_singular: "Связан с"
@@ -989,10 +989,10 @@ ru:
project/phase:
date_range: "Диапазон дат"
definition: "Описание"
- duration: "Duration"
- start_date: "Start date"
- start_date_caption: "Follows the previous phase."
- finish_date: "Finish date"
+ duration: "Продолжительность"
+ start_date: "Дата начала"
+ start_date_caption: "Следует предыдущей фазе."
+ finish_date: "Дата окончания"
project/phase_definition:
name: "Имя"
color: "Цвет"
@@ -1305,11 +1305,11 @@ ru:
project/phase:
attributes:
start_date:
- must_be_before_finish_date: "must be before the finish date."
- non_continuous_dates: "can't be earlier than the previous phase's end date."
+ must_be_before_finish_date: "должно быть до даты окончания."
+ non_continuous_dates: "не может быть раньше, чем дата окончания предыдущей фазы."
finish_date:
- must_be_after_start_date: "must be after the start date."
- cannot_be_a_non_working_day: "can't be a non-working day."
+ must_be_after_start_date: "должно быть после даты начала."
+ cannot_be_a_non_working_day: "не может быть нерабочим днем."
query:
attributes:
project:
@@ -1436,7 +1436,7 @@ ru:
cannot_be_in_another_project: "не может быть в другом проекте."
not_a_valid_parent: "имеет неверное значение."
schedule_manually:
- cannot_be_automatically_scheduled: "cannot be set to false (automatically scheduled) as it has no predecessors or children."
+ cannot_be_automatically_scheduled: "не может быть установлено значение false (автоматическое планирование), так как у него нет предшественников или дочерних элементов."
start_date:
violates_relationships: "может быть установлено лишь в %{soonest_start} или позднее и без нарушения взаимосвязи рабочих пакетов."
cannot_be_null: "не может быть нулевым, поскольку известны дата окончания и продолжительность."
@@ -2488,7 +2488,7 @@ ru:
static_token_name: "Токен RSS"
disabled_text: "Токены RSS не включены администратором. Пожалуйста, обратитесь к администратору, чтобы использовать эту функцию."
storages:
- title: "Файловые хранилища"
+ title: "File storages"
text_hint: "Токены хранения файлов подключают этот экземпляр OpenProject к внешнему хранилищу файлов."
empty_text_hint: "Нет доступа к хранилищу, связанному с вашей учетной записью."
revoke_token: "Вы действительно хотите удалить этот токен? Вам нужно будет снова войти в систему на %{storage}"
@@ -2679,8 +2679,8 @@ ru:
label_deleted_custom_item: "(удалено)"
label_deleted_custom_option: "(удалённая опция)"
label_empty_element: "(пусто)"
- label_go_back: "Go back one menu level"
- label_go_forward: "Open %{module} sub-menu"
+ label_go_back: "Вернуться на один уровень меню назад"
+ label_go_forward: "Открыть подменю %{module}"
label_missing_or_hidden_custom_option: "(отсутствует значение или недостаточно прав для доступа)"
label_descending: "По убыванию"
label_details: "Детали"
@@ -2970,8 +2970,8 @@ ru:
label_project_custom_field_plural: "Атрибуты проекта"
label_project_settings: "Настройки проекта"
label_project_attributes_settings: "Настройки атрибутов проекта"
- label_project_storage_plural: "Файловые хранилища"
- label_project_storage_project_folder: "Файловые хранилища: Папки проекта"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} проектов, использующих %{used_disk_space} дискового пространства"
label_project_view_all: "Просмотреть все проекты"
label_project_show_details: "Показать детали проекта"
@@ -2980,7 +2980,7 @@ ru:
label_query_new: "Новый запрос"
label_query_plural: "Пользовательские запросы"
label_read: "Читать..."
- label_read_documentation: "Read documentation"
+ label_read_documentation: "Читать документацию"
label_register: "Создайте новую учетную запись"
label_register_with_developer: "Зарегистрируйтесь как разработчик"
label_registered_on: "Зарегистрированы на"
@@ -3713,7 +3713,7 @@ ru:
oauth_application_details: "Секретное значение клиента не будет доступно после закрытия этого окна. Пожалуйста, скопируйте это значение в настройки интеграции Nextcloud OpenProject:"
oauth_application_details_link_text: "Перейти на страницу настроек"
setup_documentation_details: "Если вам нужна помощь в настройке нового хранилища файлов, пожалуйста, проверьте документацию: "
- setup_documentation_details_link_text: "Настройка файловых хранилищ"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "Для использования этого хранилища файлов не забудьте активировать модуль и конкретное хранилище в настройках проекта каждого желаемого проекта."
subversion:
existing_title: "Существующий репозиторий Subversion"
@@ -4414,9 +4414,13 @@ ru:
code_500_outbound_request_failure: "Исходящий запрос к другому ресурсу не удался с кодом статуса %{status_code}."
code_500_missing_enterprise_token: "Запрос не может быть обработан из-за недействительного или отсутствующего корпоративного токена."
bad_request:
- emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ emoji_reactions_activity_type_not_supported: "Этот тип деятельности не поддерживает реакции эмодзи."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ Вы можете установить только одно напоминание для пакета работ. Пожалуйста, удалите или обновите напоминание.
not_found:
work_package: "Пакет работ, который вы ищете, не найден или был удален."
+ reminder: "Напоминание, которое вы ищете, не найдено или было удалено."
expected:
date: "ГГГГ-мм-дд (только для даты ISO 8601)"
datetime: "ГГГГ-ММ-Дтч:мм:сс[.lll][+чч:мм] (любой совместимый ISO 8601 формат времени)"
diff --git a/config/locales/crowdin/rw.yml b/config/locales/crowdin/rw.yml
index 93377333285..92cc1614799 100644
--- a/config/locales/crowdin/rw.yml
+++ b/config/locales/crowdin/rw.yml
@@ -2412,7 +2412,7 @@ rw:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2894,8 +2894,8 @@ rw:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Project settings"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "View all projects"
label_project_show_details: "Show project details"
@@ -3636,7 +3636,7 @@ rw:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4337,8 +4337,12 @@ rw:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/si.yml b/config/locales/crowdin/si.yml
index b951e6b466a..b31a9c360d1 100644
--- a/config/locales/crowdin/si.yml
+++ b/config/locales/crowdin/si.yml
@@ -2412,7 +2412,7 @@ si:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2894,8 +2894,8 @@ si:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "ව්යාපෘති සැකසුම්"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "සියලුම ව්යාපෘති බලන්න"
label_project_show_details: "ව්යාපෘති විස්තර පෙන්වන්න"
@@ -3636,7 +3636,7 @@ si:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "දැනට පවතින අනුකරණ ගබඩාව"
@@ -4337,8 +4337,12 @@ si:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYY-MM-DD (ISO 8601 දිනය පමණි)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/sk.yml b/config/locales/crowdin/sk.yml
index e319191b1ea..da1a2ac162f 100644
--- a/config/locales/crowdin/sk.yml
+++ b/config/locales/crowdin/sk.yml
@@ -2490,7 +2490,7 @@ sk:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2972,8 +2972,8 @@ sk:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Nastavenia projektu"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "Zobraziť všetky projekty"
label_project_show_details: "Zobraziť detaily projektu"
@@ -3717,7 +3717,7 @@ sk:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existujúce úložisko Subversion (verzia softvéru a kontrola revízie)"
@@ -4420,8 +4420,12 @@ sk:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "RRRR-MM-DD (len dátumu ISO 8601)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/sl.yml b/config/locales/crowdin/sl.yml
index 16792c76e92..3d734546bb9 100644
--- a/config/locales/crowdin/sl.yml
+++ b/config/locales/crowdin/sl.yml
@@ -2489,7 +2489,7 @@ sl:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2971,8 +2971,8 @@ sl:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Nastavitve projekta"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "Prikaži vse projekte"
label_project_show_details: "Prikaži podrobnosti projekta"
@@ -3716,7 +3716,7 @@ sl:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Obstoječe skladišče podrazličice"
@@ -4419,8 +4419,12 @@ sl:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (samo ISO 8601 datum)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (ISO 8601 kompatibilen datum in čas)"
diff --git a/config/locales/crowdin/sr.yml b/config/locales/crowdin/sr.yml
index 7c616e5efb1..e4d11dd9948 100644
--- a/config/locales/crowdin/sr.yml
+++ b/config/locales/crowdin/sr.yml
@@ -2451,7 +2451,7 @@ sr:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2933,8 +2933,8 @@ sr:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Project settings"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "View all projects"
label_project_show_details: "Show project details"
@@ -3677,7 +3677,7 @@ sr:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4379,8 +4379,12 @@ sr:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/sv.yml b/config/locales/crowdin/sv.yml
index 9cab61a2d8a..9621d2a619d 100644
--- a/config/locales/crowdin/sv.yml
+++ b/config/locales/crowdin/sv.yml
@@ -2412,7 +2412,7 @@ sv:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2894,8 +2894,8 @@ sv:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Projektinställningar"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "Visa alla projekt"
label_project_show_details: "Visa projektdetaljer"
@@ -3634,7 +3634,7 @@ sv:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Befintligt Subversion-arkiv"
@@ -4334,8 +4334,12 @@ sv:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "ÅÅÅÅ-MM-DD (endast datum enligt ISO 8601)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/th.yml b/config/locales/crowdin/th.yml
index 6509fe48e56..8888b9e74e2 100644
--- a/config/locales/crowdin/th.yml
+++ b/config/locales/crowdin/th.yml
@@ -2373,7 +2373,7 @@ th:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2855,8 +2855,8 @@ th:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "การตั้งค่าโครงการ"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "ดูโครงการทั้งหมด"
label_project_show_details: "Show project details"
@@ -3595,7 +3595,7 @@ th:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4295,8 +4295,12 @@ th:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/tr.yml b/config/locales/crowdin/tr.yml
index 5cd5784d0c0..a7b1226a9a0 100644
--- a/config/locales/crowdin/tr.yml
+++ b/config/locales/crowdin/tr.yml
@@ -2411,7 +2411,7 @@ tr:
static_token_name: "RSS belirteci"
disabled_text: "RSS belirteçleri yönetici tarafından etkinleştirilmemiştir. Bu özelliği kullanmak için lütfen yöneticinize başvurun."
storages:
- title: "Dosya Depoları"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "Hesabınıza bağlı herhangi bir depolama erişimi yoktur."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2893,8 +2893,8 @@ tr:
label_project_custom_field_plural: "Proje öznitelikleri"
label_project_settings: "Proje ayarları"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "Dosya Depoları"
- label_project_storage_project_folder: "Dosya Depoları: Proje klasörleri"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} proje %{used_disk_space} disk alanı kullanıyor"
label_project_view_all: "Tüm projeleri görüntüle"
label_project_show_details: "Proje detaylarını göster"
@@ -3633,7 +3633,7 @@ tr:
oauth_application_details: "Bu pencereyi kapattıktan sonra istemci gizli anahtarı değerine tekrar erişilemez. Lütfen bu değerleri Nextcloud OpenProject Entegrasyon ayarlarına kopyalayın:"
oauth_application_details_link_text: "Ayarlar sayfasına git"
setup_documentation_details: "Yeni bir dosya deposunu yapılandırmak için yardıma ihtiyacınız varsa, lütfen belgelere bakın:"
- setup_documentation_details_link_text: "Dosya Depoları kurulumu"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "Bu dosya deposunu kullanmak için, istenen her projenin proje ayarlarında modülü ve belirli depolamayı etkinleştirmeyi unutmayın."
subversion:
existing_title: "Mevcut Subversion deposu"
@@ -4333,8 +4333,12 @@ tr:
code_500_missing_enterprise_token: "Geçersiz veya eksik Enterprise belirteci nedeniyle istek işlenemiyor."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "Aradığınız çalışma paketi bulunamadı veya silinmiş."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-AA-GG (ISO 8601 sadece tarih)"
datetime: "YYYY-AA-GGThs:dd:ss[.lll][+ss:dd] (uyumlu herhangi bir ISO 8601 tarih/saat)"
diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml
index 39b55ed2ca5..2663ccddcdc 100644
--- a/config/locales/crowdin/uk.yml
+++ b/config/locales/crowdin/uk.yml
@@ -2484,7 +2484,7 @@ uk:
static_token_name: "Маркер RSS"
disabled_text: "Маркери API не дозволено адміністратором. Зверніться до нього, якщо вам потрібна ця функція."
storages:
- title: "Файлові сховища"
+ title: "File storages"
text_hint: "Маркери файлових сховищ підключають цей екземпляр OpenProject до зовнішнього файлового сховища."
empty_text_hint: "Немає доступу до сховища, пов’язаного з вашим обліковим записом."
revoke_token: "Справді вилучити цей маркер? Вам знадобиться знову ввійти в %{storage}"
@@ -2966,8 +2966,8 @@ uk:
label_project_custom_field_plural: "Атрибути проєкту"
label_project_settings: "Налаштування проекту"
label_project_attributes_settings: "Налаштування атрибутів проєкту"
- label_project_storage_plural: "Файлові сховища"
- label_project_storage_project_folder: "Файлові сховища: папки проєкту"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "Проєктів, що використовують %{used_disk_space} місця на диску: %{count}"
label_project_view_all: "Переглянути всi проекти"
label_project_show_details: "Показати деталі проекту"
@@ -3710,7 +3710,7 @@ uk:
oauth_application_details: "Секретний ключ клієнта стане недоступним, коли ви закриєте це вікно. Скопіюйте це значення в налаштування інтеграції Nextcloud OpenProject:"
oauth_application_details_link_text: "Перейти на сторінку налаштувань"
setup_documentation_details: "Якщо потрібна допомога з налаштуванням сховища нових файлів, ознайомтеся з документацією: "
- setup_documentation_details_link_text: "Налаштування файлових сховищ"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "Щоб користуватися цим файловим сховищем, активуйте модуль і визначене сховище в налаштуваннях кожного потрібного проєкту."
subversion:
existing_title: "Існуюче сховище Subversion"
@@ -4412,8 +4412,12 @@ uk:
code_500_missing_enterprise_token: "Цей запит не можна обробити через недійсний або відсутній маркер версії Enterprise."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "Пакет робіт, який ви шукаєте, не можна знайти або його видалено."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (будь-який сумісний формат ISO 8601 дати й часу)"
diff --git a/config/locales/crowdin/uz.yml b/config/locales/crowdin/uz.yml
index 98a16f653af..08932584fc7 100644
--- a/config/locales/crowdin/uz.yml
+++ b/config/locales/crowdin/uz.yml
@@ -2412,7 +2412,7 @@ uz:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2894,8 +2894,8 @@ uz:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Project settings"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "View all projects"
label_project_show_details: "Show project details"
@@ -3636,7 +3636,7 @@ uz:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4337,8 +4337,12 @@ uz:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/crowdin/vi.yml b/config/locales/crowdin/vi.yml
index e7e9b940026..8010d97655f 100644
--- a/config/locales/crowdin/vi.yml
+++ b/config/locales/crowdin/vi.yml
@@ -2373,7 +2373,7 @@ vi:
static_token_name: "Mã RSS"
disabled_text: "Mã RSS không được kích hoạt bởi quản trị viên. Vui lòng liên hệ với quản trị viên của bạn để sử dụng tính năng này."
storages:
- title: "Lưu trữ tệp"
+ title: "File storages"
text_hint: "Mã Lưu trữ Tệp kết nối phiên bản OpenProject này với một lưu trữ tệp bên ngoài."
empty_text_hint: "Không có quyền truy cập lưu trữ nào liên kết với tài khoản của bạn."
revoke_token: "Bạn có thực sự muốn xóa mã truy cập này không? Bạn sẽ cần phải đăng nhập lại trên %{storage}"
@@ -2855,8 +2855,8 @@ vi:
label_project_custom_field_plural: "Các thuộc tính dự án"
label_project_settings: "Thiết lập dự án"
label_project_attributes_settings: "Cài đặt thuộc tính dự án"
- label_project_storage_plural: "Lưu trữ Tệp"
- label_project_storage_project_folder: "Lưu trữ tệp: Thư mục dự án"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} dự án đang sử dụng %{used_disk_space} dung lượng đĩa"
label_project_view_all: "Xem tất cả các dự án"
label_project_show_details: "Hiển thị chi tiết dự án"
@@ -3595,7 +3595,7 @@ vi:
oauth_application_details: "Giá trị bí mật của khách hàng sẽ không còn khả dụng sau khi bạn đóng cửa sổ này. Vui lòng sao chép các giá trị này vào cài đặt tích hợp OpenProject của Nextcloud:"
oauth_application_details_link_text: "Đi đến trang cài đặt"
setup_documentation_details: "Nếu bạn cần trợ giúp để cấu hình một lưu trữ tệp mới, vui lòng kiểm tra tài liệu: "
- setup_documentation_details_link_text: "Cấu hình lưu trữ tệp"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "Để sử dụng lưu trữ tệp này, hãy nhớ kích hoạt mô-đun và lưu trữ cụ thể trong cài đặt dự án của từng dự án mong muốn."
subversion:
existing_title: "Kho Subversion hiện có"
@@ -4294,8 +4294,12 @@ vi:
code_500_missing_enterprise_token: "Yêu cầu không thể được xử lý do token Doanh nghiệp không hợp lệ hoặc bị thiếu."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "Gói công việc bạn tìm kiếm không thể tìm thấy hoặc đã bị xóa."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (chỉ nhận ISO 8601)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (bất kỳ ngày giờ ISO 8601 nào)"
diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml
index 8c6a89ce7bb..1fc61c2d1e9 100644
--- a/config/locales/crowdin/zh-CN.yml
+++ b/config/locales/crowdin/zh-CN.yml
@@ -746,8 +746,8 @@ zh-CN:
lag:
subject: "间隔"
caption: |-
- The minimum number of working days to keep in between the two work packages.
- It can also be negative.
+ 两个工作包间的最少工作日数。
+ 也可以是负数。
relations:
label_new_child_created: "创建新工作包并将其添加为子项"
label_relates_singular: "关联到"
@@ -2369,7 +2369,7 @@ zh-CN:
static_token_name: "RSS 令牌"
disabled_text: "管理员未启用 RSS 令牌。请联系管理员以使用此功能。"
storages:
- title: "文件存储区"
+ title: "File storages"
text_hint: "文件存储区令牌将此 OpenProject 实例与外部文件存储区连接。"
empty_text_hint: "没有与您的帐户相关联的存储区访问权限。"
revoke_token: "是否确实要移除此令牌?您需要再次登录 %{storage}"
@@ -2560,8 +2560,8 @@ zh-CN:
label_deleted_custom_item: "(删除项目)"
label_deleted_custom_option: "(删除的选项)"
label_empty_element: "(空)"
- label_go_back: "Go back one menu level"
- label_go_forward: "Open %{module} sub-menu"
+ label_go_back: "返回一级菜单"
+ label_go_forward: "打开 %{module} 子菜单"
label_missing_or_hidden_custom_option: "(缺少值或缺少访问权限)"
label_descending: "降序"
label_details: "详细信息"
@@ -2851,8 +2851,8 @@ zh-CN:
label_project_custom_field_plural: "项目属性"
label_project_settings: "项目设置"
label_project_attributes_settings: "项目属性设置"
- label_project_storage_plural: "文件存储区"
- label_project_storage_project_folder: "文件存储区:项目文件夹"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} 个项目正在使用 %{used_disk_space} 磁盘空间"
label_project_view_all: "查看所有项目"
label_project_show_details: "显示项目详细信息"
@@ -3586,7 +3586,7 @@ zh-CN:
oauth_application_details: "关闭此窗口后,将无法再次访问客户端密钥值。请将这些值复制到 Nextcloud OpenProject 集成设置中:"
oauth_application_details_link_text: "转到设置页面"
setup_documentation_details: "如果您在配置新文件存储方面需要帮助,请查看文档:"
- setup_documentation_details_link_text: "文件存储设置"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "要使用此文件存储,请记得在每个所需项目的项目设置中激活模块和特定存储。"
subversion:
existing_title: "现有的 Subversion 存储库"
@@ -4285,8 +4285,12 @@ zh-CN:
code_500_missing_enterprise_token: "由于企业令牌是无效的或缺失的,故无法处理该请求。"
bad_request:
emoji_reactions_activity_type_not_supported: "此活动类型不支持表情符号反应。"
+ conflict:
+ multiple_reminders_not_allowed: |-
+ 您每次只能设置一个工作包提醒。请删除或更新现有提醒。
not_found:
work_package: "找不到您要查找的工作包或者它已被删除。"
+ reminder: "找不到您要查找的提醒或者它已被删除。"
expected:
date: "YYYY-MM-DD(仅适用于 ISO 8601 日期)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm](任何兼容的 ISO 8601 日期时间)"
diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml
index 45b8ac1cbb4..fd4df8110c2 100644
--- a/config/locales/crowdin/zh-TW.yml
+++ b/config/locales/crowdin/zh-TW.yml
@@ -748,8 +748,7 @@ zh-TW:
lag:
subject: "延遲"
caption: |-
- The minimum number of working days to keep in between the two work packages.
- It can also be negative.
+ 兩個工作項目之間的最少間隔工作天數。這個數值也可以是負數。
relations:
label_new_child_created: "建立新的工作項目,並以子項目新增"
label_relates_singular: "相關於"
@@ -965,10 +964,10 @@ zh-TW:
project/phase:
date_range: "日期範圍"
definition: "定義"
- duration: "Duration"
- start_date: "Start date"
- start_date_caption: "Follows the previous phase."
- finish_date: "Finish date"
+ duration: "持續時間"
+ start_date: "起始日期"
+ start_date_caption: "延續前一階段。"
+ finish_date: "完成日期"
project/phase_definition:
name: "名稱"
color: "顏色"
@@ -1281,11 +1280,11 @@ zh-TW:
project/phase:
attributes:
start_date:
- must_be_before_finish_date: "must be before the finish date."
- non_continuous_dates: "can't be earlier than the previous phase's end date."
+ must_be_before_finish_date: "必須在完成日期之前。"
+ non_continuous_dates: "不能早於前一階段的結束日期。"
finish_date:
- must_be_after_start_date: "must be after the start date."
- cannot_be_a_non_working_day: "can't be a non-working day."
+ must_be_after_start_date: "必須在開始日期之後。"
+ cannot_be_a_non_working_day: "不能是非工作日。"
query:
attributes:
project:
@@ -2371,7 +2370,7 @@ zh-TW:
static_token_name: "RSS 權杖(Token)"
disabled_text: "尚未啟用 RSS 權杖(Token)功能。 請聯絡您的管理員。"
storages:
- title: "文件儲存空間"
+ title: "File storages"
text_hint: "檔案儲存區權杖(Token),可將本專案管理系統與外部檔案儲存系統連接。"
empty_text_hint: "沒有與您帳戶連動的儲存裝置存取權限。"
revoke_token: "是否確實要移除此權杖?您需要再次登錄 %{storage}"
@@ -2562,8 +2561,8 @@ zh-TW:
label_deleted_custom_item: "(刪除項目)"
label_deleted_custom_option: "(刪除的選項)"
label_empty_element: "(空)"
- label_go_back: "Go back one menu level"
- label_go_forward: "Open %{module} sub-menu"
+ label_go_back: "回到上一層選單"
+ label_go_forward: "開啟 %{module} 子選單"
label_missing_or_hidden_custom_option: "(缺少值或缺少訪問權限)"
label_descending: "降冪"
label_details: "詳細資料"
@@ -2853,8 +2852,8 @@ zh-TW:
label_project_custom_field_plural: "專案屬性"
label_project_settings: "專案設定"
label_project_attributes_settings: "專案屬性設置"
- label_project_storage_plural: "文件儲存空間"
- label_project_storage_project_folder: "文件存儲區:項目文件夾"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} 專案,使用 %{used_disk_space} 磁碟空間"
label_project_view_all: "檢視所有專案"
label_project_show_details: "顯示專案詳細資訊"
@@ -3591,7 +3590,7 @@ zh-TW:
oauth_application_details: "關閉此窗口後,將無法再次訪問客戶端密鑰值。請將這些值複製到 Nextcloud OpenProject 集成設置中:"
oauth_application_details_link_text: "前往設定"
setup_documentation_details: "如果您在配置新文件存儲方面需要幫助,請查看文檔: "
- setup_documentation_details_link_text: "設定文件儲存區"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "無法在應用程序中更改外部帳戶的密碼。請使用您的身份驗證服務提供商的密碼丟失功能。"
subversion:
existing_title: "現有的 Subversion 版本庫"
@@ -4291,8 +4290,12 @@ zh-TW:
code_500_missing_enterprise_token: "由於企業權杖是無效的或缺失的,故無法處理該請求。"
bad_request:
emoji_reactions_activity_type_not_supported: "此活動類型不支持表情符號反應。"
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "找不到您要查找的工作項目或者它已被刪除。"
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (僅適用於 ISO 8601 日期)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm](任何兼容的 ISO 8601 日期時間)"
diff --git a/config/locales/en.yml b/config/locales/en.yml
index cc2688c5c68..e5c4f80ca85 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -2094,12 +2094,12 @@ en:
readonly_work_packages: Readonly Work Packages
sso_auth_providers: Single sign-on
team_planner_view: Team Planner View
- two_factor_authentication: 2FA Authentication
virus_scanning: Antivirus Scanning
work_package_query_relation_columns: Work Package Query Relation Columns
work_package_sharing: Share work packages with external users
work_package_subject_generation: Work Package Subject Generation
upsell:
+ buy_now_button: "Buy now"
plans_title: "Enterprise plans"
title: "Enterprise add-on"
plan_title: "Enterprise %{plan} add-on"
@@ -2507,7 +2507,7 @@ en:
static_token_name: "RSS token"
disabled_text: "RSS tokens are not enabled by the administrator. Please contact your administrator to use this feature."
storages:
- title: "File Storages"
+ title: "File storages"
text_hint: "File Storage tokens connect this OpenProject instance with an external File Storage."
empty_text_hint: "There is no storage access linked to your account."
revoke_token: "Do you really want to remove this token? You will need to login again on %{storage}"
@@ -2991,8 +2991,8 @@ en:
label_project_custom_field_plural: "Project attributes"
label_project_settings: "Project settings"
label_project_attributes_settings: "Project attributes settings"
- label_project_storage_plural: "File Storages"
- label_project_storage_project_folder: "File Storages: Project folders"
+ label_project_storage_plural: "File storages"
+ label_project_storage_project_folder: "File storages: Project folders"
label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
label_project_view_all: "View all projects"
label_project_show_details: "Show project details"
@@ -3754,7 +3754,7 @@ en:
oauth_application_details: "The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:"
oauth_application_details_link_text: "Go to settings page"
setup_documentation_details: "If you need help configuring a new file storage please check the documentation: "
- setup_documentation_details_link_text: "File Storages setup"
+ setup_documentation_details_link_text: "File storages setup"
show_warning_details: "To use this file storage remember to activate the module and the specific storage in the project settings of each desired project."
subversion:
existing_title: "Existing Subversion repository"
@@ -4581,8 +4581,12 @@ en:
code_500_missing_enterprise_token: "The request can not be handled due to invalid or missing Enterprise token."
bad_request:
emoji_reactions_activity_type_not_supported: "This activity type does not support emoji reactions."
+ conflict:
+ multiple_reminders_not_allowed: |-
+ You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
not_found:
work_package: "The work package you are looking for cannot be found or has been deleted."
+ reminder: "The reminder you are looking for cannot be found or has been deleted."
expected:
date: "YYYY-MM-DD (ISO 8601 date only)"
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
diff --git a/config/locales/js-en.yml b/config/locales/js-en.yml
index f59a95bcad7..8935b76f6e7 100644
--- a/config/locales/js-en.yml
+++ b/config/locales/js-en.yml
@@ -400,18 +400,17 @@ en:
learn_about: "Learn more about all new features"
# Include the version to invalidate outdated translations in other locales.
# Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
- "16_0":
+ "16_1":
standard:
new_features_html: >
The release contains various new features and improvements, such as
-
Meeting backlogs and the end of classic meetings.
-
Updated Enterprise plans.
-
Internal comments in work packages (Enterprise add-on).
-
Automatically generated work package subjects (Enterprise add-on).
-
Separate time tracking module with calendar view.
-
Parent relation displayed in work package relations tab.
-
Release to Community: Graphs on project overview page.
+
Structure the project life cycle with phases and phase gates.
+
Export meetings in PDF format.
+
Set smart default options for reminders.
+
Use negative lag for work package dates.
+
Display hierarchy trees for hierarchy custom fields.
+
Benefit from improved accessibility for the date picker with ARIA live regions.
ical_sharing_modal:
@@ -620,7 +619,7 @@ en:
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
- show_modal: "Show attribute help text entry"
+ show_modal: "Show help text"
onboarding:
buttons:
@@ -1117,9 +1116,15 @@ en:
reminders:
button_label: "Set reminder"
title:
- new: "Set reminder"
+ new: "Set a reminder"
edit: "Edit reminder"
subtitle: "You will receive a notification for this work package at the chosen time."
+ presets:
+ tomorrow: "Tomorrow"
+ three_days: "In 3 days"
+ week: "In a week"
+ month: "In a month"
+ custom: "At a particular date/time"
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages."
diff --git a/config/routes.rb b/config/routes.rb
index d5f23c73e73..4698a4846de 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -116,6 +116,12 @@ Rails.application.routes.draw do
post "/account/confirm_consent", action: "confirm_consent", as: "account_confirm_consent"
end
+ resources :attribute_help_texts, only: [] do
+ member do
+ get :show_dialog
+ end
+ end
+
# Because of https://github.com/intridea/grape/pull/853/files this has to be
# placed behind handling the deprecated v1 because otherwise, a 405 is
# returned for all routes for which the v3 has also resources. Grape does
diff --git a/config/static_links.yml b/config/static_links.yml
index 88e1fabee9c..01fd2380fdb 100644
--- a/config/static_links.yml
+++ b/config/static_links.yml
@@ -160,11 +160,11 @@ sysadmin_docs:
saml:
href: https://www.openproject.org/docs/system-admin-guide/authentication/saml/
oidc:
- href: https://www.openproject.org/docs/installation-and-operations/misc/custom-openid-connect-providers/
+ href: https://www.openproject.org/docs/system-admin-guide/authentication/openid-providers/
oidc_claims:
- href: https://www.openproject.org/docs/installation-and-operations/misc/custom-openid-connect-providers/#claims
+ href: https://www.openproject.org/docs/system-admin-guide/authentication/openid-providers/#step-7-claims
oidc_acr_values:
- href: https://www.openproject.org/docs/installation-and-operations/misc/custom-openid-connect-providers/#non-essential-claims
+ href: https://www.openproject.org/docs/system-admin-guide/authentication/openid-providers/#step-7-claims
storage_docs:
nextcloud_setup:
href: https://www.openproject.org/docs/system-admin-guide/integrations/nextcloud/
diff --git a/docker-compose.yml b/docker-compose.yml
index 67af270b8c7..c36ebf0c8d9 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -36,7 +36,7 @@ x-op-backend: &backend
target: develop
<<: [*image, *restart_policy]
environment:
- LOCAL_DEV_CHECK: "${LOCAL_DEV_CHECK:?The docker-compose file for OpenProject has moved to https://github.com/opf/openproject-deploy}"
+ LOCAL_DEV_CHECK: "${LOCAL_DEV_CHECK:?The docker-compose file for OpenProject has moved to https://github.com/opf/openproject-docker-compose}"
RAILS_ENV: development
OPENPROJECT_CACHE__MEMCACHE__SERVER: cache:11211
OPENPROJECT_RAILS__CACHE__STORE: file_store
diff --git a/docs/api/README.md b/docs/api/README.md
index 9bd8876aa1a..823c6d304e1 100644
--- a/docs/api/README.md
+++ b/docs/api/README.md
@@ -25,7 +25,7 @@ Examples for this include managing work packages, projects and users.
➔ [Go to OpenProject API](./introduction/)
-### OpenAPI Specification
+### OpenAPI specification
Download the API specification in OpenAPI format as [json](https://www.openproject.org/docs/api/v3/spec.json) or [yml](https://www.openproject.org/docs/api/v3/spec.yml).
diff --git a/docs/api/apiv3/components/schemas/reminder_model.yml b/docs/api/apiv3/components/schemas/reminder_model.yml
index 08af277c428..5e4f4dcecf3 100644
--- a/docs/api/apiv3/components/schemas/reminder_model.yml
+++ b/docs/api/apiv3/components/schemas/reminder_model.yml
@@ -17,8 +17,16 @@ properties:
_links:
required:
- creator
+ - remindable
type: object
properties:
+ self:
+ allOf:
+ - $ref: "./link.yml"
+ - description: |-
+ This reminder
+
+ **Resource**: Reminder
creator:
allOf:
- $ref: "./link.yml"
@@ -26,3 +34,10 @@ properties:
The person that created the reminder
**Resource**: User
+ remindable:
+ allOf:
+ - $ref: "./link.yml"
+ - description: |-
+ The resource that the reminder is associated with
+
+ **Resource**: WorkPackage
diff --git a/docs/api/apiv3/components/schemas/work_package_model.yml b/docs/api/apiv3/components/schemas/work_package_model.yml
index 3f320bf7fa6..49eb1291bfd 100644
--- a/docs/api/apiv3/components/schemas/work_package_model.yml
+++ b/docs/api/apiv3/components/schemas/work_package_model.yml
@@ -433,6 +433,13 @@ properties:
The project phase to which the work package belongs
**Resource**: ProjectPhase
+ projectPhaseDefinition:
+ allOf:
+ - $ref: "./link.yml"
+ - description: |-
+ The definition of the project phase the work package belongs to
+
+ **Resource**: ProjectPhaseDefinition
responsible:
allOf:
- $ref: "./link.yml"
diff --git a/docs/api/apiv3/components/schemas/work_package_schema_model.yml b/docs/api/apiv3/components/schemas/work_package_schema_model.yml
index 302cf923d33..33685b02a97 100644
--- a/docs/api/apiv3/components/schemas/work_package_schema_model.yml
+++ b/docs/api/apiv3/components/schemas/work_package_schema_model.yml
@@ -66,6 +66,8 @@ properties:
$ref: './schema_property_model.yml'
projectPhase:
$ref: './schema_property_model.yml'
+ projectPhaseDefinition:
+ $ref: './schema_property_model.yml'
parent:
$ref: './schema_property_model.yml'
assignee:
diff --git a/docs/api/apiv3/openapi-spec.yml b/docs/api/apiv3/openapi-spec.yml
index f3efa45c893..fc7af16e524 100644
--- a/docs/api/apiv3/openapi-spec.yml
+++ b/docs/api/apiv3/openapi-spec.yml
@@ -388,6 +388,10 @@ paths:
"$ref": "./paths/render_plain.yml"
"/api/v3/revisions/{id}":
"$ref": "./paths/revision.yml"
+ "/api/v3/reminders":
+ "$ref": "./paths/reminders.yml"
+ "/api/v3/reminders/{id}":
+ "$ref": "./paths/reminder.yml"
"/api/v3/roles":
"$ref": "./paths/roles.yml"
"/api/v3/roles/{id}":
@@ -494,7 +498,7 @@ paths:
"$ref": "./paths/work_package_revisions.yml"
"/api/v3/work_packages/{id}/relations":
"$ref": "./paths/work_package_relations.yml"
- "/api/v3/work_packages/{id}/reminders":
+ "/api/v3/work_packages/{work_package_id}/reminders":
"$ref": "./paths/work_package_reminders.yml"
"/api/v3/work_packages/{id}/watchers":
"$ref": "./paths/work_package_watchers.yml"
diff --git a/docs/api/apiv3/paths/reminder.yml b/docs/api/apiv3/paths/reminder.yml
new file mode 100644
index 00000000000..687a45d7c38
--- /dev/null
+++ b/docs/api/apiv3/paths/reminder.yml
@@ -0,0 +1,79 @@
+# /api/v3/reminders/{id}
+---
+patch:
+ summary: Update a reminder
+ operationId: update_reminder
+ tags:
+ - Reminders
+ description: |-
+ Updates an existing reminder.
+
+ A user can only update their own active reminder.
+
+ **Required permission:** view work packages for the project the reminder is contained in.
+ parameters:
+ - name: id
+ in: path
+ description: Reminder ID
+ example: '1'
+ required: true
+ schema:
+ type: integer
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ type: object
+ properties:
+ remindAt:
+ type: string
+ format: date-time
+ description: The date and time when the reminder is due
+ note:
+ type: string
+ description: The note of the reminder (optional)
+ responses:
+ '200':
+ description: Reminder updated successfully
+ content:
+ application/hal+json:
+ schema:
+ $ref: '../components/schemas/reminder_model.yml'
+ '404':
+ description: |-
+ Returned if the reminder does not exist or the client does not have sufficient permissions to see it.
+ content:
+ application/hal+json:
+ schema:
+ $ref: '../components/schemas/error_response.yml'
+
+delete:
+ summary: Delete a reminder
+ operationId: delete_reminder
+ tags:
+ - Reminders
+ description: |-
+ Deletes an existing reminder.
+
+ A user can only delete their own active reminder.
+
+ **Required permission:** view work packages for the project the reminder is contained in.
+ parameters:
+ - name: id
+ in: path
+ description: Reminder ID
+ example: '1'
+ required: true
+ schema:
+ type: integer
+ responses:
+ '204':
+ description: Reminder deleted successfully
+ '404':
+ description: |-
+ Returned if the reminder does not exist or the client does not have sufficient permissions to see it.
+ content:
+ application/hal+json:
+ schema:
+ $ref: '../components/schemas/error_response.yml'
diff --git a/docs/api/apiv3/paths/reminders.yml b/docs/api/apiv3/paths/reminders.yml
new file mode 100644
index 00000000000..39eb4192903
--- /dev/null
+++ b/docs/api/apiv3/paths/reminders.yml
@@ -0,0 +1,43 @@
+# /api/v3/reminders
+---
+get:
+ summary: List all active reminders
+ operationId: list_reminders
+ tags:
+ - Reminders
+ description: |-
+ Gets a list of all active reminders for the user.
+ responses:
+ '200':
+ description: OK
+ content:
+ application/hal+json:
+ schema:
+ type: object
+ required:
+ - _type
+ - total
+ - count
+ - _embedded
+ properties:
+ _type:
+ type: string
+ enum:
+ - Collection
+ total:
+ type: integer
+ description: The total amount of elements available in the collection.
+ minimum: 0
+ count:
+ type: integer
+ description: Actual amount of elements in this response.
+ minimum: 0
+ _embedded:
+ type: object
+ required:
+ - elements
+ properties:
+ elements:
+ type: array
+ items:
+ $ref: '../components/schemas/reminder_model.yml'
diff --git a/docs/api/apiv3/paths/work_package_reminders.yml b/docs/api/apiv3/paths/work_package_reminders.yml
index 4f7027a5339..d072d7182fe 100644
--- a/docs/api/apiv3/paths/work_package_reminders.yml
+++ b/docs/api/apiv3/paths/work_package_reminders.yml
@@ -1,61 +1,132 @@
-# /api/v3/work_packages/{id}/reminders
+# /api/v3/work_packages/{work_package_id}/reminders
---
get:
+ summary: List work package reminders
+ operationId: list_work_package_reminders
+ tags:
+ - Work Packages
+ - Reminders
+ description: |-
+ Gets a list of your upcoming reminders for this work package.
+
+ Only active reminders that belong to the current user are returned.
parameters:
- - description: Work package id
- example: '1'
- in: path
- name: id
- required: true
- schema:
- type: integer
+ - name: work_package_id
+ in: path
+ description: Work package id
+ example: '1'
+ required: true
+ schema:
+ type: integer
responses:
'200':
description: OK
content:
application/hal+json:
schema:
- $ref: '../components/schemas/reminder_model.yml'
- headers: {}
+ type: object
+ required:
+ - _type
+ - total
+ - count
+ - _embedded
+ properties:
+ _type:
+ type: string
+ enum:
+ - Collection
+ total:
+ type: integer
+ description: The total amount of elements available in the collection.
+ minimum: 0
+ count:
+ type: integer
+ description: Actual amount of elements in this response.
+ minimum: 0
+ _embedded:
+ type: object
+ required:
+ - elements
+ properties:
+ elements:
+ type: array
+ items:
+ $ref: '../components/schemas/reminder_model.yml'
'403':
- content:
- application/hal+json:
- schema:
- $ref: "../components/schemas/error_response.yml"
- examples:
- response:
- value:
- _type: Error
- errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission
- message: You are not allowed to see linked reminders for this work
- package.
description: |-
Returned if the client does not have sufficient permissions.
**Required permission:** view work packages for the project the work package is contained in.
- **Required permission:** manage own reminders for the work package.
-
- *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.*
- headers: {}
- '404':
content:
application/hal+json:
schema:
- $ref: "../components/schemas/error_response.yml"
- examples:
- response:
- value:
- _type: Error
- errorIdentifier: urn:openproject-org:api:v3:errors:NotFound
- message: The specified work package does not exist.
+ $ref: '../components/schemas/error_response.yml'
+ '404':
description: |-
Returned if the work package does not exist or the client does not have sufficient permissions to see it.
**Required permission:** view work package
- headers: {}
+ content:
+ application/hal+json:
+ schema:
+ $ref: '../components/schemas/error_response.yml'
+
+post:
+ summary: Create a work package reminder
+ operationId: create_work_package_reminder
tags:
- - Work Packages
+ - Work Packages
+ - Reminders
description: |-
- Gets a list of your upcoming reminders for this work package.
- operationId: Reminders
- summary: Reminders
+ Creates a new reminder for the specified work package.
+
+ **Note:** A user can only have one **active** reminder at a time for a given work package.
+ parameters:
+ - name: work_package_id
+ in: path
+ description: Work package id
+ example: '1'
+ required: true
+ schema:
+ type: integer
+ requestBody:
+ required: true
+ content:
+ application/json:
+ schema:
+ type: object
+ required:
+ - remindAt
+ properties:
+ remindAt:
+ type: string
+ format: date-time
+ description: The date and time when the reminder is due
+ note:
+ type: string
+ description: The note of the reminder
+ responses:
+ '201':
+ description: Reminder created successfully
+ content:
+ application/hal+json:
+ schema:
+ $ref: '../components/schemas/reminder_model.yml'
+ '404':
+ description: |-
+ Returned if the work package does not exist or the client does not have sufficient permissions to see it.
+
+ **Required permission:** view work package
+ content:
+ application/hal+json:
+ schema:
+ $ref: '../components/schemas/error_response.yml'
+ '409':
+ description: |-
+ Returned if the user already has an active reminder for this work package.
+
+ **Error message**: You can only set one reminder at a time for a work package. Please delete or update the existing reminder.
+ content:
+ application/hal+json:
+ schema:
+ $ref: '../components/schemas/error_response.yml'
diff --git a/docs/api/apiv3/tags/work_packages.yml b/docs/api/apiv3/tags/work_packages.yml
index be9341d7576..809490e9625 100644
--- a/docs/api/apiv3/tags/work_packages.yml
+++ b/docs/api/apiv3/tags/work_packages.yml
@@ -20,30 +20,31 @@ description: |-
## Linked Properties
- | Link | Description | Type | Constraints | Supported operations | Condition |
- | :----------------: | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ------------ | --------------------- | ----------------------------------------- |
- | self | This work package | WorkPackage | not null | READ | |
- | schema | The schema of this work package | Schema | not null | READ | |
- | ancestors | Array of all visible ancestors of the work package, with the root node being the first element | Collection | not null | READ | **Permission** view work packages |
- | attachments | The files attached to this work package | Collection | not null | READ / WRITE | |
- | author | The person that created the work package | User | not null | READ | |
- | assignee | The person that is intended to work on the work package | User | | READ / WRITE | |
- | availableWatchers | All users that can be added to the work package as watchers. | User | | READ | **Permission** add work package watchers |
- | budget | The budget this work package is associated to | Budget | | READ / WRITE | **Permission** view cost objects |
- | category | The category of the work package | Category | | READ / WRITE | |
- | children | Array of all visible children of the work package | Collection | not null | READ | **Permission** view work packages |
- | parent | Parent work package | WorkPackage | Needs to be visible (to the current user) | READ / WRITE | |
- | priority | The priority of the work package | Priority | not null | READ / WRITE | |
- | project | The project to which the work package belongs | Project | not null | READ / WRITE | |
- | projectPhase | The project phase this work package is assigned to | ProjectPhase | | READ / WRITE | **Permission** view project phases. There has to be a project phase active in the project. |
- | responsible | The person that is responsible for the overall outcome | User | | READ / WRITE | |
- | relations | Relations this work package is involved in | Relation | | READ | **Permission** view work packages |
- | revisions | Revisions that are referencing the work package | Revision | | READ | **Permission** view changesets |
- | status | The current status of the work package | Status | not null | READ / WRITE | |
- | timeEntries | All time entries logged on the work package. Please note that this is a link to an HTML resource for now and as such, the link is subject to change. | N/A | | READ | **Permission** view time entries |
- | type | The type of the work package | Type | not null | READ / WRITE | |
- | version | The version associated to the work package | Version | | READ / WRITE | |
- | watchers | All users that are currently watching this work package | Collection | | READ | **Permission** view work package watchers |
+ | Link | Description | Type | Constraints | Supported operations | Condition |
+ | :--------------------: | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | ----------------------------------------- | --------------------- | ----------------------------------------- |
+ | self | This work package | WorkPackage | not null | READ | |
+ | schema | The schema of this work package | Schema | not null | READ | |
+ | ancestors | Array of all visible ancestors of the work package, with the root node being the first element | Collection | not null | READ | **Permission** view work packages |
+ | attachments | The files attached to this work package | Collection | not null | READ / WRITE | |
+ | author | The person that created the work package | User | not null | READ | |
+ | assignee | The person that is intended to work on the work package | User | | READ / WRITE | |
+ | availableWatchers | All users that can be added to the work package as watchers. | User | | READ | **Permission** add work package watchers |
+ | budget | The budget this work package is associated to | Budget | | READ / WRITE | **Permission** view cost objects |
+ | category | The category of the work package | Category | | READ / WRITE | |
+ | children | Array of all visible children of the work package | Collection | not null | READ | **Permission** view work packages |
+ | parent | Parent work package | WorkPackage | Needs to be visible (to the current user) | READ / WRITE | |
+ | priority | The priority of the work package | Priority | not null | READ / WRITE | |
+ | project | The project to which the work package belongs | Project | not null | READ / WRITE | |
+ | projectPhase | The project phase this work package is assigned to | ProjectPhase | | READ / WRITE | **Permission** view project phases. There has to be a project phase active in the project. |
+ | projectPhaseDefinition | The project phase definition for the project phase of this work package. | ProjectPhaseDefinition | | READ | **Permission** view project phases. The associated project phase has to be active. |
+ | responsible | The person that is responsible for the overall outcome | User | | READ / WRITE | |
+ | relations | Relations this work package is involved in | Relation | | READ | **Permission** view work packages |
+ | revisions | Revisions that are referencing the work package | Revision | | READ | **Permission** view changesets |
+ | status | The current status of the work package | Status | not null | READ / WRITE | |
+ | timeEntries | All time entries logged on the work package. Please note that this is a link to an HTML resource for now and as such, the link is subject to change. | N/A | | READ | **Permission** view time entries |
+ | type | The type of the work package | Type | not null | READ / WRITE | |
+ | version | The version associated to the work package | Version | | READ / WRITE | |
+ | watchers | All users that are currently watching this work package | Collection | | READ | **Permission** view work package watchers |
## Local Properties
diff --git a/docs/contributions-guide/contribution-documentation/documentation-process-internal-contributor/README.md b/docs/contributions-guide/contribution-documentation/documentation-process-internal-contributor/README.md
index 22dd699a6fd..e48b9425bad 100644
--- a/docs/contributions-guide/contribution-documentation/documentation-process-internal-contributor/README.md
+++ b/docs/contributions-guide/contribution-documentation/documentation-process-internal-contributor/README.md
@@ -31,19 +31,19 @@ In the modal window select the repository ""*opf/openproject*"". Also select a f
> **Important**: Before you make changes always update your local repository.
-1. Select the branch you want to work on, e.g. `release/13.0` in the main toolbar.
+1. Select the branch you want to work on, e.g. `release/16.0` in the main toolbar.
2. Click on the button **Fetch origin** in the main toolbar.

## Step 3: Create a new Git branch for your change
-1. Select the latest release branch e.g. `release/13.0` as the current branch.
+1. Select the latest release branch e.g. `release/16.0` as the current branch.

2. In the same drop down click on **New branch**.
-3. In the next modal window insert a branch name that describes your changes. Also select the branch you want to work on, e.g. `release/13.0`. The click the button **Create branch**.
+3. In the next modal window insert a branch name that describes your changes. Also select the branch you want to work on, e.g. `release/16.0`. The click the button **Create branch**.

@@ -71,11 +71,11 @@ At the moment your change is only available in your local repository. To make it
## Step 8: Create a pull request
-A pull request is a workflow to ask for a review from the OpenProject team. With a pull request you basically ask a team member to check your changes and to merge it to the branch you want your change to merged to, e.g. `release/13.0` . After you pushed your local changes to your own repository click the button **Create Pull Request**.
+A pull request is a workflow to ask for a review from the OpenProject team. With a pull request you basically ask a team member to check your changes and to merge it to the branch you want your change to merged to, e.g. `release/16.0` . After you pushed your local changes to your own repository click the button **Create Pull Request**.

-In the first dropdown select the base branch you want your work to be merged in e.g. `release/13.0`. In the second dropdown select the branch you created in step 3 which contains your changes.
+In the first dropdown select the base branch you want your work to be merged in e.g. `release/16.0`. In the second dropdown select the branch you created in step 3 which contains your changes.

@@ -99,4 +99,4 @@ In the field "*Reviewers*" select "*opf/doc-writers".*
* We always deploy the [main branch](https://github.com/opf/legal/tree/main) on our [website](https://www.openproject.org/legal/). This deployment needs to be manually triggered by the marketing team.
* If you want to make minor changes you don't need a review do this directly in the main branch without creating a new branch and new pull request.
-* If you need a review you need to create a new branch from the main branch. The branch `release/13.0` only exists in the repository opf/openproject (OpenProject software).
+* If you need a review you need to create a new branch from the main branch. The branch `release/16.0` only exists in the repository opf/openproject (OpenProject software).
diff --git a/docs/contributions-guide/contribution-documentation/documentation-process/README.md b/docs/contributions-guide/contribution-documentation/documentation-process/README.md
index 7cf34a737db..546ecdf2d0d 100644
--- a/docs/contributions-guide/contribution-documentation/documentation-process/README.md
+++ b/docs/contributions-guide/contribution-documentation/documentation-process/README.md
@@ -65,7 +65,7 @@ Open `https://github.com/[your-user]/openproject`. On the forked repository go t

-Select `release/12.3` as default branch and confirm with **Update**
+Select `release/16.0` as default branch and confirm with **Update**
*NOTE:* There will be an additional window. Press the button: **I understand, update the default branch.**
@@ -73,13 +73,13 @@ Select `release/12.3` as default branch and confirm with **Update**
## Step 8: Sync fork and Update branches (update local repository)
-Every time you start editing please make sure you have fetched the latest changes from GitHub.com. First you need to update your forked repository. There you select the branch you are working on, e.g. `release/12.3`. If there are updates in the main repository opf/openproject click on **Sync fork** and **Update branch**.
+Every time you start editing please make sure you have fetched the latest changes from GitHub.com. First you need to update your forked repository. There you select the branch you are working on, e.g. `release/16.0`. If there are updates in the main repository opf/openproject click on **Sync fork** and **Update branch**.

Now you have fetched the latest changes from the main repository and can go back to GitHub Desktop.
-Finally you have to press **"Pull origin"**. Afterwards your local repository is updated to the latest commits of eg. `opf/openproject/release/12.3`
+Finally you have to press **"Pull origin"**. Afterwards your local repository is updated to the latest commits of eg. `opf/openproject/release/16.0`

@@ -99,11 +99,11 @@ In the next screen select **To contribute to the parent project**.
## Step 10: Create a new Git branch for your change
-Select the latest release branch e.g. `release/12.3` as the current branch.
+Select the latest release branch e.g. `release/16.0` as the current branch.

-In the same drop down click on "New branch". In this window **insert a branch name that describes your changes** and **select the latest release branch** e.g. `release/12.3` the created branch is based on.
+In the same drop down click on "New branch". In this window **insert a branch name that describes your changes** and **select the latest release branch** e.g. `release/16.0` the created branch is based on.

@@ -179,7 +179,7 @@ In GitHub Desktop choose menu "Repository -> Repository settings". This will ope
### B) Fetch origin (in this case repository 'opf')
-In GitHub Desktop **at Current branch the old branch is visible [1]** . After you press **Fetch origin [2]** you will be able to **select the new branch at Current branch** (e.g. `origin/release/12.3`
+In GitHub Desktop **at Current branch the old branch is visible [1]** . After you press **Fetch origin [2]** you will be able to **select the new branch at Current branch** (e.g. `origin/release/16.0`

diff --git a/docs/development/packaging/README.md b/docs/development/packaging/README.md
index b3864e4429f..87a2971b4d4 100644
--- a/docs/development/packaging/README.md
+++ b/docs/development/packaging/README.md
@@ -15,8 +15,8 @@ This guide will provide some insights in how to develop and test integrations wi
The packager.io website observes changes in the repository through webhooks and will automatically triggers builds for these branches:
- `dev`: `https://packager.io/gh/opf/openproject`
-- `release/*` (e.g.,) `https://packager.io/gh/opf/openproject/refs/release/13.0`
-- `stable/*` (e.g.,) `https://packager.io/gh/opf/openproject/refs/stable/15`
+- `release/*` (e.g.,) `https://packager.io/gh/opf/openproject/refs/release/16.0`
+- `stable/*` (e.g.,) `https://packager.io/gh/opf/openproject/refs/stable/16`
- `packaging/*`
To see the status of a build, simply follow one of the links and choose a distribution whose logs you want to look at.
diff --git a/docs/installation-and-operations/configuration/README.md b/docs/installation-and-operations/configuration/README.md
index 33e1bedeabf..742b1453009 100644
--- a/docs/installation-and-operations/configuration/README.md
+++ b/docs/installation-and-operations/configuration/README.md
@@ -79,7 +79,7 @@ x-op-app: &app
- "${OPDATA:-opdata}:/var/openproject/assets"
# configuration cut off at this point.
-# Please use the file at https://github.com/opf/openproject-deploy/blob/stable/15/compose/docker-compose.yml
+# Please use the file at https://github.com/opf/openproject-docker-compose/blob/stable/16/docker-compose.yml
```
Alternatively, you can also use an env file for docker-compose like so:
@@ -114,7 +114,7 @@ x-op-app: &app
# ... more environment variables
# configuration cut off at this point.
-# Please use the file at https://github.com/opf/openproject-deploy/blob/stable/15/compose/docker-compose.yml
+# Please use the file at https://github.com/opf/openproject-docker-compose/blob/stable/16/docker-compose.yml
```
Let's say you have a `.env.prod` file with some production-specific configuration. Then, start the services with that special env file specified.
@@ -711,7 +711,7 @@ OPENPROJECT_SECURITY__BADGE__DISPLAYED="false"
`after_login_default_redirect_url`: Starting in OpenProject 15.4., users are redirected to the home page after logging in. To customize this behavior (e.g., redirecting them to the My page as before), you can override this with a path.
-Example:
+Example:
```shell
OPENPROJECT_AFTER__LOGIN__DEFAULT__REDIRECT__URL="/my/page"
diff --git a/docs/installation-and-operations/configuration/database/README.md b/docs/installation-and-operations/configuration/database/README.md
index fc8e72548cb..ce1cc42564c 100644
--- a/docs/installation-and-operations/configuration/database/README.md
+++ b/docs/installation-and-operations/configuration/database/README.md
@@ -28,7 +28,7 @@ point to an external database.
Example:
```shell
-docker run -d ... -e DATABASE_URL=postgres://user:pass@host:port/dbname openproject/openproject:15
+docker run -d ... -e DATABASE_URL=postgres://user:pass@host:port/dbname openproject/openproject:16
```
Best practice is using the file `docker-compose.override.yml`. If you run the Compose based docker stack, you can simply override the `DATABASE_URL` environment variable, and remove the `db` service from the `docker-compose.yml` file, but because by pulling a new version `docker-compose.yml` might get replaced. Then you can restart the stack with:
diff --git a/docs/installation-and-operations/installation/docker/README.md b/docs/installation-and-operations/installation/docker/README.md
index c3ce84115d4..f736877fbea 100644
--- a/docs/installation-and-operations/installation/docker/README.md
+++ b/docs/installation-and-operations/installation/docker/README.md
@@ -75,7 +75,7 @@ docker run -it -p 8080:80 \
-e OPENPROJECT_HOST__NAME=localhost:8080 \
-e OPENPROJECT_HTTPS=false \
-e OPENPROJECT_DEFAULT__LANGUAGE=en \
- openproject/openproject:15
+ openproject/openproject:16
```
Explanation of the used configuration values:
@@ -105,7 +105,7 @@ docker run -d -p 8080:80 \
-e OPENPROJECT_SECRET_KEY_BASE=secret \
-e OPENPROJECT_HOST__NAME=localhost:8080 \
-e OPENPROJECT_HTTPS=false \
- openproject/openproject:15
+ openproject/openproject:16
```
**Note**: We've had reports of people being unable to start OpenProject this way
@@ -137,7 +137,7 @@ docker run -d -p 8080:80 --name openproject \
-e OPENPROJECT_SECRET_KEY_BASE=secret \
-v /var/lib/openproject/pgdata:/var/openproject/pgdata \
-v /var/lib/openproject/assets:/var/openproject/assets \
- openproject/openproject:15
+ openproject/openproject:16
```
Please make sure you set the correct public facing hostname in `OPENPROJECT_HOST__NAME`. If you don't have a load-balancing or proxying web server in front of your docker container,
@@ -394,7 +394,7 @@ end
**3. Create the `Dockerfile`** in the same folder. The contents have to look like this:
```dockerfile
-FROM openproject/openproject:15
+FROM openproject/openproject:16
# If installing a local plugin (using `path:` in the `Gemfile.plugins` above),
# you will have to copy the plugin code into the container here and use the
@@ -418,7 +418,7 @@ All the Dockerfile does is copy your custom plugins gemfile into the image, inst
If you are using the `-slim` tag you will need to do the following to add your plugin.
```dockerfile
-FROM openproject/openproject:15 AS plugin
+FROM openproject/openproject:16 AS plugin
# If installing a local plugin (using `path:` in the `Gemfile.plugins` above),
# you will have to copy the plugin code into the container here and use the
@@ -433,7 +433,7 @@ COPY Gemfile.plugins /app/
RUN bundle config unset deployment && bundle install && bundle config set deployment 'true'
RUN ./docker/prod/setup/precompile-assets.sh
-FROM openproject/openproject:15-slim
+FROM openproject/openproject:16-slim
COPY --from=plugin /usr/bin/git /usr/bin/git
COPY --chown=$APP_USER:$APP_USER --from=plugin /app/vendor/bundle /app/vendor/bundle
@@ -457,7 +457,7 @@ The `-t` option is the tag for your image. You can choose what ever you want.
**5. Run the image**
You can run the image just like the normal OpenProject image (as shown [here](#quick-start)).
-You just have to use your chosen tag instead of `openproject/openproject:15`.
+You just have to use your chosen tag instead of `openproject/openproject:16`.
To just give it a quick try you can run this:
```shell
@@ -480,10 +480,10 @@ sudo docker run -it -p 8080:80 \
-e OPENPROJECT_DEFAULT__LANGUAGE=en \
--mount type=bind,source=$(pwd)/my_root.crt,target=/tmp/my_root.crt \ #mount my_root.crt to /tmp
-e SSL_CERT_FILE=/tmp/my_root.crt \ #set the SSL_CERT_FILE to the path of my_root.crt
- openproject/openproject:15
+ openproject/openproject:16
```
-The second way would be to build a new image of the ```openproject/openproject:15``` or the ```-slim``` image.
+The second way would be to build a new image of the ```openproject/openproject:16``` or the ```-slim``` image.
**1. Create a new folder** with any name, for instance `custom-openproject`. Change into that folder.
@@ -492,7 +492,7 @@ The second way would be to build a new image of the ```openproject/openproject:1
**3. Create the `Dockerfile`** in the same folder. The contents have to look like this:
```dockerfile
-FROM openproject/openproject:15
+FROM openproject/openproject:16
COPY ./my_root.crt /usr/local/share/ca-certificates/
RUN update-ca-certificates
@@ -501,7 +501,7 @@ RUN update-ca-certificates
If you are using the -slim tag, you will need to do the following to import your root certificate:
```dockerfile
-FROM openproject/openproject:15-slim
+FROM openproject/openproject:16-slim
USER root
COPY ./smtp.local_rootCA.crt /usr/local/share/ca-certificates/
@@ -519,7 +519,7 @@ The `-t` option is the tag for your image. You can choose what ever you want.
**5. Run the image**
-You can run the image just like the normal OpenProject image (as shown [here](#quick-start)). You just have to use your chosen tag instead of ```openproject/openproject:15```
+You can run the image just like the normal OpenProject image (as shown [here](#quick-start)). You just have to use your chosen tag instead of ```openproject/openproject:16```
## Offline/air-gapped installation
@@ -531,7 +531,7 @@ The installation works the same as described above. The only difference is that
On a system that has access to the internet run the following.
```shell
-docker pull openproject/openproject:15 && docker save openproject/openproject:15 | gzip > openproject-stable.tar.gz
+docker pull openproject/openproject:16 && docker save openproject/openproject:16 | gzip > openproject-stable.tar.gz
```
This creates a compressed archive containing the latest OpenProject docker image.
@@ -606,7 +606,7 @@ We will show both possibilities later in the configuration.
### 3) Create stack
-To create a stack you need a stack file. The easiest way is to just copy OpenProject's [docker-compose.yml](https://github.com/opf/openproject/blob/stable/12/docker-compose.yml). Just download it and save it as, say, `openproject-stack.yml`.
+To create a stack you need a stack file. The easiest way is to just copy OpenProject's [docker-compose.yml](https://github.com/opf/openproject/blob/stable/16/docker-compose.yml). Just download it and save it as, say, `openproject-stack.yml`.
#### Configuring storage
@@ -732,12 +732,12 @@ Once this has finished you should see something like this when running `docker s
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
kpdoc86ggema openproject_cache replicated 1/1 memcached:latest
-qrd8rx6ybg90 openproject_cron replicated 1/1 openproject/openproject:15
+qrd8rx6ybg90 openproject_cron replicated 1/1 openproject/openproject:16
cvgd4c4at61i openproject_db replicated 1/1 postgres:13
-uvtfnc9dnlbn openproject_proxy replicated 1/1 openproject/openproject:15 *:8080->80/tcp
-g8e3lannlpb8 openproject_seeder replicated 0/1 openproject/openproject:15
-canb3m7ilkjn openproject_web replicated 1/1 openproject/openproject:15
-7ovn0sbu8a7w openproject_worker replicated 1/1 openproject/openproject:15
+uvtfnc9dnlbn openproject_proxy replicated 1/1 openproject/openproject:16 *:8080->80/tcp
+g8e3lannlpb8 openproject_seeder replicated 0/1 openproject/openproject:16
+canb3m7ilkjn openproject_web replicated 1/1 openproject/openproject:16
+7ovn0sbu8a7w openproject_worker replicated 1/1 openproject/openproject:16
```
You can now access OpenProject under `http://0.0.0.0:8080`.
@@ -775,12 +775,12 @@ This will take a moment to converge. Once done you should see something like the
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
kpdoc86ggema openproject_cache replicated 1/1 memcached:latest
-qrd8rx6ybg90 openproject_cron replicated 1/1 openproject/openproject:15
+qrd8rx6ybg90 openproject_cron replicated 1/1 openproject/openproject:16
cvgd4c4at61i openproject_db replicated 1/1 postgres:10
-uvtfnc9dnlbn openproject_proxy replicated 2/2 openproject/openproject:15 *:8080->80/tcp
-g8e3lannlpb8 openproject_seeder replicated 0/1 openproject/openproject:15
-canb3m7ilkjn openproject_web replicated 6/6 openproject/openproject:15
-7ovn0sbu8a7w openproject_worker replicated 1/1 openproject/openproject:15
+uvtfnc9dnlbn openproject_proxy replicated 2/2 openproject/openproject:16 *:8080->80/tcp
+g8e3lannlpb8 openproject_seeder replicated 0/1 openproject/openproject:16
+canb3m7ilkjn openproject_web replicated 6/6 openproject/openproject:16
+7ovn0sbu8a7w openproject_worker replicated 1/1 openproject/openproject:16
```
Docker swarm handles the networking necessary to distribute the load among the nodes.
diff --git a/docs/installation-and-operations/installation/manual/README.md b/docs/installation-and-operations/installation/manual/README.md
index 1c1e7426203..673339c494a 100644
--- a/docs/installation-and-operations/installation/manual/README.md
+++ b/docs/installation-and-operations/installation/manual/README.md
@@ -159,7 +159,7 @@ with OpenProject. For more information, see [github.com/opf/openproject](https:/
```shell
[openproject@host] cd ~
-[openproject@host] git clone https://github.com/opf/openproject.git --branch stable/9 --depth 1
+[openproject@host] git clone https://github.com/opf/openproject.git --branch stable/16 --depth 1
[openproject@host] cd openproject
# Ensure rubygems is up-to-date for bundler 2
[openproject@host] gem update --system
diff --git a/docs/installation-and-operations/installation/packaged/README.md b/docs/installation-and-operations/installation/packaged/README.md
index 92038617b27..17a879d3fa6 100644
--- a/docs/installation-and-operations/installation/packaged/README.md
+++ b/docs/installation-and-operations/installation/packaged/README.md
@@ -69,7 +69,7 @@ Add the OpenProject package source:
```shell
sudo wget -O /etc/apt/sources.list.d/openproject.list \
- https://dl.packager.io/srv/opf/openproject/stable/15/installer/ubuntu/22.04.repo
+ https://dl.packager.io/srv/opf/openproject/stable/16/installer/ubuntu/22.04.repo
```
Download the OpenProject package:
@@ -102,7 +102,7 @@ Add the OpenProject package source:
```shell
sudo wget -O /etc/apt/sources.list.d/openproject.list \
- https://dl.packager.io/srv/opf/openproject/stable/15/installer/ubuntu/20.04.repo
+ https://dl.packager.io/srv/opf/openproject/stable/16/installer/ubuntu/20.04.repo
```
Download the OpenProject package:
@@ -136,7 +136,7 @@ Add the OpenProject package source:
```shell
wget -O /etc/apt/sources.list.d/openproject.list \
- https://dl.packager.io/srv/opf/openproject/stable/15/installer/debian/12.repo
+ https://dl.packager.io/srv/opf/openproject/stable/16/installer/debian/12.repo
```
Download the OpenProject package:
@@ -168,7 +168,7 @@ Add the OpenProject package source:
```shell
wget -O /etc/apt/sources.list.d/openproject.list \
- https://dl.packager.io/srv/opf/openproject/stable/15/installer/debian/11.repo
+ https://dl.packager.io/srv/opf/openproject/stable/16/installer/debian/11.repo
```
Download the OpenProject package:
@@ -188,7 +188,7 @@ Add the OpenProject package source:
```shell
sudo wget -O /etc/yum.repos.d/openproject.repo \
- https://dl.packager.io/srv/opf/openproject/stable/15/installer/el/9.repo
+ https://dl.packager.io/srv/opf/openproject/stable/16/installer/el/9.repo
```
If it is not already enabled, make sure to enable [Extra Packages for Enterprise Linux](https://fedoraproject.org/wiki/EPEL) (EPEL).
@@ -210,7 +210,7 @@ sudo yum install openproject
Then finish the installation by reading the [*Initial configuration*](#initial-configuration) section.
-> [!NOTE]
+> [!NOTE]
> On this distribution full-text extraction for attachments [*is not supported*](#full-text-extraction-not-supported) by default.
>
@@ -225,7 +225,7 @@ Add the OpenProject package source:
```shell
wget -O /etc/zypp/repos.d/openproject.repo \
- https://dl.packager.io/srv/opf/openproject/stable/15/installer/sles/15.repo
+ https://dl.packager.io/srv/opf/openproject/stable/16/installer/sles/15.repo
```
If you already had an old package source that is being updated you must refresh
@@ -266,7 +266,7 @@ sudo openproject reconfigure #interactive - manual choices are stored in /etc/op
sudo openproject configure #non-interactive - using values stored in /etc/openproject/installer.dat
```
-> [!NOTE]
+> [!NOTE]
> Every time you will run the OpenProject wizard, by using `sudo openproject reconfigure` your choices will be persisted in a configuration file at `/etc/openproject/installer.dat` and subsequent executions of `sudo openproject configure` will re-use these values, only showing you the wizard steps for options you have not yet been asked for.
> In the interactive way you can skip dialogs you do not want to change simply by confirming them with `ENTER`.
@@ -303,7 +303,7 @@ The dialog allows you to choose from three options:
Choose this option if you want OpenProject to set up and configure a local database server manually. This is the best choice if you are unfamiliar with administering databases, or do not have a separate PostgreSQL database server installed that you want to connect to.
-> [!NOTE]
+> [!NOTE]
> If you would like to use the database that was automatically installed by OpenProject at time of installation just choose `install` again
### Use an existing PostgreSQL database
@@ -336,7 +336,7 @@ The available options are:
We recommend that you let OpenProject install and configure the outer web server, in which case we will install an Apache2 web server with a VirtualHost listening to the domain name you specify, optionally providing SSL/TLS termination.
-> [!NOTE]
+> [!NOTE]
> In case you re-run `sudo openproject reconfigure` later it is mandatory to select `install` at the webserver again
In case you have selected to install Apache2, multiple dialogs will request the parameters for setting it up:
@@ -355,7 +355,7 @@ If you wish to install OpenProject under a server path prefix, such as `yourdoma
#### SSL/TLS configuration
-> [!NOTE]
+> [!NOTE]
> With OpenProject version 12.2 **HTTPS configuration** was set to be **default** for every installation. **Now best practice is to proceed by selecting `yes` for using HTTPS (SSL/TLS)** and generating the needed certificates, otherwise you will have to manually deactivate HTTPS on the command line.
OpenProject can configure Apache to support HTTPS (SSL/TLS). If you have SSL certificates and want to use SSL/TLS (recommended), select **Yes**.
@@ -372,7 +372,7 @@ Enabling this mode will result in OpenProject only responding to HTTPS requests,
#### External SSL/TLS termination
-> [!NOTE]
+> [!NOTE]
> If you terminate SSL externally before the request hits the OpenProject server, you need to follow the following instructions to avoid errors in routing. If you want to use SSL on the server running OpenProject, skip this section.
If you have a separate server that is terminating SSL and only forwarding/proxying to the OpenProject server, you must select "No" in this dialog. However, there are some parameters you need to put into your outer configuration.
@@ -388,29 +388,29 @@ If you have a separate server that is terminating SSL and only forwarding/proxyi
Here an example for external SSL/TLS termination with apache (httpd):
-> [!NOTE]
+> [!NOTE]
> There is [another example](../docker/#1-virtual-host-root) for external SSL/TLS termination for **docker-compose** installations
```shell
ServerName openproject.example.com
-
+
# Logging
LogLevel Warn
ErrorLog /var/log/httpd/openproject.example.com-error.log
CustomLog /var/log/httpd/openproject.example.com-access.log combined
-
+
# Reverse Proxy
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / http://[OPENPROJECT-HOST-IP]/
ProxyPassReverse / http://[OPENPROJECT-HOST-IP]/
- #ProxyPass / https://[OPENPROJECT-HOST-IP]/ # if openproject's internal apache2 server/ssl is YES
+ #ProxyPass / https://[OPENPROJECT-HOST-IP]/ # if openproject's internal apache2 server/ssl is YES
#ProxyPassReverse / https://[OPENPROJECT-HOST-IP]/ # if openproject's internal apache2 server/ssl is YES
-
+
# Request Header
RequestHeader set "X-Forwarded-Proto" https
-
+
# SSL Certificate that was created by LetsEncrypt
Include /etc/letsencrypt/options-ssl-apache.conf
SSLEngine On
@@ -423,7 +423,7 @@ Here an example for external SSL/TLS termination with apache (httpd):
### Skip Apache2 web server install (not recommended)
-> [!NOTE]
+> [!NOTE]
> Skipping step 3 Apache2 web server install will ask later in step 7 for information about the hostname and HTTPS
The installer will not set up an external web server for accessing. You will need to either install and set up a web server such as Apache2 or Nginx to function as the web server forwarding to our internal server listening at `localhost:6000` by proxying.
@@ -436,7 +436,7 @@ When installing with an existing Apache2, you can take a look at the source of o
[For a minimal nginx config, please see this gist](https://gist.github.com/seLain/375d16ccd4542e3727e97a7478187d3a) as as starting point.
-> [!IMPORTANT]
+> [!IMPORTANT]
> If you reconfigure the OpenProject application and switch to `skip`, you might run into errors with the Apache configuration file, as that will not be automatically remove. Please double-check you removed references to the `openproject.conf` if you do reconfigure.
## Step 4: SVN/Git integration server
@@ -461,7 +461,7 @@ OpenProject heavily relies on caching, which is why the wizard suggests you to i
## Step 7: Host name and Protocol (if step 3 was skipped)
-> [!NOTE]
+> [!NOTE]
> This step is only shown if you decided to skip step 3, the Apache2 installation. OpenProject still needs to know what external host name you're running on, as well as if you're using HTTPS or not.
First, enter the fully qualified domain where your OpenProject installation will be reached at. This will be used to generate full links from OpenProject, such as in emails.
@@ -474,7 +474,7 @@ Next, tell OpenProject whether you have SSL termination enabled somewhere in you
## Step 8: Default language
-> [!NOTE]
+> [!NOTE]
> This step is only shown on the very first installation of OpenProject, as it affects only the initial seeding of the basic and demo data. Changing this value after installation will have no effect.
OpenProject can be used with a wide variety of languages. The initial data of the instance (basic data such as status names, types, etc.) as well as data for demonstrational purposes will be created in the language you select in this screen. Move through the list using the arrow keys and select the default language.
diff --git a/docs/installation-and-operations/installation/synology/README.md b/docs/installation-and-operations/installation/synology/README.md
index e18d076722b..96f3a0e9b4b 100644
--- a/docs/installation-and-operations/installation/synology/README.md
+++ b/docs/installation-and-operations/installation/synology/README.md
@@ -12,7 +12,7 @@ This means OpenProject has to be used exactly as described in the [docker](../do
Launching OpenProject works like launching any other container in [Synology](https://www.synology.com/en-global/knowledgebase/DSM/help/Docker/docker_container).
First you have to go to the **Registry** section and download the OpenProject image.
-It's best to choose the specific tag of the latest stable version (`openproject/openproject:15` at the time of writing).
+It's best to choose the specific tag of the latest stable version (`openproject/openproject:16` at the time of writing).
You can use `:latest` too but it might lead to surprises when a major version upgrade happens.
Below are some settings you have to pay attention to when launching the container.
diff --git a/docs/installation-and-operations/misc/migration-to-postgresql13/README.md b/docs/installation-and-operations/misc/migration-to-postgresql13/README.md
index 278bfd69147..716a3ae50a3 100644
--- a/docs/installation-and-operations/misc/migration-to-postgresql13/README.md
+++ b/docs/installation-and-operations/misc/migration-to-postgresql13/README.md
@@ -36,7 +36,7 @@ sudo cat /var/lib/postgresql/10/main/PG_VERSION
For RedHat/CentOS:
```shell
-sudo cat /var/lib/pgsql/10/data/PG_VERSION
+sudo cat /var/lib/pgsql/10/data/PG_VERSION
10
```
@@ -163,7 +163,7 @@ sudo yum remove pgsql10
> Please follow this section only if you have installed OpenProject using [this procedure](../../installation/docker/).
> Before attempting the upgrade, please ensure you have performed a backup of your installation by following the [backup guide](../../operation/backing-up/).
-You can find the upgrade instructions for your docker-compose setup in the [openproject-deploy](https://github.com/opf/openproject-deploy/blob/stable/15/compose/control/README.md#upgrade) repository.
+You can find the upgrade instructions for your docker-compose setup in the [openproject-docker-compose](https://github.com/opf/openproject-docker-compose/blob/stable/16/control/README.md#upgrade) repository.
Remember that you need to have checked out that repository and work in the `compose` directory for the instructions to work.
@@ -188,20 +188,20 @@ Once the docker has stopped, you are ready to run the upgrade command. In this c
docker run --rm -it \
-v /var/lib/openproject/pgdata:/var/openproject/pgdata \
-v /var/lib/openproject/pgdata-next:/var/openproject/pgdata-next \
- openproject/openproject:15 root ./docker/prod/postgres-db-upgrade
+ openproject/openproject:16 root ./docker/prod/postgres-db-upgrade
```
If everything goes well, the process should end with a message as follows:
```text
-Upgrade Complete
-----------------
-Optimizer statistics are not transferred by pg_upgrade so,
+Upgrade Complete
+----------------
+Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
- ./analyze_new_cluster.sh
-
+ ./analyze_new_cluster.sh
+
Running this script will delete the old cluster's data files:
- ./delete_old_cluster.sh
+ ./delete_old_cluster.sh
```
You can then perform the following operation to switch the upgraded PostgreSQL with the older version:
@@ -217,7 +217,7 @@ docker run -d -p 8080:80 --name openproject -e SECRET_KEY_BASE=secret \
-v /var/lib/openproject/pgdata:/var/openproject/pgdata \
-v /var/lib/openproject/assets:/var/openproject/assets \
[...]
- openproject/openproject:15
+ openproject/openproject:16
If your new installation looks fine, you can then choose to remove `/var/lib/openproject/pgdata-prev`:
diff --git a/docs/installation-and-operations/misc/migration-to-postgresql17/README.md b/docs/installation-and-operations/misc/migration-to-postgresql17/README.md
index d64e2ab8249..498cc3da5b7 100644
--- a/docs/installation-and-operations/misc/migration-to-postgresql17/README.md
+++ b/docs/installation-and-operations/misc/migration-to-postgresql17/README.md
@@ -36,7 +36,7 @@ sudo cat /var/lib/postgresql/13/main/PG_VERSION
For RedHat/CentOS:
```shell
-sudo cat /var/lib/pgsql/13/data/PG_VERSION
+sudo cat /var/lib/pgsql/13/data/PG_VERSION
13
```
@@ -165,7 +165,7 @@ sudo yum remove pgsql13
> Please follow this section only if you have installed OpenProject using [this procedure](../../installation/docker/).
> Before attempting the upgrade, please ensure you have performed a backup of your installation by following the [backup guide](../../operation/backing-up/).
-You can find the upgrade instructions for your docker-compose setup in the [openproject-deploy](https://github.com/opf/openproject-deploy/blob/stable/16/README.md#upgrade) repository.
+You can find the upgrade instructions for your docker-compose setup in the [openproject-docker-compose](https://github.com/opf/openproject-docker-compose/blob/stable/16/control/README.md#upgrade) repository.
Remember that you need to have checked out that repository and work in the `compose` directory for the instructions to work.
@@ -190,20 +190,20 @@ Once the docker has stopped, you are ready to run the upgrade command. In this c
docker run --rm -it \
-v /var/lib/openproject/pgdata:/var/openproject/pgdata \
-v /var/lib/openproject/pgdata-next:/var/openproject/pgdata-next \
- openproject/openproject:15 root ./docker/prod/postgres-db-upgrade
+ openproject/openproject:16 root ./docker/prod/postgres-db-upgrade
```
If everything goes well, the process should end with a message as follows:
```text
-Upgrade Complete
-----------------
-Optimizer statistics are not transferred by pg_upgrade so,
+Upgrade Complete
+----------------
+Optimizer statistics are not transferred by pg_upgrade so,
once you start the new server, consider running:
- ./analyze_new_cluster.sh
-
+ ./analyze_new_cluster.sh
+
Running this script will delete the old cluster's data files:
- ./delete_old_cluster.sh
+ ./delete_old_cluster.sh
```
You can then perform the following operation to switch the upgraded PostgreSQL with the older version:
@@ -219,7 +219,7 @@ docker run -d -p 8080:80 --name openproject -e SECRET_KEY_BASE=secret \
-v /var/lib/openproject/pgdata:/var/openproject/pgdata \
-v /var/lib/openproject/assets:/var/openproject/assets \
[...]
- openproject/openproject:15
+ openproject/openproject:16
If your new installation looks fine, you can then choose to remove `/var/lib/openproject/pgdata-prev`:
@@ -282,7 +282,7 @@ psql -U postgres -h localhost -f /bitnami/postgresql/backup.sql
7. Verify the Upgrade by ensuring everything is working as expected by checking that the PostgreSQL instance is running correctly and the frontend is accessible.
8. Remove Backup Files:
-
+
Once verified, enter the shell of the PostgreSQL pod again and remove the backup files to clean up:
```shell
diff --git a/docs/installation-and-operations/operation/backing-up/README.md b/docs/installation-and-operations/operation/backing-up/README.md
index a17eed6e3a6..96e75c94755 100644
--- a/docs/installation-and-operations/operation/backing-up/README.md
+++ b/docs/installation-and-operations/operation/backing-up/README.md
@@ -62,7 +62,7 @@ sudo mkdir -p /var/lib/openproject/{pgdata,assets}
docker run -d -p 8080:80 --name openproject -e SECRET_KEY_BASE=secret \
-v /var/lib/openproject/pgdata:/var/openproject/pgdata \
-v /var/lib/openproject/assets:/var/openproject/assets \
- openproject/openproject:15
+ openproject/openproject:16
```
Then you would need to backup the `/var/lib/openproject` folder (for instance to S3 or FTP server).
diff --git a/docs/installation-and-operations/operation/faq/README.md b/docs/installation-and-operations/operation/faq/README.md
index b8e898ed224..b99eb223b10 100644
--- a/docs/installation-and-operations/operation/faq/README.md
+++ b/docs/installation-and-operations/operation/faq/README.md
@@ -44,12 +44,12 @@ Afterwards, you can navigate to your OpenProject instance and login with `admin`
## Do you provide different release channels?
-Yes! We release OpenProject in separate release channels that you can try out. For production environments, **always** use the `stable/MAJOR` (e.g., stable/9) package source that will receive stable and release updates. Every major upgrade will result in a source switch (from `stable/9` to `stable/10` for example).
+Yes! We release OpenProject in separate release channels that you can try out. For production environments, **always** use the `stable/MAJOR` (e.g., `stable/16`) package source that will receive stable and release updates. Every major upgrade will result in a source switch (from `stable/15` to `stable/16` for example).
A closer look at the available branches:
-* [stable/11](https://packager.io/gh/opf/openproject/refs/stable/10): Latest stable releases, starting with 11.0.0 until the last minor and patch releases of 11.X.Y are released, this will receive updates.
-* [release/11.0](https://packager.io/gh/opf/openproject/refs/release/10.0): Regular (usually daily) release builds for the current next patch release (or for the first release in this version, such as 11.0.0). This will contain early bugfixes before they are being release into stable. **Do not use in production**. But, for upgrading to the next major version, this can be regarded as a _release candidate channel_ that you can use to test your upgrade on a copy of your production environment.
+* [stable/16](https://packager.io/gh/opf/openproject/refs/stable/16): Latest stable releases, starting with 11.0.0 until the last minor and patch releases of 11.X.Y are released, this will receive updates.
+* [release/16.0](https://packager.io/gh/opf/openproject/refs/release/16.0): Regular (usually daily) release builds for the current next patch release (or for the first release in this version, such as 11.0.0). This will contain early bugfixes before they are being release into stable. **Do not use in production**. But, for upgrading to the next major version, this can be regarded as a _release candidate channel_ that you can use to test your upgrade on a copy of your production environment.
* [dev](https://packager.io/gh/opf/openproject/refs/dev): Daily builds of the current development build of OpenProject. While we try to keep this operable, this may result in broken code and/or migrations from time to time. Use when you're interested what the next release of OpenProject will look like. **Do not use in production!**
## How can I backup and restore my OpenProject installation?
diff --git a/docs/installation-and-operations/operation/restoring/README.md b/docs/installation-and-operations/operation/restoring/README.md
index 2efa0e20ee2..476d0030c2a 100644
--- a/docs/installation-and-operations/operation/restoring/README.md
+++ b/docs/installation-and-operations/operation/restoring/README.md
@@ -166,7 +166,7 @@ mkdir -p /var/lib/openproject/{pgdata,assets}
Next we need to initialize the database.
```shell
-docker run --rm -v /var/lib/openproject/pgdata:/var/openproject/pgdata -it openproject/openproject:15
+docker run --rm -v /var/lib/openproject/pgdata:/var/openproject/pgdata -it openproject/openproject:16
```
As soon as you see `Database setup finished.` in the container's output you can kill it by pressing Ctrl + C.
diff --git a/docs/installation-and-operations/operation/upgrading/README.md b/docs/installation-and-operations/operation/upgrading/README.md
index bfd3bdd1c91..b824bde93bf 100644
--- a/docs/installation-and-operations/operation/upgrading/README.md
+++ b/docs/installation-and-operations/operation/upgrading/README.md
@@ -39,14 +39,14 @@ sudo openproject configure
On Ubuntu 22.04., you might see warnings like these:
-> W: `https://dl.packager.io/srv/deb/opf/openproject/stable/15/ubuntu/dists/22.04/InRelease`: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
+> W: `https://dl.packager.io/srv/deb/opf/openproject/stable/16/ubuntu/dists/22.04/InRelease`: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
This message is due to Ubuntu 22.04 switching to a more secure way of adding repository sources, which is not yet supported by the repository provider. There is ongoing work on this item, the message is for information only.
If you get an error like the following:
-> E: Repository '`https://dl.packager.io/srv/deb/opf/openproject/stable/15/ubuntu` 22.04 InRelease' changed its 'Origin' value from '' to '`https://packager.io/gh/opf/openproject`'
-> E: Repository '`https://dl.packager.io/srv/deb/opf/openproject/stable/15/ubuntu` 22.04 InRelease' changed its 'Label' value from '' to 'Ubuntu 22.04 packages for opf/openproject'
+> E: Repository '`https://dl.packager.io/srv/deb/opf/openproject/stable/16/ubuntu` 22.04 InRelease' changed its 'Origin' value from '' to '`https://packager.io/gh/opf/openproject`'
+> E: Repository '`https://dl.packager.io/srv/deb/opf/openproject/stable/16/ubuntu` 22.04 InRelease' changed its 'Label' value from '' to 'Ubuntu 22.04 packages for opf/openproject'
These two messages messages are expected, due to a change in Origin and Label repository metadata, to better explain what the repository is about. You should allow the change, and/or run `sudo apt-get update --allow-releaseinfo-change` for the update to go through.
@@ -119,7 +119,7 @@ When using the all-in-one docker container, you need to perform the following st
```shell
docker pull openproject/openproject:VERSION
-# e.g. docker pull openproject/openproject:15
+# e.g. docker pull openproject/openproject:16
```
Then stop and remove your existing container (we assume that you are running with the recommended production setup here):
@@ -171,7 +171,7 @@ If you are using Docker, you should mount your OpenProject volume at `/var/openp
## Upgrade notes from 9.x to 10.4.x
-When upgrading from OpenProject <= 10.4.x to a newer version, you might need to remove the old cron jobs from ```/etc/cron.d/```.
+When upgrading from OpenProject <= 10.4.x to a newer version, you might need to remove the old cron jobs from ```/etc/cron.d/```.
You can list all OpenProject related cronjobs by using the ```sudo ls /etc/cron.d/openproject-*``` command.
## Upgrade notes for 8.x to 9.x
diff --git a/docs/release-notes/16-0-1/README.md b/docs/release-notes/16-0-1/README.md
new file mode 100644
index 00000000000..9a56bc12bc3
--- /dev/null
+++ b/docs/release-notes/16-0-1/README.md
@@ -0,0 +1,38 @@
+---
+title: OpenProject 16.0.1
+sidebar_navigation:
+ title: 16.0.1
+release_version: 16.0.1
+release_date: 2025-06-05
+---
+
+# OpenProject 16.0.1
+
+Release date: 2025-06-05
+
+We released OpenProject [OpenProject 16.0.1](https://community.openproject.org/versions/2200).
+The release contains several bug fixes and we recommend updating to the newest version.
+In these Release Notes, we will give an overview of important feature changes.
+At the end, you will find a complete list of all changes and bug fixes.
+
+
+
+## Bug fixes and changes
+
+
+
+
+- Feature: Add internal:boolean property to activity comments (read) API \[[#62130](https://community.openproject.org/wp/62130)\]
+- Bugfix: Some dates and scheduling mode are lost when creating project from template \[[#62426](https://community.openproject.org/wp/62426)\]
+- Bugfix: Edge case when creating a section for an empty non-blankslate meeting \[[#63422](https://community.openproject.org/wp/63422)\]
+- Bugfix: Error when dragging a work package to its children in work packages list \[[#63499](https://community.openproject.org/wp/63499)\]
+- Bugfix: Creation of sub-items in hierarchy custom field not possible (error 500) \[[#63855](https://community.openproject.org/wp/63855)\]
+- Bugfix: Missing/wrong error handling for periodic activity tab updates \[[#64073](https://community.openproject.org/wp/64073)\]
+- Bugfix: Polling meeting updates can cause Browser's Basic auth pop-up \[[#64088](https://community.openproject.org/wp/64088)\]
+- Bugfix: Polling work package activity updates can cause Browser's Basic auth pop-up \[[#64091](https://community.openproject.org/wp/64091)\]
+- Bugfix: NoMethodError on PATCH::API::V3::WorkPackages::WorkPackagesAPI#/work\_packages/:id/ \[[#64133](https://community.openproject.org/wp/64133)\]
+- Bugfix: Database migration 20240405131352\_create\_meeting\_sections fails on Update \[[#64298](https://community.openproject.org/wp/64298)\]
+- Bugfix: Internal comments can be added without a valid token in some cases \[[#64324](https://community.openproject.org/wp/64324)\]
+
+
+
diff --git a/docs/release-notes/16-1-0/README.md b/docs/release-notes/16-1-0/README.md
new file mode 100644
index 00000000000..d2540d3a971
--- /dev/null
+++ b/docs/release-notes/16-1-0/README.md
@@ -0,0 +1,113 @@
+---
+title: OpenProject 16.1.0
+sidebar_navigation:
+ title: 16.1.0
+release_version: 16.1.0
+release_date: 2025-06-05
+---
+
+# OpenProject 16.1.0
+
+Release date: 2025-06-05
+
+We released OpenProject [OpenProject 16.1.0](https://community.openproject.org/versions/2194).
+The release contains several bug fixes and we recommend updating to the newest version.
+In these Release Notes, we will give an overview of important feature changes.
+At the end, you will find a complete list of all changes and bug fixes.
+
+## Important feature changes
+
+
+
+## Important updates and breaking changes
+
+
+
+
+
+## Bug fixes and changes
+
+
+
+
+- Feature: Extend API V3 to cover Emoji reactions on work package comments (read, toggle) and extend documentation \[[#57265](https://community.openproject.org/wp/57265)\]
+- Feature: Allow users to enter negative lag \[[#58011](https://community.openproject.org/wp/58011)\]
+- Feature: Fixed set of project stages and gates editable on project overview page \[[#58159](https://community.openproject.org/wp/58159)\]
+- Feature: Project stage columns on project list \[[#58160](https://community.openproject.org/wp/58160)\]
+- Feature: Global stage administration \[[#58161](https://community.openproject.org/wp/58161)\]
+- Feature: Phases as work package attribute \[[#58162](https://community.openproject.org/wp/58162)\]
+- Feature: Project specific stage administration \[[#58163](https://community.openproject.org/wp/58163)\]
+- Feature: Journalize changes to phases and gates \[[#59178](https://community.openproject.org/wp/59178)\]
+- Feature: Option to copy phase on copying a project \[[#59179](https://community.openproject.org/wp/59179)\]
+- Feature: Automatic scheduling for phases and phase gates \[[#59180](https://community.openproject.org/wp/59180)\]
+- Feature: Filters for phases and phase gates in project list \[[#59183](https://community.openproject.org/wp/59183)\]
+- Feature: Order by phases and phase gates on project list \[[#59184](https://community.openproject.org/wp/59184)\]
+- Feature: Extend Reminders API V3 to include create, update & delete operations \[[#59473](https://community.openproject.org/wp/59473)\]
+- Feature: Optimize lifecycle modal UX \[[#60330](https://community.openproject.org/wp/60330)\]
+- Feature: Document and implement proper mobile behaviour for Sub Header component (OP Primer) \[[#60332](https://community.openproject.org/wp/60332)\]
+- Feature: Reminders: Offer quick-set options like 'tomorrow' or 'next week' with smart defaults \[[#60357](https://community.openproject.org/wp/60357)\]
+- Feature: PDF export of meetings \[[#60730](https://community.openproject.org/wp/60730)\]
+- Feature: Date picker to edit phases and phase gates of a project lifecycle \[[#61610](https://community.openproject.org/wp/61610)\]
+- Feature: Turn gates into property of phase (rename lifecycle elements to "Phase" and "Phase gates") \[[#61952](https://community.openproject.org/wp/61952)\]
+- Feature: Add hovercard to gates \[[#62608](https://community.openproject.org/wp/62608)\]
+- Feature: TreeView Primer View Component \[[#62667](https://community.openproject.org/wp/62667)\]
+- Feature: Implementing ARIA live regions to communicate contextual changes \[[#62708](https://community.openproject.org/wp/62708)\]
+- Feature: Show a TreeView on the page of hierachy customFields \[[#62993](https://community.openproject.org/wp/62993)\]
+- Feature: Show attribute help texts in Primerized Project Settings > Information form \[[#63737](https://community.openproject.org/wp/63737)\]
+- Feature: Primerize attribute help texts \[[#63738](https://community.openproject.org/wp/63738)\]
+- Feature: Re-order and re-structure the 'More' action menu for sections and agenda items \[[#64074](https://community.openproject.org/wp/64074)\]
+- Feature: Configure scopes to be used during Token Exchange \[[#64121](https://community.openproject.org/wp/64121)\]
+- Feature: \[TreeView\] Allow nodes to be anchors or buttons \[[#64132](https://community.openproject.org/wp/64132)\]
+- Feature: Add work package internal comments (write) API \[[#64166](https://community.openproject.org/wp/64166)\]
+- Feature: \[TreeView\] Bubble the expanded state from children to parents \[[#64215](https://community.openproject.org/wp/64215)\]
+- Feature: Change icon for the "remove child" function on an embedded table \[[#64305](https://community.openproject.org/wp/64305)\]
+- Bugfix: Project search is under the Search icon in New Recurring Meeting modal \[[#59945](https://community.openproject.org/wp/59945)\]
+- Bugfix: User can't save lifecycle modal if project is invalid \[[#60666](https://community.openproject.org/wp/60666)\]
+- Bugfix: Autocompleter should not get autofocus by default \[[#61534](https://community.openproject.org/wp/61534)\]
+- Bugfix: Activity Tab renders the same turbo frame multiple times inside of itself \[[#61544](https://community.openproject.org/wp/61544)\]
+- Bugfix: Pattern input dropdown does not overlay background \[[#61937](https://community.openproject.org/wp/61937)\]
+- Bugfix: The 'overdue' date colour does not adapt well to dark mode (fixed hex/odd colour variable) \[[#62199](https://community.openproject.org/wp/62199)\]
+- Bugfix: Work package datepicker incorrectly renders turbo frame response \[[#62523](https://community.openproject.org/wp/62523)\]
+- Bugfix: Seeder fails during upgrade with ArgumentError: Nothing registered with reference :default\_role\_project\_admin (ArgumentError) \[[#62582](https://community.openproject.org/wp/62582)\]
+- Bugfix: Version from the shared work package not available in Version filter on global wp page \[[#62610](https://community.openproject.org/wp/62610)\]
+- Bugfix: (Regression) Error on Save (in various places) \[[#62627](https://community.openproject.org/wp/62627)\]
+- Bugfix: Project phase filters are not ordered alphabetically as other filters \[[#63106](https://community.openproject.org/wp/63106)\]
+- Bugfix: "This week" filter is not working correctly \[[#63109](https://community.openproject.org/wp/63109)\]
+- Bugfix: Reminders: saving without entering a date or time throws an error but also unnecessarily clears the other field \[[#63461](https://community.openproject.org/wp/63461)\]
+- Bugfix: Duplicate work package comments when submitting via ctlr/cmd + enter \[[#63556](https://community.openproject.org/wp/63556)\]
+- Bugfix: Project identifier cannot be updated if a required project attribute is created \[[#63668](https://community.openproject.org/wp/63668)\]
+- Bugfix: Breadcrumb index creates unnecessary navigation buttons on mobile web \[[#63777](https://community.openproject.org/wp/63777)\]
+- Bugfix: ArgumentError in seeder \[[#63826](https://community.openproject.org/wp/63826)\]
+- Bugfix: Projects tab displayed for custom fields of type user, group, spent time and version \[[#63900](https://community.openproject.org/wp/63900)\]
+- Bugfix: Next SSO Enterprise Banner has no image \[[#64087](https://community.openproject.org/wp/64087)\]
+- Bugfix: Back arrow cannot be reached via keyboard \[[#64222](https://community.openproject.org/wp/64222)\]
+- Bugfix: Project overview page renders an h2 inside an h3 \[[#64226](https://community.openproject.org/wp/64226)\]
+- Bugfix: \[Accessibility\] Editable toolbar header is not recognized as headline by screenreaders \[[#64227](https://community.openproject.org/wp/64227)\]
+- Bugfix: Home screen widgets have the wrong headline tag \[[#64228](https://community.openproject.org/wp/64228)\]
+- Bugfix: \[Accessibility\] Provide alternative link texts for pagination links \[[#64235](https://community.openproject.org/wp/64235)\]
+- Bugfix: Focus issues with WP primary button \[[#64236](https://community.openproject.org/wp/64236)\]
+- Bugfix: Flickering Life Cycle Definition specs \[[#64253](https://community.openproject.org/wp/64253)\]
+- Bugfix: Access tokens of disabled OAuth applications are accepted by API \[[#64258](https://community.openproject.org/wp/64258)\]
+- Bugfix: Automatic subject pattern is editable after enterprise token got invalid \[[#64290](https://community.openproject.org/wp/64290)\]
+- Bugfix: Disabling an incomplete phase leads to inconsistencies \[[#64292](https://community.openproject.org/wp/64292)\]
+- Bugfix: Input fields suggest previously entered text \[[#64312](https://community.openproject.org/wp/64312)\]
+- Bugfix: The time in the pdf export is different from the time in the file name \[[#64337](https://community.openproject.org/wp/64337)\]
+- Bugfix: Checkbox label not clickable in 2FA settings \[[#64367](https://community.openproject.org/wp/64367)\]
+- Bugfix: Work packages "default" priority is lost when deleted. \[[#64369](https://community.openproject.org/wp/64369)\]
+- Bugfix: Attribute help text page is missing a page title \[[#64417](https://community.openproject.org/wp/64417)\]
+- Bugfix: The second phase's start date selection is not enabled \[[#64496](https://community.openproject.org/wp/64496)\]
+- Feature: Add API for recent Communicator features (Emoji, Reminders, Comments with restricted visibility) \[[#62507](https://community.openproject.org/wp/62507)\]
+
+
+
+
+## Contributions
+A very special thank you goes to our sponsors for this release.
+Also a big thanks to our Community members for reporting bugs and helping us identify and provide fixes.
+Special thanks for reporting and finding bugs go to Cameron Dutro, Maxim Béliveau.
+
+Last but not least, we are very grateful for our very engaged translation contributors on Crowdin, who translated quite a few OpenProject strings!
+Would you like to help out with translations yourself?
+Then take a look at our translation guide and find out exactly how you can contribute.
+It is very much appreciated!
+
diff --git a/docs/release-notes/README.md b/docs/release-notes/README.md
index 7d58ec92a7a..eb954ff2f9f 100644
--- a/docs/release-notes/README.md
+++ b/docs/release-notes/README.md
@@ -13,6 +13,13 @@ Stay up to date and get an overview of the new features included in the releases
+## 16.0.1
+
+Release date: 2025-06-05
+
+[Release Notes](16-0-1/)
+
+
## 16.0.0
Release date: 2025-05-21
diff --git a/docs/security-and-privacy/processing-of-personal-data/README.md b/docs/security-and-privacy/processing-of-personal-data/README.md
index 0b35434299d..b43398b4f92 100644
--- a/docs/security-and-privacy/processing-of-personal-data/README.md
+++ b/docs/security-and-privacy/processing-of-personal-data/README.md
@@ -230,7 +230,7 @@ flowchart TD
A1[Native client] -->|"HTTP(s) requests"| loadbalancer
A2[SVN or Git client] -->|"HTTP(s) requests"| loadbalancer
loadbalancer -->|Proxy| openproject
-
+
subgraph openproject[OpenProject Core Application]
openprojectrailsapp[Rails application]
C[Puma app server]
@@ -247,7 +247,7 @@ flowchart TD
gil["GitLab (gil)"]
cal["Calendar (cal)"]
O["API integrations (api)"]
-
+
end
subgraph services[Internal Services]
@@ -262,21 +262,17 @@ end
openproject <--> services
openproject --> integrations
loadbalancer <--> integrations
-
+
subgraph localclients[Local Client / User device]
direction TB
browser
A1
A2
-
-
-
-
+
+
+
+
end
-
-
-
-
```
As a web application, the primary data flow is between the user's web browser (or attached API clients) through an external proxying web server (this might be a load balancer or proxying server). Depending on the individual setup the proxying server is responsible for terminating TLS connections for the course of this document - although encrypted connections between Load balancer and Puma server are possible. In case of packaged or Kubernetes installations, this proxying server might be part of the OpenProject stack (e.g., an Apache2 packaged installation server or nginx ingress).
@@ -313,34 +309,33 @@ flowchart LR
Browser <-->|idp-01| IDP
IDP <-->|idp-02| openproject[OpenProject]
Browser <-->|idp-03| openproject
-
+
subgraph IDP[Identity Provider]
direction LR
ssoprovider[SSO provider]
LDAP
-
+
end
-
+
subgraph openproject["Relying Party (OpenProject) "]
direction LR
ssoclient[SSO client]
ldapauthentication[LDAP authentication]
ldapgroupsync[LDAP group sync]
-
+
end
subgraph localclients[Local clients]
direction LR
Browser
- end
-
+ end
```
#### Purpose
* Centralized identity and access management
* Single sign on and single sign out ([OIDC](../../system-admin-guide/authentication/openid-providers/), [SAML](../../system-admin-guide/authentication/saml/))
-* [Syncing LDAP groups with OpenProject groups](../../system-admin-guide/authentication/ldap-connections/ldap-group-synchronization/)
+* [Syncing LDAP groups with OpenProject groups](../../system-admin-guide/authentication/ldap-connections/ldap-group-synchronization/)
#### Processed data
@@ -367,16 +362,16 @@ flowchart LR
B <-->|eml-02| C[Email gateway]
C <-->|eml-03| D[Email notification service]
-
+
subgraph localclients[Local clients]
direction TB
A
end
-
+
subgraph internal[Internal services]
direction TB
C
-
+
end
subgraph external[External services]
@@ -384,15 +379,11 @@ flowchart LR
A
B
end
-
+
subgraph OpenProject
direction TB
D
end
-
-
-
-
```
#### Purpose
@@ -429,9 +420,9 @@ flowchart LR
%%{init: {'theme':'neutral'}}%%
flowchart LR
opicalapi[OpenProject's iCal API] --> |cal-01|B
- B[Calendar web application] -->|cal-03| localcalendarapp[Local calendar application]
+ B[Calendar web application] -->|cal-03| localcalendarapp[Local calendar application]
opicalapi -->|cal-02| localcalendarapp
-
+
subgraph localclient[Local clients]
direction TB
localcalendarapp
@@ -442,10 +433,10 @@ flowchart LR
direction TB
B
end
-
+
subgraph OpenProject
direction TB
- projectcalendar[Project calendar] --> opicalapi
+ projectcalendar[Project calendar] --> opicalapi
end
```
@@ -478,14 +469,14 @@ flowchart LR
Browser <-->|nex-02| nextcloud
nextclouddesktopclient[Nextcloud desktop client] <-->|nex-03| nextcloudapi
appopenprojectintegration <-->|nex-04| openprojectapi
-
+
subgraph local[Local clients]
Browser
nextclouddesktopclient
end
subgraph openproject[OpenProject]
-
+
opnextcloudintegrattion[Nextcloud integration]
openprojectapi[API]
end
@@ -494,8 +485,7 @@ subgraph openproject[OpenProject]
groupfolder[Group folder app]
appopenprojectintegration[OpenProject integration app]
nextcloudapi[API]
- end
-
+ end
```
#### Purpose
@@ -527,14 +517,14 @@ flowchart LR
Browser <-->|osh-02| onedrive
onedrivedesktopclient[Nextcloud desktop client] <-->|osh-03| onedriveapi
appopenprojectintegration <-->|osh-04| openprojectapi
-
+
subgraph local[Local clients]
Browser
onedrivedesktopclient[OneDrive desktop client]
end
subgraph openproject[OpenProject]
-
+
oponedrivetegration[OneDrive/SharePoint integration]
openprojectapi[API]
end
@@ -542,8 +532,7 @@ subgraph openproject[OpenProject]
subgraph onedrive[OneDrive/SharePoint]
appopenprojectintegration[OpenProject integration app]
onedriveapi[API]
- end
-
+ end
```
#### Purpose
@@ -580,7 +569,7 @@ flowchart LR
githubwebhooks[Webhooks]
end
-
+
subgraph localclients[Local clients]
direction TB
gitclient[Git client]
@@ -590,8 +579,6 @@ flowchart LR
direction TB
opgithubintegration[Github integration] --- workpackagesmodule[Work packages module]
end
-
-
```
#### Purpose
@@ -627,7 +614,7 @@ flowchart LR
gitlabwebhooks[Webhooks]
end
-
+
subgraph localclients[Local clients]
direction TB
gitclient[Git client]
@@ -637,8 +624,6 @@ flowchart LR
direction TB
opgitlabintegration[GitLab integration] --- workpackagesmodule[Work packages module]
end
-
-
```
#### Purpose
@@ -666,7 +651,7 @@ flowchart LR
%%{init: {'theme':'neutral'}}%%
flowchart LR
api <-->|api-01| apiintegration[API integration]
-
+
subgraph externalintegreations[External integrations]
direction TB
apiintegration
@@ -698,9 +683,9 @@ OpenProject makes use of technical cookies to identity the browser client and/or
| **Cookie name** | **Description** | **Expiry** | **Security flags** | **Implementation** |
| ---------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | ----------------------------------------------------- | ------------------------------------------------------------ |
-| `_open_project_session` (name is configurable) | contains the information about the logged in user as well as information stored between requests on the user's choices (e.g. the filters for costs are in part stored there) | Session + configurable server-sideTTL | secure httponly Samesite=Lax encrypted | [Code ref](https://github.com/opf/openproject/blob/release/13.0/config/initializers/session_store.rb#L34-L39) |
-| `autologin` (name is configurable) | (Optional feature, requires opt-in under Administration > Authentication settings) enables the user to automatically log in again after the session expired (e.g. because the browser was closed). It is set when the user checks the '*Stay logged in*' box in the login form. | Cookie 1 year + server-side token N days (configurable) | secure httponly Samesite=Lax encrypted | [Code ref](https://github.com/opf/openproject/blob/release/13.0/app/controllers/concerns/accounts/user_login.rb#L19C1-L29) |
-| `op2fa_remember_token` | the presence of that cookie suppresses the need for the user to provide a second factor upon login for N days (configurable by administration) if the user selects to do so when entering the 2fa information. | N days (configurable) | secure httponly Samesite=Lax encrypted | [Code ref](https://github.com/opf/openproject/blob/release/13.0/modules/two_factor_authentication/app/controllers/concerns/two_factor_authentication/remember_token.rb#L28-L34) |
+| `_open_project_session` (name is configurable) | contains the information about the logged in user as well as information stored between requests on the user's choices (e.g. the filters for costs are in part stored there) | Session + configurable server-sideTTL | secure httponly Samesite=Lax encrypted | [Code ref](https://github.com/opf/openproject/blob/release/16.0/config/initializers/session_store.rb#L34-L39) |
+| `autologin` (name is configurable) | (Optional feature, requires opt-in under Administration > Authentication settings) enables the user to automatically log in again after the session expired (e.g. because the browser was closed). It is set when the user checks the '*Stay logged in*' box in the login form. | Cookie 1 year + server-side token N days (configurable) | secure httponly Samesite=Lax encrypted | [Code ref](https://github.com/opf/openproject/blob/release/16.0/app/services/users/login_service.rb#L58-L74) |
+| `op2fa_remember_token` | the presence of that cookie suppresses the need for the user to provide a second factor upon login for N days (configurable by administration) if the user selects to do so when entering the 2fa information. | N days (configurable) | secure httponly Samesite=Lax encrypted | [Code ref](https://github.com/opf/openproject/blob/release/16.0/modules/two_factor_authentication/app/controllers/concerns/two_factor_authentication/remember_token.rb#L28-L33) |
## Deletion of personal data
diff --git a/docs/system-admin-guide/custom-fields/README.md b/docs/system-admin-guide/custom-fields/README.md
index 8e81b4e5445..8619ac52767 100644
--- a/docs/system-admin-guide/custom-fields/README.md
+++ b/docs/system-admin-guide/custom-fields/README.md
@@ -75,7 +75,7 @@ You can edit the name and initial settings under the *Details* tab.

-Under the *Items* tab you can specify which hierarchy items should be selectable for this specific custom field. Initially the list of items will be empty.To add items, click the **+Item** button.
+Under the *Items* tab you can specify which hierarchy items should be selectable for this specific custom field. Initially the list of items will be empty. To add items, click the **+Item** button.

@@ -83,17 +83,21 @@ You can then specify labels and short names for each of the items you want to ad

-All items you add here will constitute one hierarchical level. You can add further levels to each of the items. Here you can edit the items, change the position in the list or delete the items. To do that click the icon with the three dots on the far right and select the respective option. You can also re-arrange the items by dragging and dropping.
+All items you add here will constitute one hierarchical level. Once added, all items will be displayed in the hierarchy tree on the left side for easier navigation.
+
+You can add further levels to each of the items. Here you can edit the items, change the position in the list or delete the items. To do that click the icon with the three dots on the far right and select the respective option. You can also re-arrange the items by dragging and dropping.

-You can add further hierarchical levels by clicking on the name of the item and adding the items same way you did on the first level. Once you do that, the number of sub-items will be displayed on the higher hierarchy level.
+You can add further hierarchical levels by clicking on the name of the item and adding the items same way you did on the first level.

+Once you have added sub-items, the number of nested items will appear next to the name of the parent item. In the hierarchy tree on the left, an **arrow icon** will be shown next to any item that contains sub-items. By default, these sub-menus are collapsed. Clicking the arrow icon will expand the view to show all associated sub-items.
+

-You can add as many sub-times and hierarchy levels as you need. You can always navigate to the level you need by clicking the respective option from the hierarchy path displayed above the items.
+You can add as many sub-times and hierarchy levels as you need. You can always navigate to the level you need by clicking the respective option from the hierarchy tree on the left or in the path displayed above the items.

diff --git a/docs/system-admin-guide/custom-fields/openproject_system_guide_custom_field_new_hierarchy_subitems.png b/docs/system-admin-guide/custom-fields/openproject_system_guide_custom_field_new_hierarchy_subitems.png
index 311f42237f5..8fb64dcc2b1 100644
Binary files a/docs/system-admin-guide/custom-fields/openproject_system_guide_custom_field_new_hierarchy_subitems.png and b/docs/system-admin-guide/custom-fields/openproject_system_guide_custom_field_new_hierarchy_subitems.png differ
diff --git a/docs/system-admin-guide/custom-fields/openproject_system_guide_hierarchy_field_add_further_levels.png b/docs/system-admin-guide/custom-fields/openproject_system_guide_hierarchy_field_add_further_levels.png
index b279c36c839..26bfe9a7fbc 100644
Binary files a/docs/system-admin-guide/custom-fields/openproject_system_guide_hierarchy_field_add_further_levels.png and b/docs/system-admin-guide/custom-fields/openproject_system_guide_hierarchy_field_add_further_levels.png differ
diff --git a/docs/system-admin-guide/custom-fields/openproject_system_guide_hierarchy_field_add_item_button.png b/docs/system-admin-guide/custom-fields/openproject_system_guide_hierarchy_field_add_item_button.png
index a048475f7ac..9e4728ed214 100644
Binary files a/docs/system-admin-guide/custom-fields/openproject_system_guide_hierarchy_field_add_item_button.png and b/docs/system-admin-guide/custom-fields/openproject_system_guide_hierarchy_field_add_item_button.png differ
diff --git a/docs/system-admin-guide/custom-fields/openproject_system_guide_hierarchy_field_add_item_form.png b/docs/system-admin-guide/custom-fields/openproject_system_guide_hierarchy_field_add_item_form.png
index 2d7cdc43de7..20abc629a28 100644
Binary files a/docs/system-admin-guide/custom-fields/openproject_system_guide_hierarchy_field_add_item_form.png and b/docs/system-admin-guide/custom-fields/openproject_system_guide_hierarchy_field_add_item_form.png differ
diff --git a/docs/system-admin-guide/custom-fields/openproject_system_guide_hierarchy_field_edit_items.png b/docs/system-admin-guide/custom-fields/openproject_system_guide_hierarchy_field_edit_items.png
index 9be54a073e4..66ce691714e 100644
Binary files a/docs/system-admin-guide/custom-fields/openproject_system_guide_hierarchy_field_edit_items.png and b/docs/system-admin-guide/custom-fields/openproject_system_guide_hierarchy_field_edit_items.png differ
diff --git a/docs/system-admin-guide/custom-fields/openproject_system_guide_new_custom_field_path.png b/docs/system-admin-guide/custom-fields/openproject_system_guide_new_custom_field_path.png
index 9d1833eab70..8a5b6c35e9b 100644
Binary files a/docs/system-admin-guide/custom-fields/openproject_system_guide_new_custom_field_path.png and b/docs/system-admin-guide/custom-fields/openproject_system_guide_new_custom_field_path.png differ
diff --git a/docs/system-admin-guide/integrations/nextcloud/README.md b/docs/system-admin-guide/integrations/nextcloud/README.md
index f014d3338a1..420c8489ba9 100644
--- a/docs/system-admin-guide/integrations/nextcloud/README.md
+++ b/docs/system-admin-guide/integrations/nextcloud/README.md
@@ -12,8 +12,8 @@ keywords: Nextcloud file storage integration
> [!IMPORTANT]
>
-> The integration between OpenProject and Nextcloud is part of the open source and free of charge **Community edition**, including all file management functionalities.
-> However, please note that setting up the Single Sign-on via OpenID Connect Identity Provider is an Enterprise Add-on and can only be used with [Enterprise cloud](../../../enterprise-guide/enterprise-cloud-guide) or [Enterprise on-premises](../../../enterprise-guide/enterprise-on-premises-guide). This Add-On is available for all installations under the [Enterprise Corporate plan](https://www.openproject.org/pricing/).
+> The integration between OpenProject and Nextcloud is part of the open source and free of charge **Community edition**, including all file management functionalities.
+> However, please note that setting up the Single Sign-on via OpenID Connect Identity Provider is an Enterprise Add-on and can only be used with [Enterprise cloud](../../../enterprise-guide/enterprise-cloud-guide) or [Enterprise on-premises](../../../enterprise-guide/enterprise-on-premises-guide). This Add-On is available for all installations under the [Enterprise Corporate plan](https://www.openproject.org/pricing/).
| Topic | Description |
|---------------------------------------------------------------------|:---------------------------------------------------------------------|
@@ -35,7 +35,7 @@ OpenProject offers close integration with Nextcloud to allow users to:
## Required system versions
-Please see our [System requirements](../../../installation-and-operations/system-requirements/) overview which lists the supported versions.
+Please see our [System requirements](../../../installation-and-operations/system-requirements/) overview which lists the supported versions.
> [!IMPORTANT]
>
@@ -102,7 +102,7 @@ The next part of the setup will vary depending on your chosen authentication met
**Two-way OAuth 2.0 authorization code flow:** This way of authentication works with all deployments of OpenProject and Nextcloud. Requests between the two applications will act with the target application acting as OAuth 2.0 authorization server. For the users this means that they will usually have to confirm a separate OAuth consent screen for both directions of communication.
-**Single Sign-On through OpenID Connect Identity Provider:** This authentication mode improves user experience by eliminating additional consent screens. Requests between OpenProject and Nextcloud are authenticated with access tokens obtained from a common Identity Provider. This requires both applications to use the same OpenID Connect Identity Provider and specific configurations at the provider level.
+**Single Sign-On through OpenID Connect Identity Provider:** This authentication mode improves user experience by eliminating additional consent screens. Requests between OpenProject and Nextcloud are authenticated with access tokens obtained from a common Identity Provider. This requires both applications to use the same OpenID Connect Identity Provider and specific configurations at the provider level.
> [!NOTE]
>
@@ -222,9 +222,17 @@ On Nextcloud inside the _OpenProject Integration_ App, when adding the OpenProje
```
In case the `curl` command above results in an error pay attention what it is telling you. Typical reasons for connection issues are misconfigured firewalls, proxies, or a bad TLS/SSL setup.
-##### While using a self signed TLS/SSL certificate you receive "certificate verify failed"
+##### While using a self-signed TLS/SSL certificate you receive "certificate verify failed"
-Some administrators setup OpenProject using a self signed TLS/SSL certificate with their own CA (certificate authority). That CA needs to be known on the Nextcloud server. On a Debian/Ubuntu based server, make sure you add the CA certificate for your OpenProject certificate to `/usr/local/share/ca-certificates` and run `sudo update-ca-certificates` afterwards. Then Nextcloud's PHP code should be able to verify your OpenProject TLS/SSL certificate when emitting HTTPS requests to your Nextcloud server.
+Some administrators setup OpenProject using a self-signed TLS/SSL certificate with their own CA (certificate authority). That CA needs to be known on the Nextcloud server. On a Debian/Ubuntu based server, make sure you add the CA certificate for your OpenProject certificate to `/usr/local/share/ca-certificates` and run `sudo update-ca-certificates` afterwards.
+
+Next, import that new bundled file into Nextcloud:
+
+ ```shell
+ occ security:certificates:import /etc/ssl/certs/ca-certificates.crt
+ ```
+
+Now, Nextcloud's PHP code should be able to verify your OpenProject TLS/SSL certificate when emitting HTTPS requests to your Nextcloud server.
Attention: Please do not confuse the CA for the Nextcloud server's certificate with the CA of the OpenProject server's certificate which you might have provided in the OpenProject installation wizard. They do not necessarily need to be the same.
@@ -293,7 +301,7 @@ If you face an error while trying to delete or disable user/group "OpenProject"
2. Remove user `OpenProject`
3. Remove group `OpenProject`
4. Inside the _Group folders_ App (*Administration settings → Administration → Group folders*), remove group folder `OpenProject`.
-
+
> [!WARNING]
> This step will delete all files in that folder. Make sure to make a copy if you want to keep these files!**
@@ -320,9 +328,19 @@ On OpenProject inside the storage administration (*Administration → File stora
If you do not get such a response check out what the `curl` command above is telling you. Typical reasons for connection issues are misconfigured firewalls, proxies, or a bad TLS/SSL setup.
-##### While using a self signed TLS/SSL certificate you receive "certificate verify failed"
+##### While using a self-signed TLS/SSL certificate you receive "certificate verify failed"
-Some administrators setup Nextcloud using a self signed TLS/SSL certificate with their own CA (certificate authority). The CA needs to be known on the OpenProject server. On a Debian/Ubuntu based server, make sure you add the CA certificate for your Nextcloud certificate to `/usr/local/share/ca-certificates` and run `sudo update-ca-certificates` afterwards. Then OpenProject's Ruby code should be able to verify your Nextcloud TLS/SSL certificate when emitting HTTPS requests to your Nextcloud server.
+Some administrators setup Nextcloud using a self-signed TLS/SSL certificate with their own CA (certificate authority). The CA needs to be known on the OpenProject server. On a Debian/Ubuntu based server, make sure you add the CA certificate for your Nextcloud certificate to `/usr/local/share/ca-certificates` and run `sudo update-ca-certificates` afterwards.
+
+Add the following environment variable to the OpenProject server and restart it:
+
+```
+SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
+```
+
+In docker compose based installations, this can be usually achieved by editing the `.env` file that's next to your `docker-compose.yml`.
+
+Afterwards OpenProject's Ruby code should be able to verify your Nextcloud TLS/SSL certificate when emitting HTTPS requests to your Nextcloud server.
Attention: Please do not confuse the CA for the Nextcloud server's certificate with the CA of the OpenProject server's certificate which you might have provided in the OpenProject installation wizard. They do not necessarily need to be the same.
diff --git a/docs/system-admin-guide/users-permissions/users/README.md b/docs/system-admin-guide/users-permissions/users/README.md
index 7df3b8f233c..137106285a7 100644
--- a/docs/system-admin-guide/users-permissions/users/README.md
+++ b/docs/system-admin-guide/users-permissions/users/README.md
@@ -201,7 +201,7 @@ To enter a new hourly rate, click on the **Update** icon next to the rate histor
The **Avatar** tab shows the default icon to be shown for this user. A custom image can be uploaded as the avatar. In addition, users can also use their [Gravatar](https://en.wikipedia.org/wiki/Gravatar). User can manage this under their [profile settings](../../../user-guide/account-settings/#set-an-avatar). These features can be disabled in the [avatar settings](../avatars).
-> ![TIP]
+> [!TIP]
>
> Hovering over a user's avatar or name, for example on the Members page or the Activity page, will display their information.
diff --git a/docs/use-cases/test-management/README.md b/docs/use-cases/test-management/README.md
index 45a88c25020..ea978a24c90 100644
--- a/docs/use-cases/test-management/README.md
+++ b/docs/use-cases/test-management/README.md
@@ -1,6 +1,6 @@
---
sidebar_navigation:
- title: Test Management with OpenProject
+ title: Test Management with OpenProject
priority: 950
description: OpenProject can be configured to support lightweight test management using custom work package types, work packages and project templates. This guide describes how to manage test cases and test runs in a reusable, scalable way.
keywords: test plan, test case, test case, test management
@@ -9,44 +9,48 @@ keywords: test plan, test case, test case, test management
> [!IMPORTANT]
>
-> This is use case description is a draft. It will be detailed and improved based on feedback from the community. If you have any feedback please contact us.
+> This use case description is a draft. It will be detailed and improved based on feedback from the community. If you have any feedback please contact us.
# Test management in OpenProject
## Purpose
-This guide describes how OpenProject can be used for lightweight test management by modeling test plans, test cases, and test runs using built-in features such as work package types and project templates. It enables teams to manage and execute tests within the same environment they already use for project and requirements tracking.
+This guide describes how OpenProject can be used for lightweight test management by modeling test plans, test cases, and test runs using built-in features such as work package types, workflows, custom fields and project templates. It enables teams to manage and execute tests within the same environment they already use for project and requirements tracking.
## Scope and assumptions
This use case is intended for teams that:
-- Already use OpenProject for project planning and requirements tracking
+- Already use OpenProject for project planning and requirements management
- Want to include manual or semi-automated testing workflows
- Need traceability between requirements, test cases, executions, and defects
This setup is not a replacement for full-scale test automation or advanced lab management tools, but rather a structured and integrated approach to test tracking.
+> [!NOTE]
+>
+> At OpenProject, automated testing is a key part of our development process. It helps us detect bugs early and avoid regressions, especially as the codebase grows. We use continuous integration and deployment (CI/CD) to ensure that changes are tested and released quickly and reliably. You can see our automated test runs on [GitHub Actions](https://github.com/opf/openproject/actions). In addition to automated tests, we also perform smoke tests and exploratory testing to cover areas that are harder to automate and to validate the overall user experience.
+
## Structure and terminology

### Core entities
-| Concept | OpenProject entity |
-| ------------------ | --------------------------------------------------- |
-| Requirements | Work package (e.g., type `Feature` or `User Story`) |
-| Test case | Work package type `Test Case` |
-| Test run | Work package type `Test Run` (child of test case) |
-| Test plan | Project (created from a template) |
-| Version under test | OpenProject *Version* field on test runs |
-| Defect | Work package (e.g., type `Bug`) |
+| Concept | OpenProject entity |
+| ------------------ | ------------------------------------------------------------ |
+| Requirements | Work package (e.g., type `Feature` or `User Story`) |
+| Test case | Work package type `Test Case` |
+| Test run | Work package type `Test Run` (child of test case) |
+| Test plan | Project (created from a [template](../../user-guide/projects/project-templates/)) |
+| Version under test | OpenProject [Version](../../user-guide/projects/project-settings/versions/) field on test runs |
+| Defect | Work package (e.g., type `Bug`) |
### Relationships
-- Each `Feature` or `User Story` may relate to one or more test cases.
+- Each `Feature` or `User Story` may relate to one or more `Test Cases`.
- Each `Test Case` defines a reusable test specification.
-- Each `Test Case` has one or more Test Runs (child work packages).
+- Each `Test Case` has one or more `Test Runs` (child work packages).
- A `Test Run` is specific to one software version.
- `Test Plans` are realized as individual projects per version, created from a reusable template.
- `Bugs` can be linked to failed `Test Runs`.
@@ -57,17 +61,17 @@ This structure supports traceability from requirements to execution and defect r
### 1.1 Creating a test plan (project)
-A new test plan project is created based on a predefined template using the *create project form*.
+A new test plan project is created based on a predefined template using the [create project form](../../getting-started/projects/#create-a-new-project).

-### 1.2 Adjusting the created test plan
+### 1.2 Adjusting the created test plan
-In the next step the [newly created test plan](https://testmanagement.openproject.com/projects/regression-test-openproject-16-dot-1/work_packages?query_id=90) is adjusted by specifying the test object. The easiest way is to select all work package (`CMD + A`) -> right click -> `bulk edit`.
+In the next step the [newly created test plan](https://testmanagement.openproject.com/projects/regression-test-openproject-16-dot-1/work_packages?query_id=90) is adjusted by specifying the test object. The easiest way is to select all work packages (`CMD + A`) -> right click -> `bulk edit`.
* Version of the test object (version ideally shared from the development project)
* Tester
-* Environment
+* Environment
For all test runs which are not planned the status should be adjusted to something like `Not planned`.
@@ -83,15 +87,79 @@ For all test runs which are not planned the status should be adjusted to somethi
- Status is updated (e.g., `Passed`, `Test failed`, `Blocked`)
3. If failures occur, related defects (bugs) are created and linked.
4. Boards, filters, or hierarchy views are used to monitor test progress and coverage.
-5. The test result can be document creating a pdf report of the [test status and results](https://testmanagement.openproject.com/projects/regression-test-openproject-16-dot-1/work_packages?query_id=89).
+5. The test result can be documented by creating a pdf report of the [test status and results](https://testmanagement.openproject.com/projects/regression-test-openproject-16-dot-1/work_packages?query_id=89).

-## 2. Configuration guidance
+### 1.4 Progress tracking and reporting
+
+As previously stated, agile boards (Kanban or Scrum) can help us track the test execution progress, i.e. visualize `Test Runs` by status (e.g., `To Do` , `In Progress` , `Failed` , `Passed`).
+
+
+
+Comments and activity log (`Activity` tab) complement custom fields in the sense that they can also be used to record:
+* Time and date of the execution
+* Environment details (e.g., Browser, OS, Build version)
+* Qualitative data and detailed explanations, as well as communication and collaboration between testers, developers and other stakeholders around a specific test case.
+
+Activity tab is especially beneficial during the *static testing* phase. As a reminder, static testing is, among other things, verification of the test cases themselves (sort of testing of test case). Testers review the test cases/test runs searching for inconsistencies, errors, unclarity. Activity tab is a good place to discuss their findings, as well as track the complete and chronological history of a test.
+
+Further tools can be used for reporting and metrics purposes with OpenProject:
+* Saved filters: Create and save filters for "Failed Test Cases," "Tests for Feature X," "Tests due this week."
+* Export data: Apart from PDF, XLS and CSV are also supported.
+* Custom dashboards: On Overview page of your Test plan project, you can create graphs to:
+ * Count test cases by status (Passed, Failed, Blocked)
+ * Show tests assigned to each tester
+ * Track the number of open vs. closed defects, or simply have an overview of the bugs by priority.
+
+
+
+### 1.5 Test case evolution: reusability and standardization
+
+As test cases evolve, we need to track changes and reuse them across different cycles. There are several possibilities to achieve this:
+* Duplicating work packages, copying projects, creating projects from template, moving work packages to another projects are all good methods for reusing test cases for new test cycles or for creating variations.
+* Manual history can be tracked on the activity/comment log for any manual changes to test case steps.
+* Naming conventions can be implemented (e.g., "TC-Login-ValidCredentials-v1.0") to help manage variations.
+
+To support consistency and standardization, OpenProject allows administrators to define **automatically generated subjects** for work packages. This feature enables the use of predefined patterns for naming, including for work package types such as `Test Case` and `Test Run`. As a result, newly created test cases and test runs automatically follow a consistent naming structure. This approach helps eliminate manual errors, improves searchability, and enhances filtering capabilities.
+
+The subject pattern can incorporate dynamic attributes from the test case/test run itself (or its parent). In this example, `Test run`'s subject is derived from 2 fields: `Parent's subject` and `Version`.
+
+
+
+Such subject is created upon save and is not manually editable.
+
+
+
+Automatically generated subjects reduce manual effort and ensure that the name remains accurate and up-to-date if an attribute referenced in the subject pattern changes.
+
+## 2. Test automation with GitHub and GitLab
+
+### 2.1 Integration concept
+
+OpenProject enables seamless integration between software development and test automation workflows in GitHub and GitLab with planning and specification in OpenProject. Work packages can display information from [GitHub pull requests](../../system-admin-guide/integrations/github-integration/) and [GitLab merge requests](../../system-admin-guide/integrations/gitlab-integration) in a dedicated tab.
+
+This tab lists all pull or merge requests linked to a work package, showing their status (e.g., *Ready* or *Merged*) as well as the current state (e.g., *success* or *queued*) of the actions configured to run for each request—whether in GitHub or GitLab. The results of these actions are also displayed within the tab.
+
+The relationship between work packages and pull/merge requests is many-to-many: a single work package can be linked to multiple pull or merge requests, and a single pull or merge request can be associated with multiple work packages.
+
+
+
+### 2.2 Benefits of the integration
+
+Integrating GitHub and GitLab with OpenProject offers several advantages for software development teams:
+
+- **Enhanced traceability**: By linking code changes directly to work packages, teams can easily trace the origin of each change, facilitating better understanding and accountability throughout the development process.
+- **Improved collaboration**: Real-time visibility into the status of pull and merge requests fosters collaboration between developers, testers, and project managers, ensuring everyone stays informed and aligned.
+- **Streamlined workflows**: Automated updates from GitHub and GitLab reduce manual tracking efforts, allowing teams to focus on development tasks and reducing the likelihood of oversight.
+- **Accelerated delivery**: By integrating continuous integration and deployment (CI/CD) pipelines, teams can automate testing and deployment processes, leading to faster and more reliable software releases.
+- **Comprehensive reporting**: Consolidated data from development and project management tools enables more comprehensive reporting and analytics, supporting informed decision-making and continuous improvement.
+
+## 3. Configuration guidance
This section provides guidance on how to configure OpenProject for test management. It assumes familiarity with OpenProject administration features.
-### 2.1 Configuration example: Test Cases (work package type)
+### 3.1 Configuration example: Test Cases (work package type)
The work package type `Test case` can be configured so it shows the relevant information:
@@ -106,11 +174,12 @@ Here you find an [example for a test case](https://testmanagement.openproject.co

-### 2.2 Configuration example: Test Run (work package type)
+### 3.2 Configuration example: Test Run (work package type)
The work package type `Test run` can be configured so it shows the relevant information:
-* Test specification inlcuding preconditions, excecution steps and testresults: Description field Tested features (related work packages `requires`)
+* Test specification including preconditions, execution steps and test results: Description field
+* Tested features (related work packages `requires`)
* Priority
* Tester (custom field of type user)
* Identified bugs (related work packages `related to`)
@@ -119,7 +188,24 @@ Here you find an [example for a test run](https://testmanagement.openproject.com

-### 2.5 Workflow and statuses
+
+### 3.3 Roles and permissions
+
+- Define useful roles such as:
+ - `Tester`
+ - `Test Manager`
+
+- Add permissions such as:
+ - Edit work packages
+
+### 3.4 Custom fields
+
+Define custom fields that describe the test object such as:
+
+- Test environment (type `hierarchy`)
+- Tester (custom field type `user`)
+
+### 3.5 Workflow and statuses
- Define custom statuses such as:
- `New`,
@@ -131,20 +217,3 @@ Here you find an [example for a test run](https://testmanagement.openproject.com
- Optionally restrict who can move a test run to `Test passed`.

-
-### 2.3 Roles and permissions
-
-- Define useful roles such as:
- - `Tester`
- - `Test Manager`
-
-- Add permissions such as:
- - Edit work packages
-
-
-### 2.4 Custom fields
-
-Define custom fields that describe the test object such as:
-
-- Test environment (type `hierarchy`)
-- Tester (custom field type `user`)
diff --git a/docs/use-cases/test-management/automatically-generated-subject-after-saving2.png b/docs/use-cases/test-management/automatically-generated-subject-after-saving2.png
new file mode 100644
index 00000000000..a3c461a3f53
Binary files /dev/null and b/docs/use-cases/test-management/automatically-generated-subject-after-saving2.png differ
diff --git a/docs/use-cases/test-management/automatically-generated-subject-before-saving.png b/docs/use-cases/test-management/automatically-generated-subject-before-saving.png
new file mode 100644
index 00000000000..c4917a3e1b4
Binary files /dev/null and b/docs/use-cases/test-management/automatically-generated-subject-before-saving.png differ
diff --git a/docs/use-cases/test-management/board-for-test-case-tracking.png b/docs/use-cases/test-management/board-for-test-case-tracking.png
new file mode 100644
index 00000000000..e380aac20f1
Binary files /dev/null and b/docs/use-cases/test-management/board-for-test-case-tracking.png differ
diff --git a/docs/use-cases/test-management/graph-for-bugs-overview.png b/docs/use-cases/test-management/graph-for-bugs-overview.png
new file mode 100644
index 00000000000..e7e2603ad1c
Binary files /dev/null and b/docs/use-cases/test-management/graph-for-bugs-overview.png differ
diff --git a/docs/use-cases/test-management/test-automation-integration.png b/docs/use-cases/test-management/test-automation-integration.png
new file mode 100644
index 00000000000..c78c7d0c446
Binary files /dev/null and b/docs/use-cases/test-management/test-automation-integration.png differ
diff --git a/docs/use-cases/test-management/test-case-configuration-example.png b/docs/use-cases/test-management/test-case-configuration-example.png
index f6e2523d548..03b7175d142 100644
Binary files a/docs/use-cases/test-management/test-case-configuration-example.png and b/docs/use-cases/test-management/test-case-configuration-example.png differ
diff --git a/docs/user-guide/activity/README.md b/docs/user-guide/activity/README.md
index a9cc73a4929..24e42ae47ed 100644
--- a/docs/user-guide/activity/README.md
+++ b/docs/user-guide/activity/README.md
@@ -57,7 +57,7 @@ You can:
### Internal comments (Enterprise add-on)
> [!NOTE]
-> Internal comments are an Enterprise add-on and can only be used with [Enterprise cloud](../../enterprise-guide/enterprise-cloud-guide/) or [Enterprise on-premises](../../enterprise-guide/enterprise-cloud-guide/). An upgrade from the free Community edition is easily possible.
+> Internal comments are an Enterprise add-on and can only be used with [Enterprise cloud](../../enterprise-guide/enterprise-cloud-guide/) or [Enterprise on-premises](../../enterprise-guide/enterprise-on-premises-guide/). An upgrade from the free Community edition is easily possible.
Projects may include external clients or suppliers, who can be invited to a project or individual work package with restricted roles. To keep sensitive discussions (for example rates, negotiations, or financial and contextual details) confined to the core team, internal comments can be used. These comments are only visible to authorized users and are not accessible to external participants. This allows teams to manage sensitive information directly within work packages and avoid using external tools, maintaining a single source of truth.
diff --git a/docs/user-guide/meetings/README.md b/docs/user-guide/meetings/README.md
index 826329382f2..1293e8e150d 100644
--- a/docs/user-guide/meetings/README.md
+++ b/docs/user-guide/meetings/README.md
@@ -86,4 +86,6 @@ You can also use the meetings filters to refine the list of meetings based on th

> [!TIP]
-> If you are interested in how the Meetings module is used by the OpenProject team, please take a look at [this blog article](https://www.openproject.org/blog/meeting-management-example/).
+> If you are interested in how the Meetings module is used by the OpenProject team, please take a look at [this blog article](https://www.openproject.org/blog/meeting-management-example/).
+>
+> Find out more about OpenProject as [open source meeting management software]( https://www.openproject.org/collaboration-software-features/meeting-management/) .
diff --git a/docs/user-guide/meetings/meetings-faq/README.md b/docs/user-guide/meetings/meetings-faq/README.md
index f707b7a5a26..e1f70f3218b 100644
--- a/docs/user-guide/meetings/meetings-faq/README.md
+++ b/docs/user-guide/meetings/meetings-faq/README.md
@@ -30,3 +30,6 @@ Yes, you can [download a meeting as an iCalendar event](../one-time-meetings/#do
## Are the meetings shown in calendar widgets?
Yes, the Calendar widget on the [project overview page](../../project-overview/#calendar-widget) and [My page](../../../getting-started/my-page/#add-widgets) displays meetings. Meetings links in this widget are clickable and open the meeting directly.
+
+## What makes OpenProject a great choice for managing meetings?
+OpenProject stands out [a reliable open source solution for meeting management](https://www.openproject.org/collaboration-software-features/meeting-management/), especially for teams that value structure and transparency. Its dedicated meeting module allows users to prepare agendas, take detailed minutes, and link tasks directly to meetings — making follow-ups more actionable and clear. Because it’s part of a broader project and task management platform, everything stays connected and organized. With flexible access controls and the option to choose between a secure SaaS or on-premises setup, OpenProject supports both collaboration and data privacy. It’s particularly well-suited for teams looking for an open-source tool that supports efficient, accountable meetings.
\ No newline at end of file
diff --git a/docs/user-guide/meetings/one-time-meetings/README.md b/docs/user-guide/meetings/one-time-meetings/README.md
index 2589e086ebe..ea46d6c0695 100644
--- a/docs/user-guide/meetings/one-time-meetings/README.md
+++ b/docs/user-guide/meetings/one-time-meetings/README.md
@@ -24,13 +24,14 @@ For information on setting up recurring meeting series and templates, please ref
| [Edit a meeting](#edit-a-meeting) | How to edit an existing meeting. |
| [Add a work package to the agenda](#add-a-work-package-to-the-agenda) | How to add a work package to a meeting agenda. |
| [Create or edit the meeting agenda](#create-or-edit-the-meeting-agenda) | How to create or edit the agenda. |
-| [Agenda backlog](#agenda-backlogs) | How to use an agenda backlog. |
+| [Agenda backlog](#agenda-backlogs) | How to use an agenda backlog. |
| [Add meeting participants](#add-meeting-participants) | How to invite people to a meeting. |
| [Add meeting attachments](#meeting-attachments) | How to add attachments to a meeting. |
| [Send email to all participants](#send-email-to-all-participants) | How to send an email to all meeting participants. |
| [Download a meeting as an iCalendar event](#download-a-meeting-as-an-icalendar-event) | How to download a meeting as an iCalendar event. |
| [Close a meeting](#close-a-meeting) | How to close a meeting in OpenProject. |
| [Re-open a meeting](#re-open-a-meeting) | How to re-open a meeting in OpenProject. |
+| [Export a meeting](#export-a-meeting) | How to export a meeting as a PDF in OpenProject. |
| [Copy a meeting](#copy-a-meeting) | How to copy a meeting in OpenProject (recurring meetings). |
| [Delete a meeting](#delete-a-meeting) | How to delete a meeting in OpenProject. |
@@ -256,6 +257,7 @@ Added attachments can be added to the Notes section of agenda packages by draggi

+
## Meeting history
You can track what changes were made to a meeting and by which user. Select the dropdown by clicking on the **More** (three dots) icon in the top right corner and select **Meeting history**.
@@ -321,6 +323,36 @@ Once a meeting has been closed, it can no longer be edited. Project members wit

+## Export a meeting
+
+You can export a meeting in OpenProject in a PDF format. A meeting can be exported regardless of the meeting state (open, in progress or closed).
+
+To export a meeting select the dropdown by clicking on the **More** (three dots) icon in the top right corner and select **Export PDF**.
+
+
+
+The **Export PDF** dialogue will open. Here you can specify what elements should be included into the PDF and specify the footer text. Options include:
+
+- Include list of participants: a list of participants will be preset above the meeting agenda (**this option is selected by default**)
+- Include list of attachments: a list containing the filenames of attachments will be appended at the end
+- Include backlog: includes list of backlog elements
+- Include agenda outcomes: includes agenda outcomes (**if your agenda outcomes contain confidential information, you can choose to not include them in the export**).
+
+You can also specify the **Footer text**, which will appear on the bottom of every page. The default text for the PDF export footer is the project name.
+
+
+
+
+
+Click the **Download** button to generated a PDF. First page of the PDF is the title page. The generated PDF will include all the meeting details and agenda. Meeting participants, agenda outcomes, a list of attachments and backlog items will only be included if selected for the export.
+
+> [!NOTE]
+> Macros from the editor macros dropdown are not supported in the PDF.
+
+
+
+
+
## Copy a meeting
You can copy an existing meeting. This is useful if you have recurring meetings. To copy a meeting, click on the three dots in the top right corner and select **Copy**.
diff --git a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_item_more_menu.png b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_item_more_menu.png
index 5c2f508f18f..3428289fe64 100644
Binary files a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_item_more_menu.png and b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_agenda_item_more_menu.png differ
diff --git a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_copy_meeting.png b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_copy_meeting.png
index 7f39931b23b..48f7ea27ecd 100644
Binary files a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_copy_meeting.png and b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_copy_meeting.png differ
diff --git a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_delete_meeting.png b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_delete_meeting.png
index 2125d28a898..166863841ce 100644
Binary files a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_delete_meeting.png and b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_delete_meeting.png differ
diff --git a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_edit_meeting_title.png b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_edit_meeting_title.png
index 4dc58dfaad4..3ce838aa106 100644
Binary files a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_edit_meeting_title.png and b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_edit_meeting_title.png differ
diff --git a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_export_pdf.png b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_export_pdf.png
new file mode 100644
index 00000000000..b641fe3e4fd
Binary files /dev/null and b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_export_pdf.png differ
diff --git a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_pdf_export_dialogue.png b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_pdf_export_dialogue.png
new file mode 100644
index 00000000000..30828337f87
Binary files /dev/null and b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_pdf_export_dialogue.png differ
diff --git a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_pdf_export_file.png b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_pdf_export_file.png
new file mode 100644
index 00000000000..52c7b9b11dd
Binary files /dev/null and b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_pdf_export_file.png differ
diff --git a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_section_more_menu.png b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_section_more_menu.png
index fa39b5f1e1d..b1464f8bb80 100644
Binary files a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_section_more_menu.png and b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_section_more_menu.png differ
diff --git a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_select_meeting_history.png b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_select_meeting_history.png
index 3cbc8c0ff14..3c5ebd8bbe7 100644
Binary files a/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_select_meeting_history.png and b/docs/user-guide/meetings/one-time-meetings/openproject_userguide_meetings_select_meeting_history.png differ
diff --git a/docs/user-guide/wysiwyg/README.md b/docs/user-guide/wysiwyg/README.md
index 36febd5b52b..623c85db10a 100644
--- a/docs/user-guide/wysiwyg/README.md
+++ b/docs/user-guide/wysiwyg/README.md
@@ -222,31 +222,32 @@ The following lists show the supported attributes for work packages and projects
The following list contains all supported attribute names for the `workPackageValue` and `workPackageLabel` macros,
where `1234` stands for the [work package ID](../work-packages).
-| **Attribute** | Usage example |
-| ------------------- | ------------------------------------------------------------ |
-| %Complete | `workPackageValue:8415:percentageDone` |
-| Accountable | `workPackageValue:1234:responsible` |
-| Assignee | `workPackageValue:1234:assignee` |
-| Author | `workPackageValue:1234:author` |
-| Category | `workPackageValue:1234:category` |
-| Creation date | `workPackageValue:1234:createdAt` |
+| **Attribute** | Usage example |
+|---------------------|-----------------------------------------------------------------|
+| %Complete | `workPackageValue:8415:percentageDone` |
+| Accountable | `workPackageValue:1234:responsible` |
+| Assignee | `workPackageValue:1234:assignee` |
+| Author | `workPackageValue:1234:author` |
+| Category | `workPackageValue:1234:category` |
+| Creation date | `workPackageValue:1234:createdAt` |
| Custom Fields | `workPackageValue:1234:"Name of the work package custom field"` |
-| Date of last update | `workPackageValue:1234:updatedAt` |
-| Description | `workPackageValue:1234:description` |
-| Estimated time | `workPackageValue:1234:estimatedTime` |
-| Finish date | `workPackageValue:1234:dueDate` |
-| Parent work package | `workPackageValue:1234:parent` |
-| Priority | `workPackageValue:1234:priority` |
-| Project | `workPackageValue:1234:project` |
-| Remaining hours | `workPackageValue:1234:remainingTime` |
-| Remaining work | `workPackageValue:8415:remainingTime` |
-| Spent time | `workPackageValue:1234:spentTime` |
-| Start date | `workPackageValue:1234:startDate` |
-| Status | `workPackageValue:1234:status` |
-| Subject / Title | `workPackageValue:1234:subject` |
-| Version | `workPackageValue:1234:version` |
-| Work | `workPackageValue:8415:estimatedTime` |
-| Work package type | `workPackageValue:1234:type` |
+| Date of last update | `workPackageValue:1234:updatedAt` |
+| Description | `workPackageValue:1234:description` |
+| Estimated time | `workPackageValue:1234:estimatedTime` |
+| Finish date | `workPackageValue:1234:dueDate` |
+| Parent work package | `workPackageValue:1234:parent` |
+| Priority | `workPackageValue:1234:priority` |
+| Project | `workPackageValue:1234:project` |
+| Project phase | `workPackageValue:1234:projectPhase` |
+| Remaining hours | `workPackageValue:1234:remainingTime` |
+| Remaining work | `workPackageValue:8415:remainingTime` |
+| Spent time | `workPackageValue:1234:spentTime` |
+| Start date | `workPackageValue:1234:startDate` |
+| Status | `workPackageValue:1234:status` |
+| Subject / Title | `workPackageValue:1234:subject` |
+| Version | `workPackageValue:1234:version` |
+| Work | `workPackageValue:8415:estimatedTime` |
+| Work package type | `workPackageValue:1234:type` |
> [!NOTE]
> Recursive embedding of rich text is not supported. For example, you cannot embed a work package description in itself with `workPackageValue:description`.
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 9b61b16468f..80204fce301 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -3201,21 +3201,21 @@
}
},
"node_modules/@floating-ui/core": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.0.tgz",
- "integrity": "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==",
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.1.tgz",
+ "integrity": "sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==",
"license": "MIT",
"dependencies": {
"@floating-ui/utils": "^0.2.9"
}
},
"node_modules/@floating-ui/dom": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.0.tgz",
- "integrity": "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==",
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.1.tgz",
+ "integrity": "sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==",
"license": "MIT",
"dependencies": {
- "@floating-ui/core": "^1.7.0",
+ "@floating-ui/core": "^1.7.1",
"@floating-ui/utils": "^0.2.9"
}
},
@@ -3484,13 +3484,13 @@
}
},
"node_modules/@hotwired/turbo-rails": {
- "version": "8.0.13",
- "resolved": "https://registry.npmjs.org/@hotwired/turbo-rails/-/turbo-rails-8.0.13.tgz",
- "integrity": "sha512-6SCnnOSzhtaJ0pNkAjncZxjtKsK3sP/vPEkCnTXBXSHkr+vF7DTZkOlwjhms1DbbQNTsjCsBoKvzSMbh/omSCQ==",
+ "version": "8.0.16",
+ "resolved": "https://registry.npmjs.org/@hotwired/turbo-rails/-/turbo-rails-8.0.16.tgz",
+ "integrity": "sha512-Yxiy2x+N3eOIEDokvLzSrd08aI5RDKnFYDQFl2J/LuMEWTtPdY7oNP0F/gv/sSe5AV23Lwz4FitG/uNFXNM5tA==",
"license": "MIT",
"dependencies": {
"@hotwired/turbo": "^8.0.13",
- "@rails/actioncable": "^7.0"
+ "@rails/actioncable": ">=7.0"
}
},
"node_modules/@html-eslint/eslint-plugin": {
@@ -8739,9 +8739,9 @@
}
},
"node_modules/core-js": {
- "version": "3.42.0",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.42.0.tgz",
- "integrity": "sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==",
+ "version": "3.43.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.43.0.tgz",
+ "integrity": "sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==",
"hasInstallScript": true,
"license": "MIT",
"funding": {
@@ -24260,19 +24260,19 @@
"dev": true
},
"@floating-ui/core": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.0.tgz",
- "integrity": "sha512-FRdBLykrPPA6P76GGGqlex/e7fbe0F1ykgxHYNXQsH/iTEtjMj/f9bpY5oQqbjt5VgZvgz/uKXbGuROijh3VLA==",
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.1.tgz",
+ "integrity": "sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw==",
"requires": {
"@floating-ui/utils": "^0.2.9"
}
},
"@floating-ui/dom": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.0.tgz",
- "integrity": "sha512-lGTor4VlXcesUMh1cupTUTDoCxMb0V6bm3CnxHzQcw8Eaf1jQbgQX4i02fYgT0vJ82tb5MZ4CZk1LRGkktJCzg==",
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.1.tgz",
+ "integrity": "sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ==",
"requires": {
- "@floating-ui/core": "^1.7.0",
+ "@floating-ui/core": "^1.7.1",
"@floating-ui/utils": "^0.2.9"
}
},
@@ -24481,12 +24481,12 @@
"integrity": "sha512-M7qXUqcGab6G5PKOiwhgbByTtrPgKPFCTMNQ52QhzUEXEqmp0/ApEguUesh/FPiUjrmFec+3lq98KsWnYY2C7g=="
},
"@hotwired/turbo-rails": {
- "version": "8.0.13",
- "resolved": "https://registry.npmjs.org/@hotwired/turbo-rails/-/turbo-rails-8.0.13.tgz",
- "integrity": "sha512-6SCnnOSzhtaJ0pNkAjncZxjtKsK3sP/vPEkCnTXBXSHkr+vF7DTZkOlwjhms1DbbQNTsjCsBoKvzSMbh/omSCQ==",
+ "version": "8.0.16",
+ "resolved": "https://registry.npmjs.org/@hotwired/turbo-rails/-/turbo-rails-8.0.16.tgz",
+ "integrity": "sha512-Yxiy2x+N3eOIEDokvLzSrd08aI5RDKnFYDQFl2J/LuMEWTtPdY7oNP0F/gv/sSe5AV23Lwz4FitG/uNFXNM5tA==",
"requires": {
"@hotwired/turbo": "^8.0.13",
- "@rails/actioncable": "^7.0"
+ "@rails/actioncable": ">=7.0"
}
},
"@html-eslint/eslint-plugin": {
@@ -28267,9 +28267,9 @@
}
},
"core-js": {
- "version": "3.42.0",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.42.0.tgz",
- "integrity": "sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g=="
+ "version": "3.43.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.43.0.tgz",
+ "integrity": "sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA=="
},
"core-js-compat": {
"version": "3.41.0",
diff --git a/frontend/src/app/core/config/configuration.service.ts b/frontend/src/app/core/config/configuration.service.ts
index 027a23cc87a..071ac782ae0 100644
--- a/frontend/src/app/core/config/configuration.service.ts
+++ b/frontend/src/app/core/config/configuration.service.ts
@@ -150,6 +150,10 @@ export class ConfigurationService {
return this.systemPreference('availableFeatures');
}
+ public get triallingFeatures():string[] {
+ return this.systemPreference('triallingFeatures');
+ }
+
private loadConfiguration() {
return this
.apiV3Service
diff --git a/frontend/src/app/core/enterprise/banners.service.ts b/frontend/src/app/core/enterprise/banners.service.ts
index 4a74e35158d..9912d212b01 100644
--- a/frontend/src/app/core/enterprise/banners.service.ts
+++ b/frontend/src/app/core/enterprise/banners.service.ts
@@ -43,7 +43,19 @@ export class BannersService {
}
public showBannerFor(feature:string):boolean {
- return !(this._bannersHidden || this.configuration.availableFeatures.includes(feature));
+ if (this._bannersHidden) {
+ return false;
+ }
+
+ return !this.allowsTo(feature) || this.trialling(feature);
+ }
+
+ public allowsTo(feature:string):boolean {
+ return this.configuration.availableFeatures.includes(feature);
+ }
+
+ public trialling(feature:string):boolean {
+ return this.configuration.triallingFeatures.includes(feature);
}
public getEnterPriseEditionUrl({ referrer, hash }:{ referrer?:string, hash?:string } = {}) {
@@ -59,13 +71,13 @@ export class BannersService {
return url.toString();
}
- public async conditional(feature:string, bannersVisible?:() => void, bannersNotVisible?:() => void) {
+ public async conditional(feature:string, featureNotAvailable?:() => void, featureAvailable?:() => void) {
await this.configuration.initialize();
- if (this.showBannerFor(feature)) {
- this.callMaybe(bannersVisible);
+ if (this.allowsTo(feature)) {
+ this.callMaybe(featureAvailable);
} else {
- this.callMaybe(bannersNotVisible);
+ this.callMaybe(featureNotAvailable);
}
}
diff --git a/frontend/src/app/features/admin/types/type-banner.service.ts b/frontend/src/app/features/admin/types/type-banner.service.ts
index 18a355a5af0..3d5937bf2d7 100644
--- a/frontend/src/app/features/admin/types/type-banner.service.ts
+++ b/frontend/src/app/features/admin/types/type-banner.service.ts
@@ -7,7 +7,7 @@ import { ConfigurationService } from 'core-app/core/config/configuration.service
@Injectable()
export class TypeBannerService extends BannersService {
- showBanners = this.showBannerFor('edit_attribute_groups');
+ eeAvailable = this.allowsTo('edit_attribute_groups');
constructor(
@Inject(DOCUMENT) protected documentElement:Document,
diff --git a/frontend/src/app/features/admin/types/type-form-configuration.html b/frontend/src/app/features/admin/types/type-form-configuration.html
index ef1ca845855..2fd43ea8544 100644
--- a/frontend/src/app/features/admin/types/type-form-configuration.html
+++ b/frontend/src/app/features/admin/types/type-form-configuration.html
@@ -10,7 +10,7 @@