Merge dev into release merge branch

Resolve Backlogs sprint conflicts by porting the release assignability
changes onto the renamed Sprint model.
This commit is contained in:
Alexander Brandon Coles
2026-05-05 08:49:08 +01:00
879 changed files with 25066 additions and 11653 deletions
+2 -2
View File
@@ -85,7 +85,7 @@ jobs:
echo "✓ docker_tags: ${{ steps.extract_version.outputs.docker_tags }}"
echo "✓ registry_image: ${{ steps.extract_version.outputs.registry_image }}"
- name: Cache NPM
uses: runs-on/cache@v4
uses: runs-on/cache@v5
with:
path: |
frontend/node_modules
@@ -93,7 +93,7 @@ jobs:
key: nodejs-x64-${{ hashFiles('**/package-lock.json') }}
restore-keys: nodejs-x64-
- name: Cache angular
uses: runs-on/cache@v4
uses: runs-on/cache@v5
with:
path: frontend/.angular
key: angular-${{ github.ref }}
+1 -1
View File
@@ -48,7 +48,7 @@ jobs:
compose_files: docker-compose.pullpreview.yml
provider: hetzner
region: fsn1
instance_type: cx53
instance_type: cpx42
ports: 80,443
default_port: 443
ttl: 10d
+5 -5
View File
@@ -38,7 +38,7 @@ jobs:
- uses: actions/checkout@v6
- name: Cache DOCKER
id: cache_docker
uses: runs-on/cache@v4
uses: runs-on/cache@v5
with:
path: cache/docker
# Note: no restore keys since whenever the files below change, we want to rebuild the full image from scratch
@@ -47,28 +47,28 @@ jobs:
if: steps.cache_docker.outputs.cache-hit == 'true'
run: docker load -i cache/docker/image.tar
- name: Cache GEM
uses: runs-on/cache@v4
uses: runs-on/cache@v5
with:
path: cache/bundle
key: gem-trixie-${{ hashFiles('.ruby-version') }}-${{ hashFiles('Gemfile.lock') }}
restore-keys: |
gem-trixie-${{ hashFiles('.ruby-version') }}-
- name: Cache NPM
uses: runs-on/cache@v4
uses: runs-on/cache@v5
with:
path: cache/node
key: node-${{ hashFiles('package.json', 'frontend/package-lock.json') }}
restore-keys: |
node-
- name: Cache ANGULAR
uses: runs-on/cache@v4
uses: runs-on/cache@v5
with:
path: cache/angular
key: angular-${{ hashFiles('package.json', 'frontend/package-lock.json') }}
restore-keys: |
angular-
- name: Cache TEST RUNTIME
uses: runs-on/cache@v4
uses: runs-on/cache@v5
with:
path: cache/runtime-logs
key: runtime-logs-${{ github.head_ref || github.ref }}-${{ github.sha }}
+2 -2
View File
@@ -32,7 +32,7 @@ jobs:
- name: Add comment if versions differ
if: steps.version-check.outputs.version_mismatch == 'true'
uses: marocchino/sticky-pull-request-comment@v2
uses: marocchino/sticky-pull-request-comment@v3
with:
header: version-mismatch-comment
message: |
@@ -50,7 +50,7 @@ jobs:
- The work package version OR your pull request target branch is correct
- name: Version check passed
if: steps.version-check.outputs.version_mismatch != 'true'
uses: marocchino/sticky-pull-request-comment@v2
uses: marocchino/sticky-pull-request-comment@v3
with:
header: version-mismatch-comment
delete: true
+12 -5
View File
@@ -60,7 +60,8 @@ Layout/MultilineOperationIndentation:
Enabled: false
Lint/AmbiguousBlockAssociation:
AllowedMethods: [change]
AllowedMethods:
- change
Lint/AmbiguousOperator:
Enabled: false
@@ -147,9 +148,9 @@ Naming/PredicatePrefix:
Naming/VariableNumber:
AllowedPatterns:
- '\w_20\d\d' # allow dates like christmas_2022 or date_2034_04_12
- '\w\d++(_\d++)+' # allow hierarchical data like child1_2_5 (second + in regex is possessive qualifier)
- 'custom_field_\d+' # allow custom field method names to be called with send :custom_field_1001
- "\\w_20\\d\\d" # allow dates like christmas_2022 or date_2034_04_12
- "\\w\\d++(_\\d++)+" # allow hierarchical data like child1_2_5 (second + in regex is possessive qualifier)
- "custom_field_\\d+" # allow custom field method names to be called with send :custom_field_1001
OpenProject/AddPreviewForViewComponent:
Include:
@@ -181,6 +182,10 @@ Rails/DynamicFindBy:
- find_by_login
- find_by_mail
- find_by_plaintext_value
- find_by_rss_key
- find_by_unique
- find_by_unique!
- find_by_api_key
# Allow reorder to prevent find each cop triggering
Rails/FindEach:
@@ -333,6 +338,7 @@ RSpec/SpecFilePathFormat:
CustomTransform:
OpenIDConnect: openid_connect
OAuthClients: oauth_clients
XWiki: xwiki
XWikiProviders: xwiki_providers
EnforcedInflector: active_support
IgnoreMethods: true
@@ -402,7 +408,8 @@ Style/FormatString:
Enabled: false
Style/FormatStringToken:
AllowedMethods: [redirect]
AllowedMethods:
- redirect
Style/FrozenStringLiteralComment:
Enabled: true
+7 -7
View File
@@ -124,10 +124,10 @@ gem "sys-filesystem", "~> 1.5.0", require: false
gem "bcrypt", "~> 3.1.22"
gem "multi_json", "~> 1.20.0"
gem "oj", "~> 3.16.16"
gem "oj", "~> 3.17.0"
gem "daemons"
gem "good_job", "~> 4.14.2" # update should be done manually in sync with saas-openproject version.
gem "good_job", "~> 4.18.1" # update should be done manually in sync with saas-openproject version.
gem "rack-protection", "~> 3.2.0"
@@ -161,7 +161,7 @@ gem "ttfunk", "~> 1.7.0" # remove after https://github.com/prawnpdf/prawn/issues
# prawn implicitly depends on matrix gem no longer in ruby core with 3.1
gem "matrix", "~> 0.4.3"
gem "mcp", "~> 0.10.0"
gem "mcp", "~> 0.14.0"
gem "meta-tags", "~> 2.23.0"
@@ -237,10 +237,10 @@ gem "yabeda-rails"
# opentelemetry
gem "opentelemetry-exporter-otlp", "~> 0.33.0", require: false
gem "opentelemetry-instrumentation-all", "~> 0.91.0", require: false
gem "opentelemetry-instrumentation-all", "~> 0.93.0", require: false
gem "opentelemetry-sdk", "~> 1.10", require: false
gem "view_component", "~> 4.6.0"
gem "view_component", "~> 4.8.0"
# Lookbook
gem "lookbook", "2.3.14"
@@ -384,7 +384,7 @@ group :development, :test do
gem "active_record_doctor", "~> 2.0.1"
end
gem "bootsnap", "~> 1.23.0", require: false
gem "bootsnap", "~> 1.24.0", require: false
# API gems
gem "grape", "~> 3.2.0"
@@ -405,7 +405,7 @@ gem "disposable", "~> 0.6.2"
gem "dentaku", "~> 3.5"
# Used for more powerful counter caches
gem "counter_culture", "~> 3.11"
gem "counter_culture", "~> 3.13"
group :postgres do
gem "pg", "~> 1.6.2"
+244 -245
View File
@@ -356,8 +356,8 @@ GEM
awesome_nested_set (3.9.0)
activerecord (>= 4.0.0, < 8.2)
aws-eventstream (1.4.0)
aws-partitions (1.1238.0)
aws-sdk-core (3.244.0)
aws-partitions (1.1242.0)
aws-sdk-core (3.246.0)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9)
@@ -365,10 +365,10 @@ GEM
bigdecimal
jmespath (~> 1, >= 1.6.1)
logger
aws-sdk-kms (1.123.0)
aws-sdk-kms (1.124.0)
aws-sdk-core (~> 3, >= 3.244.0)
aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.219.0)
aws-sdk-s3 (1.220.0)
aws-sdk-core (~> 3, >= 3.244.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
@@ -377,12 +377,12 @@ GEM
aws-sigv4 (~> 1.5)
aws-sigv4 (1.12.1)
aws-eventstream (~> 1, >= 1.0.2)
axe-core-api (4.11.2)
axe-core-api (4.11.3)
dumb_delegator
ostruct
virtus
axe-core-rspec (4.11.2)
axe-core-api (= 4.11.2)
axe-core-rspec (4.11.3)
axe-core-api (= 4.11.3)
dumb_delegator
ostruct
virtus
@@ -400,9 +400,9 @@ GEM
erubi (~> 1.4)
parser (>= 2.4)
smart_properties
bigdecimal (4.1.1)
bigdecimal (4.1.2)
bindata (2.5.1)
bootsnap (1.23.0)
bootsnap (1.24.1)
msgpack (~> 1.2)
brakeman (8.0.4)
racc
@@ -462,14 +462,14 @@ GEM
cose (1.3.1)
cbor (~> 0.5.9)
openssl-signature_algorithm (~> 1.0)
counter_culture (3.13.0)
counter_culture (3.13.1)
activerecord (>= 4.2)
activesupport (>= 4.2)
crack (1.0.1)
bigdecimal
rexml
crass (1.0.6)
css_parser (2.0.0)
css_parser (2.1.0)
addressable
csv (3.3.5)
cuprite (0.17)
@@ -517,7 +517,7 @@ GEM
concurrent-ruby (~> 1.0)
dry-core (~> 1.1)
zeitwerk (~> 2.6)
dry-monads (1.9.0)
dry-monads (1.10.0)
concurrent-ruby (~> 1.0)
dry-core (~> 1.1)
zeitwerk (~> 2.6)
@@ -558,7 +558,7 @@ GEM
activemodel
equivalent-xml (0.6.0)
nokogiri (>= 1.4.3)
erb (6.0.3)
erb (6.0.4)
erb_lint (0.9.0)
activesupport
better_html (>= 2.0.1)
@@ -603,7 +603,7 @@ GEM
ffi (1.17.4-x86_64-linux-gnu)
ffi (1.17.4-x86_64-linux-musl)
flamegraph (0.9.5)
fog-aws (3.33.1)
fog-aws (3.33.2)
base64 (>= 0.2, < 0.4)
fog-core (~> 2.6)
fog-json (~> 1.1)
@@ -613,7 +613,7 @@ GEM
excon (~> 1.0)
formatador (>= 0.2, < 2.0)
mime-types
fog-json (1.2.0)
fog-json (1.3.0)
fog-core
multi_json (~> 1.10)
fog-xml (0.1.5)
@@ -633,7 +633,7 @@ GEM
glob (0.4.0)
globalid (1.3.0)
activesupport (>= 6.1)
good_job (4.14.2)
good_job (4.18.1)
activejob (>= 6.1.0)
activerecord (>= 6.1.0)
concurrent-ruby (>= 1.3.1)
@@ -648,7 +648,7 @@ GEM
mini_mime (~> 1.1)
representable (~> 3.0)
retriable (~> 3.1)
google-apis-gmail_v1 (0.47.0)
google-apis-gmail_v1 (0.48.0)
google-apis-core (>= 0.15.0, < 2.a)
google-cloud-env (2.3.1)
base64 (~> 0.2)
@@ -685,7 +685,7 @@ GEM
multi_json (~> 1.11)
os (>= 0.9, < 2.0)
signet (>= 0.16, < 2.a)
grape (3.2.0)
grape (3.2.1)
activesupport (>= 7.2)
dry-configurable
dry-types (>= 1.1)
@@ -745,16 +745,16 @@ GEM
nokogiri (>= 1.6)
interception (0.5)
io-console (0.8.2)
irb (1.17.0)
irb (1.18.0)
pp (>= 0.6.0)
prism (>= 1.3.0)
rdoc (>= 4.0.0)
reline (>= 0.4.2)
iso8601 (0.13.0)
jmespath (1.6.2)
job-iteration (1.13.0)
job-iteration (1.13.1)
activejob (>= 7.0)
json (2.19.3)
json (2.19.5)
json-jwt (1.17.0)
activesupport (>= 4.2)
aes_key_wrap
@@ -828,7 +828,7 @@ GEM
marcel (1.0.4)
markly (0.16.0)
matrix (0.4.3)
mcp (0.10.0)
mcp (0.14.0)
json-schema (>= 4.1)
messagebird-rest (5.0.0)
jwt (< 4)
@@ -838,21 +838,21 @@ GEM
mime-types (3.7.0)
logger
mime-types-data (~> 3.2025, >= 3.2025.0507)
mime-types-data (3.2026.0407)
mime-types-data (3.2026.0414)
mini_magick (5.3.1)
logger
mini_mime (1.1.5)
minitest (6.0.4)
minitest (6.0.6)
drb (~> 2.0)
prism (~> 1.5)
msgpack (1.8.0)
multi_json (1.20.1)
mustermann (3.1.0)
mustermann (4.0.0)
mustermann-grape (1.1.0)
mustermann (>= 1.0.0)
net-http (0.9.1)
uri (>= 0.11.1)
net-imap (0.6.3)
net-imap (0.6.4)
date
net-protocol
net-ldap (0.20.0)
@@ -865,23 +865,23 @@ GEM
net-smtp (0.5.1)
net-protocol
nio4r (2.7.5)
nokogiri (1.19.2-aarch64-linux-gnu)
nokogiri (1.19.3-aarch64-linux-gnu)
racc (~> 1.4)
nokogiri (1.19.2-aarch64-linux-musl)
nokogiri (1.19.3-aarch64-linux-musl)
racc (~> 1.4)
nokogiri (1.19.2-arm-linux-gnu)
nokogiri (1.19.3-arm-linux-gnu)
racc (~> 1.4)
nokogiri (1.19.2-arm-linux-musl)
nokogiri (1.19.3-arm-linux-musl)
racc (~> 1.4)
nokogiri (1.19.2-arm64-darwin)
nokogiri (1.19.3-arm64-darwin)
racc (~> 1.4)
nokogiri (1.19.2-x86_64-darwin)
nokogiri (1.19.3-x86_64-darwin)
racc (~> 1.4)
nokogiri (1.19.2-x86_64-linux-gnu)
nokogiri (1.19.3-x86_64-linux-gnu)
racc (~> 1.4)
nokogiri (1.19.2-x86_64-linux-musl)
nokogiri (1.19.3-x86_64-linux-musl)
racc (~> 1.4)
oj (3.16.17)
oj (3.17.0)
bigdecimal (>= 3.0)
ostruct (>= 0.2)
okcomputer (1.19.1)
@@ -929,155 +929,155 @@ GEM
opentelemetry-common (~> 0.20)
opentelemetry-sdk (~> 1.10)
opentelemetry-semantic_conventions
opentelemetry-helpers-mysql (0.5.0)
opentelemetry-helpers-mysql (0.6.0)
opentelemetry-api (~> 1.7)
opentelemetry-common (~> 0.21)
opentelemetry-helpers-sql (0.3.0)
opentelemetry-helpers-sql (0.4.0)
opentelemetry-api (~> 1.7)
opentelemetry-helpers-sql-processor (0.4.0)
opentelemetry-helpers-sql-processor (0.5.0)
opentelemetry-api (~> 1.0)
opentelemetry-common (~> 0.21)
opentelemetry-instrumentation-action_mailer (0.6.1)
opentelemetry-instrumentation-action_mailer (0.8.0)
opentelemetry-instrumentation-active_support (~> 0.10)
opentelemetry-instrumentation-action_pack (0.16.0)
opentelemetry-instrumentation-action_pack (0.18.0)
opentelemetry-instrumentation-rack (~> 0.29)
opentelemetry-instrumentation-action_view (0.11.2)
opentelemetry-instrumentation-action_view (0.13.0)
opentelemetry-instrumentation-active_support (~> 0.10)
opentelemetry-instrumentation-active_job (0.10.1)
opentelemetry-instrumentation-active_job (0.12.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-active_model_serializers (0.24.0)
opentelemetry-instrumentation-active_model_serializers (0.25.0)
opentelemetry-instrumentation-active_support (>= 0.7.0)
opentelemetry-instrumentation-active_record (0.11.1)
opentelemetry-instrumentation-active_record (0.13.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-active_storage (0.3.1)
opentelemetry-instrumentation-active_storage (0.5.0)
opentelemetry-instrumentation-active_support (~> 0.10)
opentelemetry-instrumentation-active_support (0.10.1)
opentelemetry-instrumentation-active_support (0.12.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-all (0.91.0)
opentelemetry-instrumentation-active_model_serializers (~> 0.24.0)
opentelemetry-instrumentation-anthropic (~> 0.4.0)
opentelemetry-instrumentation-aws_lambda (~> 0.6.0)
opentelemetry-instrumentation-aws_sdk (~> 0.11.0)
opentelemetry-instrumentation-bunny (~> 0.24.0)
opentelemetry-instrumentation-concurrent_ruby (~> 0.24.0)
opentelemetry-instrumentation-dalli (~> 0.29.2)
opentelemetry-instrumentation-delayed_job (~> 0.25.1)
opentelemetry-instrumentation-ethon (~> 0.28.0)
opentelemetry-instrumentation-excon (~> 0.28.0)
opentelemetry-instrumentation-faraday (~> 0.32.0)
opentelemetry-instrumentation-grape (~> 0.6.0)
opentelemetry-instrumentation-graphql (~> 0.31.2)
opentelemetry-instrumentation-grpc (~> 0.4.1)
opentelemetry-instrumentation-gruf (~> 0.5.0)
opentelemetry-instrumentation-http (~> 0.29.0)
opentelemetry-instrumentation-http_client (~> 0.28.0)
opentelemetry-instrumentation-httpx (~> 0.7.0)
opentelemetry-instrumentation-koala (~> 0.23.0)
opentelemetry-instrumentation-lmdb (~> 0.25.0)
opentelemetry-instrumentation-mongo (~> 0.25.0)
opentelemetry-instrumentation-mysql2 (~> 0.33.0)
opentelemetry-instrumentation-net_http (~> 0.28.0)
opentelemetry-instrumentation-pg (~> 0.35.0)
opentelemetry-instrumentation-que (~> 0.12.0)
opentelemetry-instrumentation-racecar (~> 0.6.1)
opentelemetry-instrumentation-rack (~> 0.30.0)
opentelemetry-instrumentation-rails (~> 0.40.0)
opentelemetry-instrumentation-rake (~> 0.5.0)
opentelemetry-instrumentation-rdkafka (~> 0.9.0)
opentelemetry-instrumentation-redis (~> 0.28.0)
opentelemetry-instrumentation-resque (~> 0.8.0)
opentelemetry-instrumentation-restclient (~> 0.27.0)
opentelemetry-instrumentation-ruby_kafka (~> 0.24.0)
opentelemetry-instrumentation-sidekiq (~> 0.28.1)
opentelemetry-instrumentation-sinatra (~> 0.29.0)
opentelemetry-instrumentation-trilogy (~> 0.67.0)
opentelemetry-instrumentation-anthropic (0.4.0)
opentelemetry-instrumentation-all (0.93.0)
opentelemetry-instrumentation-active_model_serializers (~> 0.25.0)
opentelemetry-instrumentation-anthropic (~> 0.5.0)
opentelemetry-instrumentation-aws_lambda (~> 0.7.0)
opentelemetry-instrumentation-aws_sdk (~> 0.12.0)
opentelemetry-instrumentation-bunny (~> 0.25.0)
opentelemetry-instrumentation-concurrent_ruby (~> 0.25.0)
opentelemetry-instrumentation-dalli (~> 0.30.0)
opentelemetry-instrumentation-delayed_job (~> 0.26.0)
opentelemetry-instrumentation-ethon (~> 0.29.0)
opentelemetry-instrumentation-excon (~> 0.29.0)
opentelemetry-instrumentation-faraday (~> 0.33.0)
opentelemetry-instrumentation-grape (~> 0.7.0)
opentelemetry-instrumentation-graphql (~> 0.32.0)
opentelemetry-instrumentation-grpc (~> 0.5.0)
opentelemetry-instrumentation-gruf (~> 0.6.0)
opentelemetry-instrumentation-http (~> 0.30.0)
opentelemetry-instrumentation-http_client (~> 0.29.0)
opentelemetry-instrumentation-httpx (~> 0.8.0)
opentelemetry-instrumentation-koala (~> 0.24.0)
opentelemetry-instrumentation-lmdb (~> 0.26.0)
opentelemetry-instrumentation-mongo (~> 0.26.0)
opentelemetry-instrumentation-mysql2 (~> 0.34.0)
opentelemetry-instrumentation-net_http (~> 0.29.0)
opentelemetry-instrumentation-pg (~> 0.36.0)
opentelemetry-instrumentation-que (~> 0.13.0)
opentelemetry-instrumentation-racecar (~> 0.7.0)
opentelemetry-instrumentation-rack (~> 0.31.0)
opentelemetry-instrumentation-rails (~> 0.42.0)
opentelemetry-instrumentation-rake (~> 0.6.0)
opentelemetry-instrumentation-rdkafka (~> 0.10.0)
opentelemetry-instrumentation-redis (~> 0.29.0)
opentelemetry-instrumentation-resque (~> 0.9.0)
opentelemetry-instrumentation-restclient (~> 0.28.0)
opentelemetry-instrumentation-ruby_kafka (~> 0.25.0)
opentelemetry-instrumentation-sidekiq (~> 0.29.0)
opentelemetry-instrumentation-sinatra (~> 0.30.0)
opentelemetry-instrumentation-trilogy (~> 0.68.0)
opentelemetry-instrumentation-anthropic (0.5.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-aws_lambda (0.6.0)
opentelemetry-instrumentation-aws_lambda (0.7.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-aws_sdk (0.11.0)
opentelemetry-instrumentation-aws_sdk (0.12.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-base (0.25.0)
opentelemetry-instrumentation-base (0.26.0)
opentelemetry-api (~> 1.7)
opentelemetry-common (~> 0.21)
opentelemetry-registry (~> 0.1)
opentelemetry-instrumentation-bunny (0.24.0)
opentelemetry-instrumentation-bunny (0.25.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-concurrent_ruby (0.24.0)
opentelemetry-instrumentation-concurrent_ruby (0.25.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-dalli (0.29.2)
opentelemetry-instrumentation-dalli (0.30.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-delayed_job (0.25.1)
opentelemetry-instrumentation-delayed_job (0.26.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-ethon (0.28.0)
opentelemetry-instrumentation-ethon (0.29.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-excon (0.28.0)
opentelemetry-instrumentation-excon (0.29.1)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-faraday (0.32.0)
opentelemetry-instrumentation-faraday (0.33.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-grape (0.6.0)
opentelemetry-instrumentation-grape (0.7.0)
opentelemetry-instrumentation-rack (~> 0.29)
opentelemetry-instrumentation-graphql (0.31.2)
opentelemetry-instrumentation-graphql (0.32.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-grpc (0.4.1)
opentelemetry-instrumentation-grpc (0.5.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-gruf (0.5.0)
opentelemetry-instrumentation-gruf (0.6.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-http (0.29.0)
opentelemetry-instrumentation-http (0.30.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-http_client (0.28.0)
opentelemetry-instrumentation-http_client (0.29.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-httpx (0.7.0)
opentelemetry-instrumentation-httpx (0.8.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-koala (0.23.0)
opentelemetry-instrumentation-koala (0.24.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-lmdb (0.25.0)
opentelemetry-instrumentation-lmdb (0.26.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-mongo (0.25.1)
opentelemetry-instrumentation-mongo (0.26.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-mysql2 (0.33.0)
opentelemetry-instrumentation-mysql2 (0.34.0)
opentelemetry-helpers-mysql
opentelemetry-helpers-sql
opentelemetry-helpers-sql-processor
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-net_http (0.28.0)
opentelemetry-instrumentation-net_http (0.29.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-pg (0.35.0)
opentelemetry-instrumentation-pg (0.36.0)
opentelemetry-helpers-sql
opentelemetry-helpers-sql-processor
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-que (0.12.0)
opentelemetry-instrumentation-que (0.13.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-racecar (0.6.1)
opentelemetry-instrumentation-racecar (0.7.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-rack (0.30.0)
opentelemetry-instrumentation-rack (0.31.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-rails (0.40.0)
opentelemetry-instrumentation-action_mailer (~> 0.6)
opentelemetry-instrumentation-action_pack (~> 0.15)
opentelemetry-instrumentation-action_view (~> 0.11)
opentelemetry-instrumentation-active_job (~> 0.10)
opentelemetry-instrumentation-active_record (~> 0.11)
opentelemetry-instrumentation-active_storage (~> 0.3)
opentelemetry-instrumentation-active_support (~> 0.10)
opentelemetry-instrumentation-concurrent_ruby (~> 0.23)
opentelemetry-instrumentation-rake (0.5.0)
opentelemetry-instrumentation-rails (0.42.0)
opentelemetry-instrumentation-action_mailer (~> 0.7)
opentelemetry-instrumentation-action_pack (~> 0.17)
opentelemetry-instrumentation-action_view (~> 0.12)
opentelemetry-instrumentation-active_job (~> 0.11)
opentelemetry-instrumentation-active_record (~> 0.12)
opentelemetry-instrumentation-active_storage (~> 0.4)
opentelemetry-instrumentation-active_support (~> 0.11)
opentelemetry-instrumentation-concurrent_ruby (~> 0.25)
opentelemetry-instrumentation-rake (0.6.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-rdkafka (0.9.0)
opentelemetry-instrumentation-rdkafka (0.10.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-redis (0.28.0)
opentelemetry-instrumentation-redis (0.29.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-resque (0.8.0)
opentelemetry-instrumentation-resque (0.9.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-restclient (0.27.0)
opentelemetry-instrumentation-restclient (0.28.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-ruby_kafka (0.24.0)
opentelemetry-instrumentation-ruby_kafka (0.25.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-sidekiq (0.28.1)
opentelemetry-instrumentation-sidekiq (0.29.0)
opentelemetry-instrumentation-base (~> 0.25)
opentelemetry-instrumentation-sinatra (0.29.0)
opentelemetry-instrumentation-sinatra (0.30.0)
opentelemetry-instrumentation-rack (~> 0.29)
opentelemetry-instrumentation-trilogy (0.67.0)
opentelemetry-instrumentation-trilogy (0.68.0)
opentelemetry-helpers-mysql
opentelemetry-helpers-sql
opentelemetry-helpers-sql-processor
@@ -1096,16 +1096,16 @@ GEM
optimist (3.2.1)
os (1.1.4)
ostruct (0.6.3)
ox (2.14.23)
ox (2.14.25)
bigdecimal (>= 3.0)
pagy (43.5.1)
pagy (43.5.3)
json
uri
yaml
paper_trail (17.0.0)
activerecord (>= 7.1)
request_store (~> 1.4)
parallel (2.0.1)
parallel (2.1.0)
parallel_tests (4.10.1)
parallel
parser (3.3.11.1)
@@ -1198,8 +1198,8 @@ GEM
multi_json
puma (7.2.0)
nio4r (~> 2.0)
puma-plugin-statsd (2.7.0)
puma (>= 5.0, < 8)
puma-plugin-statsd (2.8.0)
puma (>= 5.0, < 9)
raabro (1.4.0)
racc (1.8.1)
rack (2.2.23)
@@ -1269,13 +1269,12 @@ GEM
zeitwerk (~> 2.6)
rainbow (3.1.1)
rake (13.4.2)
rake-compiler-dock (1.11.0)
rake-compiler-dock (1.12.0)
rb-fsevent (0.11.2)
rb-inotify (0.11.1)
ffi (~> 1.0)
rb_sys (0.9.126)
json (>= 2)
rake-compiler-dock (= 1.11.0)
rb_sys (0.9.127)
rake-compiler-dock (= 1.12.0)
rbtrace (0.5.3)
ffi (>= 1.0.6)
msgpack (>= 0.4.3)
@@ -1349,9 +1348,9 @@ GEM
rubocop-ast (1.49.1)
parser (>= 3.3.7.2)
prism (~> 1.7)
rubocop-capybara (2.22.1)
rubocop-capybara (2.23.0)
lint_roller (~> 1.1)
rubocop (~> 1.72, >= 1.72.1)
rubocop (~> 1.81)
rubocop-factory_bot (2.28.0)
lint_roller (~> 1.1)
rubocop (~> 1.72, >= 1.72.1)
@@ -1421,7 +1420,7 @@ GEM
multi_json (~> 1.10)
simpleidn (0.2.3)
smart_properties (1.17.0)
spreadsheet (1.3.4)
spreadsheet (1.3.5)
bigdecimal
logger
ruby-ole
@@ -1477,7 +1476,7 @@ GEM
turbo-rails (>= 1.3.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
tzinfo-data (1.2026.1)
tzinfo-data (1.2026.2)
tzinfo (>= 1.0.0)
uber (0.1.0)
unicode-display_width (3.2.0)
@@ -1493,7 +1492,7 @@ GEM
public_suffix
vcr (6.4.0)
vernier (1.10.0)
view_component (4.6.0)
view_component (4.8.0)
actionview (>= 7.1.0)
activesupport (>= 7.1.0)
concurrent-ruby (~> 1)
@@ -1554,7 +1553,7 @@ GEM
railties
yabeda (~> 0.8)
yaml (0.4.0)
yard (0.9.42)
yard (0.9.43)
zeitwerk (2.7.5)
PLATFORMS
@@ -1587,7 +1586,7 @@ DEPENDENCIES
aws-sdk-s3 (~> 1.217)
axe-core-rspec
bcrypt (~> 3.1.22)
bootsnap (~> 1.23.0)
bootsnap (~> 1.24.0)
brakeman (~> 8.0.1)
browser (~> 6.2.0)
budgets!
@@ -1604,7 +1603,7 @@ DEPENDENCIES
compare-xml (~> 0.66)
connection_pool (~> 3.0.2)
costs!
counter_culture (~> 3.11)
counter_culture (~> 3.13)
csv (~> 3.3)
cuprite (~> 0.17.0)
daemons
@@ -1631,7 +1630,7 @@ DEPENDENCIES
friendly_id (~> 5.6.0)
fuubar (~> 2.5.0)
globalid (~> 1.3)
good_job (~> 4.14.2)
good_job (~> 4.18.1)
google-apis-gmail_v1
googleauth
grape (~> 3.2.0)
@@ -1657,7 +1656,7 @@ DEPENDENCIES
mail (= 2.9.0)
markly (~> 0.15)
matrix (~> 0.4.3)
mcp (~> 0.10.0)
mcp (~> 0.14.0)
md_to_pdf!
meta-tags (~> 2.23.0)
mini_magick (~> 5.3.0)
@@ -1665,7 +1664,7 @@ DEPENDENCIES
my_page!
net-ldap (~> 0.20.0)
nokogiri (~> 1.19.2)
oj (~> 3.16.16)
oj (~> 3.17.0)
okcomputer (~> 1.19.1)
omniauth!
omniauth-openid-connect!
@@ -1699,7 +1698,7 @@ DEPENDENCIES
openproject-wikis!
openproject-xls_export!
opentelemetry-exporter-otlp (~> 0.33.0)
opentelemetry-instrumentation-all (~> 0.91.0)
opentelemetry-instrumentation-all (~> 0.93.0)
opentelemetry-sdk (~> 1.10)
overviews!
ox
@@ -1783,7 +1782,7 @@ DEPENDENCIES
validate_url
vcr
vernier
view_component (~> 4.6.0)
view_component (~> 4.8.0)
warden (~> 1.2)
warden-basic_auth (~> 0.2.1)
webmock (~> 3.26)
@@ -1829,22 +1828,22 @@ CHECKSUMS
auto_strip_attributes (2.6.0) sha256=a7e2e0cf744de2bcd947fd68014220702bcc88c81274c1cd9ce6f7316aae39b0
awesome_nested_set (3.9.0) sha256=3ce99e816550f97f4de118e621630070aacf24928b920fe4a68846578a8daaed
aws-eventstream (1.4.0) sha256=116bf85c436200d1060811e6f5d2d40c88f65448f2125bc77ffce5121e6e183b
aws-partitions (1.1238.0) sha256=fa3d1bdea6d7e7619e8cee22ebce8a569d2119296d3ec8c5f9b9b7c81fb0602c
aws-sdk-core (3.244.0) sha256=3e458c078b0c5bdee95bc370c3a483374b3224cf730c1f9f0faf849a5d9a18ea
aws-sdk-kms (1.123.0) sha256=d405f37e82f8fa32045ca8980be266c0b45b37aaf2012afe0254321a1e811f20
aws-sdk-s3 (1.219.0) sha256=6a755d7377978525758b3c29185ca6a10128ce2b07555ca37c4549de10c2f1c7
aws-partitions (1.1242.0) sha256=58886ab5484ccf9287a8d55e603c3c0fb004241dfb4c0c7690b67d18e4c39352
aws-sdk-core (3.246.0) sha256=393864ec8948560e69fcccc2e4d256b40c7028eb98930608dd295279e3c4ddcc
aws-sdk-kms (1.124.0) sha256=40d00ab706d7e49fd620270bd0dcb546f266295abdd49b54fec2611e2a41f37c
aws-sdk-s3 (1.220.0) sha256=237fda5e6ac7ecdd9c848e27187bfdc370edad5c5a141aeec389fb450fa28c7c
aws-sdk-sns (1.113.0) sha256=15fe37d010e86f4c28b4c2f2133c463ce5c14189ec3673a1f43c30dfee511b0f
aws-sigv4 (1.12.1) sha256=6973ff95cb0fd0dc58ba26e90e9510a2219525d07620c8babeb70ef831826c00
axe-core-api (4.11.2) sha256=c05c342941e0c29f17b00268302457da9e7b644f753c8bbab274d0083319344f
axe-core-rspec (4.11.2) sha256=50c5a5f1b4b991da6857c5df4d6645dfac285a84c7f7f904a6ef23e53f4895eb
axe-core-api (4.11.3) sha256=f5f6e802743644a50e2d8ef24c22aefbb6df49dd169024ff0144b47f37e652ba
axe-core-rspec (4.11.3) sha256=246c8d443517354e9a9962a10a8cc456bcef4c617516c0924b051a9af9d7da99
axiom-types (0.1.1) sha256=c1ff113f3de516fa195b2db7e0a9a95fd1b08475a502ff660d04507a09980383
base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
bcrypt (3.1.22) sha256=1f0072e88c2d705d94aff7f2c5cb02eb3f1ec4b8368671e19112527489f29032
benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c
better_html (2.2.0) sha256=e68ab66ab09696b708333bbf35e8aa3c107500ba7892f528e2111624bdd8cf76
bigdecimal (4.1.1) sha256=1c09efab961da45203c8316b0cdaec0ff391dfadb952dd459584b63ebf8054ca
bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd
bindata (2.5.1) sha256=53186a1ec2da943d4cb413583d680644eb810aacbf8902497aac8f191fad9e58
bootsnap (1.23.0) sha256=c1254f458d58558b58be0f8eb8f6eec2821456785b7cdd1e16248e2020d3f214
bootsnap (1.24.1) sha256=d7faea1dc24aa5b22dacc049c9236b64ebf60b14dd49c615e15d8402375d39ef
brakeman (8.0.4) sha256=7bf921fa9638544835df9aa7b3e720a9a72c0267f34f92135955edd80d4dcf6f
browser (6.2.0) sha256=281d5295788825c9396427c292c2d2be0a5c91875c93c390fde6e5d61a5ace2d
budgets (1.0.0)
@@ -1877,10 +1876,10 @@ CHECKSUMS
cookiejar (0.3.4) sha256=11b16acfc4baf7a0f463c21a6212005e04e25f5554d4d9f24d97f3492dfda0df
cose (1.3.1) sha256=d5d4dbcd6b035d513edc4e1ab9bc10e9ce13b4011c96e3d1b8fe5e6413fd6de5
costs (1.0.0)
counter_culture (3.13.0) sha256=a2cde20642ddd27aec9ff0c09b73fa5b4fd729da368079e67c177bface3148bf
counter_culture (3.13.1) sha256=c297961933d9a9b96683fc298d68fde44039eca7c5876a2b05c3b180fe1c6328
crack (1.0.1) sha256=ff4a10390cd31d66440b7524eb1841874db86201d5b70032028553130b6d4c7e
crass (1.0.6) sha256=dc516022a56e7b3b156099abc81b6d2b08ea1ed12676ac7a5657617f012bd45d
css_parser (2.0.0) sha256=af5c759a127b125b635006a6c6c2e05b96a1ebdeec21b3c415fd5f09ec714a0a
css_parser (2.1.0) sha256=bfb7c9cf3896426b53337e34b4ad391c3cfe8c2f2c839e72f2cdccf615fb5247
csv (3.3.5) sha256=6e5134ac3383ef728b7f02725d9872934f523cb40b961479f69cf3afa6c8e73f
cuprite (0.17) sha256=b140d5dc70d08b97ad54bcf45cd95d0bd430e291e9dffe76fff851fddd57c12b
daemons (1.4.1) sha256=8fc76d76faec669feb5e455d72f35bd4c46dc6735e28c420afb822fac1fa9a1d
@@ -1903,7 +1902,7 @@ CHECKSUMS
dry-inflector (1.3.1) sha256=7fb0c2bb04f67638f25c52e7ba39ab435d922a3a5c3cd196120f63accb682dcc
dry-initializer (3.2.0) sha256=37d59798f912dc0a1efe14a4db4a9306989007b302dcd5f25d0a2a20c166c4e3
dry-logic (1.6.0) sha256=da6fedbc0f90fc41f9b0cc7e6f05f5d529d1efaef6c8dcc8e0733f685745cea2
dry-monads (1.9.0) sha256=9348a67b5c862c7a876342dbd94737fdf3fb3c17978382cf6801a85b27215816
dry-monads (1.10.0) sha256=68c90d77617c6ce88d60704fc3b233907e6320974152fe75ad947f968006ca39
dry-schema (1.16.0) sha256=cd3aaeabc0f1af66ec82a29096d4c4fb92a0a58b9dae29a22b1bbceb78985727
dry-types (1.9.1) sha256=baebeecdb9f8395d6c9d227b62011279440943e3ef2468fe8ccc1ba11467f178
dry-validation (1.11.1) sha256=70900bb5a2d911c8aab566d3e360c6bff389b8bf92ea8e04885ce51c41ff8085
@@ -1913,7 +1912,7 @@ CHECKSUMS
em-synchrony (1.0.6) sha256=6e7470a684d9bbc00d61d552911b65711540bd89e95c157156f5aacdd6f306ca
email_validator (2.2.4) sha256=5ab238095bec7aef9389f230e9e0c64c5081cdf91f19d6c5cecee0a93af20604
equivalent-xml (0.6.0) sha256=8919761efa848ad0846369ff8be1f646b17e5061698c4867b09829000cc3f487
erb (6.0.3) sha256=e43685a8a0a0ea6a924871b2162e8953ef73147ce46b75b36d1f6774fd286e91
erb (6.0.4) sha256=38e3803694be357fe2bfe312487c74beaf9fb4e5beb3e22498952fe1645b95d9
erb_lint (0.9.0) sha256=dfb5e40ad839e8d1f0d56ca85ec9a7ac4c9cd966ec281138282f35b323ca7c31
erblint-github (1.0.1) sha256=9f28f7dc381a0dc68a0093ef7af3424ed9d2bb2b3e39bdc8e8cba86a0d31f2d0
erubi (1.13.1) sha256=a082103b0885dbc5ecf1172fede897f9ebdb745a4b97a5e8dc63953db1ee4ad9
@@ -1937,9 +1936,9 @@ CHECKSUMS
ffi (1.17.4-x86_64-linux-gnu) sha256=9d3db14c2eae074b382fa9c083fe95aec6e0a1451da249eab096c34002bc752d
ffi (1.17.4-x86_64-linux-musl) sha256=3fdf9888483de005f8ef8d1cf2d3b20d86626af206cbf780f6a6a12439a9c49e
flamegraph (0.9.5) sha256=a683020637ffa0e14a72640fa41babf14d926bfeaed87e31907cfd06ab2de8dc
fog-aws (3.33.1) sha256=20c7336ed978be6cbf2765844c53f30676288af98f1cb49945aa7b7b45a799a5
fog-aws (3.33.2) sha256=bd9c1b045f19daad8942d65d7e9c9c7c1cd144beeabde63e34df7c58a9bb0f5b
fog-core (2.6.0) sha256=3fe08aa83a23cddce42f4ba412040c08f890d7ff04c175c0ee59119371245be6
fog-json (1.2.0) sha256=dd4f5ab362dbc72b687240bba9d2dd841d5dfe888a285797533f85c03ea548fe
fog-json (1.3.0) sha256=8c2e4feb221c14f92ceeffb0aa5c8b6e8dd7c614a9141dfe7905f2dffebea217
fog-xml (0.1.5) sha256=52b9fea10701461dd3eaf9d9839702169b418dbbf50426786b9b74fade373bd6
formatador (1.2.3) sha256=19fa898133c2c26cdbb5d09f6998c1e137ad9427a046663e55adfe18b950d894
friendly_id (5.6.0) sha256=28e221cd53fbd21586321164c1c6fd0c9ba8dde13969cb2363679f44726bb0c3
@@ -1948,9 +1947,9 @@ CHECKSUMS
fuubar (2.5.1) sha256=b272a7804b282661c7fab583a3764f92543cb482c365ae39c685cd218fdd4880
glob (0.4.0) sha256=893dc9e2d24abe13dda907ce0cda576f680ff382f2a6cf9e543f98ecbe29238c
globalid (1.3.0) sha256=05c639ad6eb4594522a0b07983022f04aa7254626ab69445a0e493aa3786ff11
good_job (4.14.2) sha256=f38f164346aee724bbfbdaed73e1a0bd382cc6354146029e0adcc619245ab6d1
good_job (4.18.1) sha256=cdd3f764752c47ab5d52b71d6e09097572c51c0a48cabb86157d403ac5269972
google-apis-core (1.0.2) sha256=ba4579aaadc902d6cc7bc8db88f566ab00f5e31ea87ab41e9f9a032c470f2629
google-apis-gmail_v1 (0.47.0) sha256=3064434b6da55b85e2828ce4bb0f4d04e8cfd187a4ab262ceb1dcb01f98e49ef
google-apis-gmail_v1 (0.48.0) sha256=561534bb3d93610032720d0459153c432dc8e47e7096a1250fbe0ee8dcc6540c
google-cloud-env (2.3.1) sha256=0faac01eb27be78c2591d64433663b1a114f8f7af55a4f819755426cac9178e7
google-logging-utils (0.2.0) sha256=675462b4ea5affa825a3442694ca2d75d0069455a1d0956127207498fca3df7b
google-protobuf (4.34.1) sha256=347181542b8d659c60f028fa3791c9cccce651a91ad27782dbc5c5e374796cdc
@@ -1962,7 +1961,7 @@ CHECKSUMS
google-protobuf (4.34.1-x86_64-linux-musl) sha256=8c0e91436fbe504ffc64f0bd621f2e69adbcce8ed2c58439d7a21117069cfdd7
googleapis-common-protos-types (1.22.0) sha256=f97492b77bd6da0018c860d5004f512fe7cd165554d7019a8f4df6a56fbfc4c7
googleauth (1.16.2) sha256=15009502e2e38af71948cda918f230e27d327f6882a1e47967a5a4664930a638
grape (3.2.0) sha256=2aeeb020e5605f6314ce8ca8d30d90c9ee8f26bc959c5b34db7b8486764e4d2c
grape (3.2.1) sha256=448072f55904e5a4dca2e3781f0a373942514be65402cafb6177f5bc73db1b94
grape_logging (3.0.0) sha256=7b62d984ce96df15d120508668debe307e6a59ac1c511f1d9b5f3b4bea793e13
gravatar_image_tag (1.2.0) sha256=eb5630fea846b711e713b934a0178fb9785f02f4eb9ced8d6faa4d537c40fdcf
grids (1.0.0)
@@ -1988,11 +1987,11 @@ CHECKSUMS
inline_svg (1.10.0) sha256=5b652934236fd9f8adc61f3fd6e208b7ca3282698b19f28659971da84bf9a10f
interception (0.5) sha256=a53818d636752a8df90d8c1bb2f7b6e13a7b828543cb02b50fbde98b849d7907
io-console (0.8.2) sha256=d6e3ae7a7cc7574f4b8893b4fca2162e57a825b223a177b7afa236c5ef9814cc
irb (1.17.0) sha256=168c4ddb93d8a361a045c41d92b2952c7a118fa73f23fe14e55609eb7a863aae
irb (1.18.0) sha256=de9454a0703a54704b9811a5ef31a60c86949fbf4013fcf244fabc7c775248e3
iso8601 (0.13.0) sha256=298c2b15b7be5fa95a1372813d36a2257656cd8e906dfbc1f5cb409851425aa2
jmespath (1.6.2) sha256=238d774a58723d6c090494c8879b5e9918c19485f7e840f2c1c7532cf84ebcb1
job-iteration (1.13.0) sha256=3300844e81309fbd06fd2310d6aa8e1f43bf30fe03a3fc5067580b62f456b7e1
json (2.19.3) sha256=289b0bb53052a1fa8c34ab33cc750b659ba14a5c45f3fcf4b18762dc67c78646
job-iteration (1.13.1) sha256=af4d5ac624c35ed2f32ed78de92d4673f0a93212105b96d46877b8422e3ff5a3
json (2.19.5) sha256=218a18553e4801d579ca7e0f5bc72bafd776d7397238a1fb4e74db5b0a812c59
json-jwt (1.17.0) sha256=6ff99026b4c54281a9431179f76ceb81faa14772d710ef6169785199caadc4cc
json-schema (6.2.0) sha256=e8bff46ed845a22c1ab2bd0d7eccf831c01fe23bb3920caa4c74db4306813666
json_schemer (2.5.0) sha256=2f01fb4cce721a4e08dd068fc2030cffd0702a7f333f1ea2be6e8991f00ae396
@@ -2014,37 +2013,37 @@ CHECKSUMS
marcel (1.0.4) sha256=0d5649feb64b8f19f3d3468b96c680bae9746335d02194270287868a661516a4
markly (0.16.0) sha256=6f70d79e385b1efc9e171f74c81628826259039fe6c778e03c3924c71dac5511
matrix (0.4.3) sha256=a0d5ab7ddcc1973ff690ab361b67f359acbb16958d1dc072b8b956a286564c5b
mcp (0.10.0) sha256=09b9231eb16dff75cc7b8a95817c8acfcf4d1cab8d34f350671e43e765242b57
mcp (0.14.0) sha256=9e3ca2e6b5e568739e8c07090982829896f2e4d884ffbb668d06f0fe758489e1
md_to_pdf (0.2.6)
messagebird-rest (5.0.0) sha256=da4cc1efba3d5e4aa021fad07426c2cb6b326ce5670da5104bb8f6056a39d59c
meta-tags (2.23.0) sha256=ffe78b5bee398de4ff5ac3316f5a786049538a651643b8476def06c3acc762c1
method_source (1.1.0) sha256=181301c9c45b731b4769bc81e8860e72f9161ad7d66dd99103c9ab84f560f5c5
mime-types (3.7.0) sha256=dcebf61c246f08e15a4de34e386ebe8233791e868564a470c3fe77c00eed5e56
mime-types-data (3.2026.0407) sha256=909395cf029731355136527aa11bf58ea0655ee782359ccbf32c66238a8cadb3
mime-types-data (3.2026.0414) sha256=461c4c655373a44bd6c5fe54bcf5b7776026ea96e808144b1ec465c4b99148cc
mini_magick (5.3.1) sha256=29395dfd76badcabb6403ee5aff6f681e867074f8f28ce08d78661e9e4a351c4
mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef
minitest (6.0.4) sha256=df1304664589d40f46089247fdc451f866b0ce0d7cae1457a15fc1eb7d48dca1
minitest (6.0.6) sha256=153ea36d1d987a62942382b61075745042a2b3123b1cd48f4c3675af9cc7d6f1
msgpack (1.8.0) sha256=e64ce0212000d016809f5048b48eb3a65ffb169db22238fb4b72472fecb2d732
multi_json (1.20.1) sha256=2f3934e805cc45ef91b551a1f89d0e9191abd06a5e04a2ef09a6a036c452ca6d
mustermann (3.1.0) sha256=e73b006ffb7f743eae9303a7d6622e0dd9e1e5522718a2139c006085878768b9
mustermann (4.0.0) sha256=91f67411bb208d1d93c41e6128cb3b0f8ddd9ec7c45966f1007e1c43c08040d7
mustermann-grape (1.1.0) sha256=8d258a986004c8f01ce4c023c0b037c168a9ed889cf5778068ad54398fa458c5
my_page (1.0.0)
net-http (0.9.1) sha256=25ba0b67c63e89df626ed8fac771d0ad24ad151a858af2cc8e6a716ca4336996
net-imap (0.6.3) sha256=9bab75f876596d09ee7bf911a291da478e0cd6badc54dfb82874855ccc82f2ad
net-imap (0.6.4) sha256=9a5598c67a3022c284d98430ef1d4948e7dbdb62596f61081ea8ca933270a02b
net-ldap (0.20.0) sha256=b2080b350753a9ac4930869ded8e61a1d2151c01e03b0bf07b4675cbd9ce5372
net-pop (0.1.2) sha256=848b4e982013c15b2f0382792268763b748cce91c9e91e36b0f27ed26420dff3
net-protocol (0.2.2) sha256=aa73e0cba6a125369de9837b8d8ef82a61849360eba0521900e2c3713aa162a8
net-smtp (0.5.1) sha256=ed96a0af63c524fceb4b29b0d352195c30d82dd916a42f03c62a3a70e5b70736
nio4r (2.7.5) sha256=6c90168e48fb5f8e768419c93abb94ba2b892a1d0602cb06eef16d8b7df1dca1
nokogiri (1.19.2-aarch64-linux-gnu) sha256=c34d5c8208025587554608e98fd88ab125b29c80f9352b821964e9a5d5cfbd19
nokogiri (1.19.2-aarch64-linux-musl) sha256=7f6b4b0202d507326841a4f790294bf75098aef50c7173443812e3ac5cb06515
nokogiri (1.19.2-arm-linux-gnu) sha256=b7fa1139016f3dc850bda1260988f0d749934a939d04ef2da13bec060d7d5081
nokogiri (1.19.2-arm-linux-musl) sha256=61114d44f6742ff72194a1b3020967201e2eb982814778d130f6471c11f9828c
nokogiri (1.19.2-arm64-darwin) sha256=58d8ea2e31a967b843b70487a44c14c8ba1866daa1b9da9be9dbdf1b43dee205
nokogiri (1.19.2-x86_64-darwin) sha256=7d9af11fda72dfaa2961d8c4d5380ca0b51bc389dc5f8d4b859b9644f195e7a4
nokogiri (1.19.2-x86_64-linux-gnu) sha256=fa8feca882b73e871a9845f3817a72e9734c8e974bdc4fbad6e4bc6e8076b94f
nokogiri (1.19.2-x86_64-linux-musl) sha256=93128448e61a9383a30baef041bf1f5817e22f297a1d400521e90294445069a8
oj (3.16.17) sha256=a6688f666143632a1ef11a8d80c8d631b1112733c7da698ffafa4a22a8488244
nokogiri (1.19.3-aarch64-linux-gnu) sha256=46b89e5d7b9e844c2ee360794240c6ea2a4e6fa0c5892a4ed487db621224b639
nokogiri (1.19.3-aarch64-linux-musl) sha256=8392dfdcd21be7a94dbbe9ccc138dea01b97b24cb2dc02a114ca98bfb1d9a0b7
nokogiri (1.19.3-arm-linux-gnu) sha256=3919d5ffc334ad778a4a9eb88fda7dcb8b1fb58c8a52ac640c6dcd2f038e774f
nokogiri (1.19.3-arm-linux-musl) sha256=9ce1cb6346bb9c67b1550eb537aa183ead91e4b6eadb2f36ade02d8dd2a79fb6
nokogiri (1.19.3-arm64-darwin) sha256=71b9bd424b1b7abc18b05052a1a3cfd3627abdca62be280854cc411791357e42
nokogiri (1.19.3-x86_64-darwin) sha256=77f3fba57d46c53ab31e62fc6c28f705109d1bf6264356c76f132b2be5728d4d
nokogiri (1.19.3-x86_64-linux-gnu) sha256=2f5078620fe12e83669b5b17311b32532a8153d02eee7ad06948b926d6080976
nokogiri (1.19.3-x86_64-linux-musl) sha256=248c906d2166eca5efb56d52fdee5f9a1f51d69a72e2b64fdac647b4ce39ea3f
oj (3.17.0) sha256=5684b2127fb70e650fae90df521b91336ff8e55e2e1011ed80eb0283beac5360
okcomputer (1.19.1) sha256=7df770e768434816d228407f0786563827cbf34cb379933578829720cb4f1e77
omniauth (1.9.2)
omniauth-openid-connect (0.5.0)
@@ -2085,55 +2084,55 @@ CHECKSUMS
opentelemetry-api (1.9.0) sha256=d24065dd26583babd8d498d38ea35f74dfa193fb7102512e6e161649440079fb
opentelemetry-common (0.24.0) sha256=f1647b233b8ac667feeb74d66a65b702008d9ab55aae825c220b4fe2c14fa773
opentelemetry-exporter-otlp (0.33.0) sha256=6e9ce38e393c7eb9aea3fb57b128174a0066767bf495f4fd9e63d7607e0b2ad3
opentelemetry-helpers-mysql (0.5.0) sha256=8c2a5d5428aec271a7d2e25c158d06d4d8a914143b5004305964d1fcbc176eca
opentelemetry-helpers-sql (0.3.0) sha256=4bb08017d6a16dd41c4d1c53c7fd30f9c5bb691195d8b458933724627b3f37f9
opentelemetry-helpers-sql-processor (0.4.0) sha256=ec238d7a2887219bd247dc31d0eb8a1a03d414a899963b68e14bb9f4d18b23f4
opentelemetry-instrumentation-action_mailer (0.6.1) sha256=8384866bdb066ae14b9a1fe686ffaf1f23468326a35af64390c0395fcd471057
opentelemetry-instrumentation-action_pack (0.16.0) sha256=f4d54806b96dff89af31fb971fe5b1f79dd41fcc46489ed7c5340a47ee12a7f9
opentelemetry-instrumentation-action_view (0.11.2) sha256=e6a099015d672dabc19993d6fca99ef1e7210361ef21549a6e2076a67719fafc
opentelemetry-instrumentation-active_job (0.10.1) sha256=aea1311224c20d064a8f218a44299171152dc36eeb531b9eba84bed8b3942a89
opentelemetry-instrumentation-active_model_serializers (0.24.0) sha256=8fe81e44167d17e45d9acfa588d20140c7640c323e58aca99e266de1bb3fce15
opentelemetry-instrumentation-active_record (0.11.1) sha256=1b083f34eea0449f8d6f4370b3fb4b935757fac6e4e538e67bb98211809e7c92
opentelemetry-instrumentation-active_storage (0.3.1) sha256=f89b0fef54921f17c0c4c38a6e0926d29afabd0ac98436fcdbb8bde85dfde89e
opentelemetry-instrumentation-active_support (0.10.1) sha256=82ea98367158797e33c6de96581f10aa4fe8adf0ebec832dcff5fd04c59bc57d
opentelemetry-instrumentation-all (0.91.0) sha256=b077ce47da94e70e167157206034405f37ed0a4641d12ca8180a4b655c5727e2
opentelemetry-instrumentation-anthropic (0.4.0) sha256=0040e0d97e9a66ef32cc35612ff28d7310d4ec1cd2f949805a2017f00f4d2de0
opentelemetry-instrumentation-aws_lambda (0.6.0) sha256=1a3161393cfe9bc9eddd81a0668d076c38a0a2c3d5df40e95d02f5a8fcd3334c
opentelemetry-instrumentation-aws_sdk (0.11.0) sha256=67a21e754ddf51e2bb8c3e46e116aa9158d8db800f34c2a9b1e0da5a6ca911e3
opentelemetry-instrumentation-base (0.25.0) sha256=642a3a7f08354e6e969423327a4fa67ed2cca7ac6fe5ee09e55b17d1c576da27
opentelemetry-instrumentation-bunny (0.24.0) sha256=1ec484e48a5f42a1d0c33e8e6bc7e9e78dd80f3ed9d63520b8a22ba564aa2585
opentelemetry-instrumentation-concurrent_ruby (0.24.0) sha256=229bd8b72000c59de693609bb637b8a9114992f5e0ab03730d7fd7ef91f7d1d2
opentelemetry-instrumentation-dalli (0.29.2) sha256=21b82772ced1529288c7f08285d44d5690de11f3d275e24558a062f39a270f4f
opentelemetry-instrumentation-delayed_job (0.25.1) sha256=47f35b10d2bfd9ac7c2bbbe10dea095a2e25db2a84f5351860ead969d180c3ec
opentelemetry-instrumentation-ethon (0.28.0) sha256=5ab5eb0733fec27300047f1f0906453171732c663d0484968ce0582026256b2d
opentelemetry-instrumentation-excon (0.28.0) sha256=00bfd0bce489d5f924ab81c440098e99b6e4234f8968f942ce0753e2a326b99b
opentelemetry-instrumentation-faraday (0.32.0) sha256=21f78858c4d8986a9b89a330bc1f6ef03007d6893d009865b4539269f686cdfd
opentelemetry-instrumentation-grape (0.6.0) sha256=bc6f0ac3416b42bf096032ab79193326d6b50b12e8ccbcf028a78a4df492d057
opentelemetry-instrumentation-graphql (0.31.2) sha256=a4455f225427f8f9058247c8c0b351b8932567913c35ef049f7958801d401b1f
opentelemetry-instrumentation-grpc (0.4.1) sha256=5ffa2bb1d5ec69bcd1fe23e1d8c1a563a00351ce052fe9d76885cc43f21ebc87
opentelemetry-instrumentation-gruf (0.5.0) sha256=ee21be36e312e71b847c9a87168225625890121140a364b68d3668e0df58dacd
opentelemetry-instrumentation-http (0.29.0) sha256=c2981f22dac791f1768595c08b5338d29ad57bd98e23e9a2c0df7a1dc54122f1
opentelemetry-instrumentation-http_client (0.28.0) sha256=f6dadfed166d75d5632ae0b3521ed6a491080972923031489b85711e6d58fcb8
opentelemetry-instrumentation-httpx (0.7.0) sha256=3928185b62066cf6d8fe3b011dc5587ba53b09a5c7b573e36481b8d713d6aa03
opentelemetry-instrumentation-koala (0.23.0) sha256=8f324b50a2a64fd4994bb2b105a4cb0c80b64ec05cf5487d2daa906c650bc6f9
opentelemetry-instrumentation-lmdb (0.25.0) sha256=1e4d66d583ea242d4f72051062971f5af1ea353484d224abbd0aabdd1ce5f5cb
opentelemetry-instrumentation-mongo (0.25.1) sha256=b66a8544bb0c60ab032ecd224333d50138f2b280d2d394c508d2ff8ca3fb94b9
opentelemetry-instrumentation-mysql2 (0.33.0) sha256=b49b7957d5eef59e046e73be3ca370518965d61495745b4cb7ece3ef5470bcf9
opentelemetry-instrumentation-net_http (0.28.0) sha256=63b00c1c8fcfba15cd293ece8383d19bbc35e9b5cc04056b3e95799be11026f5
opentelemetry-instrumentation-pg (0.35.0) sha256=65a6e78bd45282b56021f1ee1b88b9fd318abf6812c32bd740465e6b9997aad4
opentelemetry-instrumentation-que (0.12.0) sha256=3b7a84341f6af5a04f8c57860aeba4033f87c855d40c611a2fc40dde849944fb
opentelemetry-instrumentation-racecar (0.6.1) sha256=833f6611906fb661f577e841d4ec52549474d32b4e8edea8048162348d35b845
opentelemetry-instrumentation-rack (0.30.0) sha256=30a54f7b44d4b91839622a20eb0b25a7c47084b37c2b03cfc149bfc4ef62303c
opentelemetry-instrumentation-rails (0.40.0) sha256=f794d477e8b48d9167ac1dbaf71dfc88e2a5647f76394cab7d1dfc6d5217b983
opentelemetry-instrumentation-rake (0.5.0) sha256=fa6bd019078975ac8a67eaea06294e4fe6707e6770d8ced88d74dc573b0a01ef
opentelemetry-instrumentation-rdkafka (0.9.0) sha256=f3beb56828c584d7d91a2c46f6e5a2ef82289b1d4445b1eb5bc13b80ab6aca89
opentelemetry-instrumentation-redis (0.28.0) sha256=8721957d1c527dd22bd564d17f3a8db252081abb302be189511282d023693900
opentelemetry-instrumentation-resque (0.8.0) sha256=559edde9d6273dd757ae5149ed36e26d147b63028d084121203f51c8cff805e5
opentelemetry-instrumentation-restclient (0.27.0) sha256=1abe208f5f43eff8648fa3ec3393c021bcbf30512f0fd69e4edbe8345ac3f899
opentelemetry-instrumentation-ruby_kafka (0.24.0) sha256=257e891f4ce630ba3e0669408d497b44afcc493cd49aed09343d5a51fa8952c2
opentelemetry-instrumentation-sidekiq (0.28.1) sha256=abc85d62996a5362e7a9fd7af9f6c709d01ce04795514d12fee5126335ae97ae
opentelemetry-instrumentation-sinatra (0.29.0) sha256=08595fec08d198df581d96aceb4b27998b84431e44a679950af7d00ab6559bdb
opentelemetry-instrumentation-trilogy (0.67.0) sha256=40394d3071d92aa418ef5aedab8e74f7683c0566c285a5418f75ca0586fd025f
opentelemetry-helpers-mysql (0.6.0) sha256=7eeb5e6950c434775a8cf28b5fde4defc12e8b865c86479ce3119fcf593d9337
opentelemetry-helpers-sql (0.4.0) sha256=b10e8c3a2cca28a98af951bbb3e4efdc59e68b25ba0825e055574af543420afb
opentelemetry-helpers-sql-processor (0.5.0) sha256=b199241bc9451fcbd9f00b2f454830af19d4ca27c2219ea379c9b0d53cd0e0f1
opentelemetry-instrumentation-action_mailer (0.8.0) sha256=bd3e423f0179834d51804b86aaaecf723a6fe4cc952a19f98e0b6e16ba755da2
opentelemetry-instrumentation-action_pack (0.18.0) sha256=90ba2c826b15539f7d02a4f37898592a41317e5c02785a7c2e7a8f782cbd5681
opentelemetry-instrumentation-action_view (0.13.0) sha256=5b855610d1143972c527d4482d238ecc3d343c8d59e3c1390bad4056317f1568
opentelemetry-instrumentation-active_job (0.12.0) sha256=cb3f36fd385cd0806d601d9307116146b6a249f2c0a28c279c2574a40e0db992
opentelemetry-instrumentation-active_model_serializers (0.25.0) sha256=98bb004f38781aff425f1fc52636eafd0e7b32d5479957f343e361f946786ad7
opentelemetry-instrumentation-active_record (0.13.0) sha256=239fceaae5a42e82dd9dd87bc63b1888bea32058dac0779b5ea36110fcb3a299
opentelemetry-instrumentation-active_storage (0.5.0) sha256=39920d405fd111cd98c01a90a24b19413f4cb5bc8de2a24d7882f785e8f02c19
opentelemetry-instrumentation-active_support (0.12.0) sha256=29a2cbdcb3aad4a42f4c9e829dab11167b71ed8a5205ad54587fe4d59d8ee704
opentelemetry-instrumentation-all (0.93.0) sha256=e1f918add0d5ec48502cb2fbb49c122457fc2bd2cb54ee85e2db872308bfcb24
opentelemetry-instrumentation-anthropic (0.5.0) sha256=a6b1e1f324d35323d4714a7f204c9d34c46da07529877a725829420a4a44bb13
opentelemetry-instrumentation-aws_lambda (0.7.0) sha256=50e5a32c454f2d38ecb53cc94e77dc646b33c47294cc6e6363e7c226097fa132
opentelemetry-instrumentation-aws_sdk (0.12.0) sha256=e2f48bf471cefe4d4bd9cfdafabffce65790b73381040e82d337933ac8bfb366
opentelemetry-instrumentation-base (0.26.0) sha256=fdec8bff9a8de04d113bd4e8d490b17414c92d6c79dd457dfa079c97ba922be0
opentelemetry-instrumentation-bunny (0.25.0) sha256=a8b20b7b4cdbfcfd64036b41c160061b164da2938aa7a7621849ee9f7ecb81b8
opentelemetry-instrumentation-concurrent_ruby (0.25.0) sha256=722912e7078e3025a84a25d0b6085702417598c58187c19a762234702cbf7b2d
opentelemetry-instrumentation-dalli (0.30.0) sha256=5e2fc0ef1f7eb684c6a987789ad0bad22ea9350376e134cd7c803e5eb02776ee
opentelemetry-instrumentation-delayed_job (0.26.0) sha256=98beac35860800e3235b7b79bed9e53af07f601733f5a0020ce9db2f906ce79c
opentelemetry-instrumentation-ethon (0.29.0) sha256=878135c550d01e2900348a92e9ca8e508e131d9d59d0e698c6a021fc7723181f
opentelemetry-instrumentation-excon (0.29.1) sha256=7a9f1c52f6c804e81db5b8e06ea7cbcd3c1dae803e46407727ce9f62e7fed3c6
opentelemetry-instrumentation-faraday (0.33.0) sha256=f4320bece35997b8ce2ba520eaf52499b89a0c048fce9ce0a10c1ae5d783f801
opentelemetry-instrumentation-grape (0.7.0) sha256=1b7dddd8e2baad62de6cd20fc924089fb5b8953e23ba41b83b4116ad5bcc03bf
opentelemetry-instrumentation-graphql (0.32.0) sha256=c3af73b42ac5ac873476f2c4c4cf46de2fb81bb74612cea61214a9911708afaa
opentelemetry-instrumentation-grpc (0.5.0) sha256=09bd9ccbedea4668e80546a24dbc1b148fd3775658228050f7378fc0e03b863d
opentelemetry-instrumentation-gruf (0.6.0) sha256=b2a2455b2c622962fc27a943572ee0c660297206bc5eb51b61095d5eb37eae0c
opentelemetry-instrumentation-http (0.30.0) sha256=36d2639eab81d386b25e99e0d91fe31888a255159a1213b9648e8359751055c8
opentelemetry-instrumentation-http_client (0.29.0) sha256=92363f0aa7a4286cb02e551c483078a2d5323e9f4ca2b706f2066834f7793d3d
opentelemetry-instrumentation-httpx (0.8.0) sha256=694b6e3eb6df04f1534d7713b5bd67ab5c2e2f2d5438f2c972542b1617378fec
opentelemetry-instrumentation-koala (0.24.0) sha256=70acc5e23bec54de26f3741e35056523cf9746329e7789f5be99ba1424b955f9
opentelemetry-instrumentation-lmdb (0.26.0) sha256=e032b0a95c2df84e8f23a3c9b24af2ffa4f75ec3b3a72171951ef16ace490cd7
opentelemetry-instrumentation-mongo (0.26.0) sha256=511407dd4fe06cb11be54b40b0a38f684aba1fc0569a5f6982c013e07e370ffd
opentelemetry-instrumentation-mysql2 (0.34.0) sha256=3c38c7ac7251d2ac3f7fc744f0f0efb05459635b74232d264727874e9e8552b8
opentelemetry-instrumentation-net_http (0.29.0) sha256=fae5eb6a794bbf87fb15752343b74d5cfd2bb830353f42cab3483fd2f3f84fe7
opentelemetry-instrumentation-pg (0.36.0) sha256=f7346f8c4377c053ca2720ac112eacef884840e3f97621ec6f553f3cb23baec7
opentelemetry-instrumentation-que (0.13.0) sha256=95e04b8c17e89eaa446f5dff7975cf72c2e74f7e1e84717be47facf510613112
opentelemetry-instrumentation-racecar (0.7.0) sha256=93a991917687aa0a6e785ccd8d0de5746af110122552b2bf1e3abe12ab04584a
opentelemetry-instrumentation-rack (0.31.0) sha256=bae9f424a2bb1dde2aa5e2c7e02dbbb80c972e7f4964ab820431229f276e0bfc
opentelemetry-instrumentation-rails (0.42.0) sha256=5ea3808373ca73ee9fa4ecf337471bad1c28e98ea64460b89ab225f5b6eaf8b3
opentelemetry-instrumentation-rake (0.6.0) sha256=71746e4e172560f8ccf1d3c91354196f5aa0fd9b0c477d6ff17a451cef901822
opentelemetry-instrumentation-rdkafka (0.10.0) sha256=ad1a4aa78c0ab43c1f130d961f54e1d6ac20c674b0180b87d4364770b81ec209
opentelemetry-instrumentation-redis (0.29.0) sha256=5f855d31ff7f72f79ef97e846655eaf31455a5c9549578725918196df09545ec
opentelemetry-instrumentation-resque (0.9.0) sha256=c79de5ed739ebe8acc9e13f0c69d6b2b81266806a3b3fec6cb6a8ef8151a0e05
opentelemetry-instrumentation-restclient (0.28.0) sha256=749b76d46c85a78882d924ba2edeff408f50def33099a67d95d88ddc4fa10307
opentelemetry-instrumentation-ruby_kafka (0.25.0) sha256=33ceccd5cef4f648e652fa45896d0b014da1a71b3a80f17064829ee5aa84e285
opentelemetry-instrumentation-sidekiq (0.29.0) sha256=b1d2a0cb9041a5e14239fe7c94d99e3dd07f870e2759460ab63592d7cdd8aadc
opentelemetry-instrumentation-sinatra (0.30.0) sha256=b67301153420f43264a0c68cdb3ca5bd77467cf5054e57b83a2bf891aaaa0361
opentelemetry-instrumentation-trilogy (0.68.0) sha256=24b31efdf21a08644ad26038b574f4b0876195b1502f3f64b1065eff3fe0f588
opentelemetry-registry (0.5.0) sha256=726ca58ada93a23efaa5f7bb81b8ab7a8a1e14602935c9c65dfa2e597a19fb4f
opentelemetry-sdk (1.11.0) sha256=427c6708f4732105ffa46c11afecb91807085c59e92538eaa6cf46b97b1850c6
opentelemetry-semantic_conventions (1.37.0) sha256=1e2dc5ad649e19ba2fb0fa7c6f9303e5cdd8d3952511415cb07efe28a0f8f4c3
@@ -2141,10 +2140,10 @@ CHECKSUMS
os (1.1.4) sha256=57816d6a334e7bd6aed048f4b0308226c5fb027433b67d90a9ab435f35108d3f
ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912
overviews (1.0.0)
ox (2.14.23) sha256=4a9aedb4d6c78c5ebac1d7287dc7cc6808e14a8831d7adb727438f6a1b461b66
pagy (43.5.1) sha256=ca5aaa6d65d21eee67a48fe8801d022d07ee72afbc5bea6a9e21b13a27b7c0b9
ox (2.14.25) sha256=c938bcfce4d8ff2bd2bdbffe1277222a76c0a6e62078d6854bd4d40f34f2f7db
pagy (43.5.3) sha256=f9d73e690648d484706661dcb815647775cf8330fcc5c6e62ec87b9df431290b
paper_trail (17.0.0) sha256=1c2842061d3874ca7015908e821e2aa14f9b982af2acb2a7974713bf79021c85
parallel (2.0.1) sha256=337782d3e39f4121e67563bf91dd8ece67f48923d90698614773a0ec9a5b2c7d
parallel (2.1.0) sha256=b35258865c2e31134c5ecb708beaaf6772adf9d5efae28e93e99260877b09356
parallel_tests (4.10.1) sha256=df05458c691462b210f7a41fc2651d4e4e8a881e8190e6d1e122c92c07735d70
parser (3.3.11.1) sha256=d17ace7aabe3e72c3cc94043714be27cc6f852f104d81aa284c2281aecc65d54
pdf-core (0.9.0) sha256=4f368b2f12b57ec979872d4bf4bd1a67e8648e0c81ab89801431d2fc89f4e0bb
@@ -2178,7 +2177,7 @@ CHECKSUMS
public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623
puffing-billy (4.0.4) sha256=87015b0c41e0722b2171a0c5aa8130fd3f58aa1c016a1dc6dc569b2028aa846f
puma (7.2.0) sha256=bf8ef4ab514a4e6d4554cb4326b2004eba5036ae05cf765cfe51aba9706a72a8
puma-plugin-statsd (2.7.0) sha256=04f243a7233f4d06ec0e26f1a3522bce18a5910ae711763fabff22681bdad08b
puma-plugin-statsd (2.8.0) sha256=e515445f93232b6b3571a23b832f93a776d4ce0fc8a5edee798013b82f3488f3
raabro (1.4.0) sha256=d4fa9ff5172391edb92b242eed8be802d1934b1464061ae5e70d80962c5da882
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
rack (2.2.23) sha256=a8fe9d7e07064770b8ec123663fded8a59ef7e2b6db5cda7173d45a5718ab69c
@@ -2200,10 +2199,10 @@ CHECKSUMS
railties (8.1.3) sha256=913eb0e0cb520aac687ffd74916bd726d48fa21f47833c6292576ef6a286de22
rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701
rake-compiler-dock (1.11.0) sha256=eab51f2cd533eb35cea6b624a75281f047123e70a64c58b607471bb49428f8c2
rake-compiler-dock (1.12.0) sha256=f13205c2738f3d2053afcd03491a9e4541b22a59a0bfc53fc8bc883bd8188023
rb-fsevent (0.11.2) sha256=43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe
rb-inotify (0.11.1) sha256=a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e
rb_sys (0.9.126) sha256=ba958e0b8b4b89eeae0b3d24b64c809eb2c37e0ab0773a49e9b1c2e22c95aef8
rb_sys (0.9.127) sha256=e9f90df3bb0577472d26d96127d5b5774b98f44de881e7d36aeefd28d6337847
rbtrace (0.5.3) sha256=c432292f305d9ab12fd47d9722e0d5210d983758a951fe6107c36cc955cb923f
rbtree3 (0.7.1) sha256=ab60ead728a5491b70df4f4065e180b18dbab5319f817ce1dbf5dd906f26d8ba
rdoc (7.2.0) sha256=8650f76cd4009c3b54955eb5d7e3a075c60a57276766ebf36f9085e8c9f23192
@@ -2232,7 +2231,7 @@ CHECKSUMS
rspec-wait (1.0.2) sha256=865f921239325d3d26fc10ded4bdd485d8b58bcaaad1a28dd85ed15266b5a912
rubocop (1.86.1) sha256=44415f3f01d01a21e01132248d2fd0867572475b566ca188a0a42133a08d4531
rubocop-ast (1.49.1) sha256=4412f3ee70f6fe4546cc489548e0f6fcf76cafcfa80fa03af67098ffed755035
rubocop-capybara (2.22.1) sha256=ced88caef23efea53f46e098ff352f8fc1068c649606ca75cb74650970f51c0c
rubocop-capybara (2.23.0) sha256=f9ea1ba3a7561ee8e88cf76fc378ce517ce5327155f305ee7b5c2500e5aee357
rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb
rubocop-openproject (0.4.0) sha256=ce56d9e591f9be5a4d98125b10a73564b0557a5e408f97918f9630fb15ae66ae
rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834
@@ -2261,7 +2260,7 @@ CHECKSUMS
signet (0.21.0) sha256=d617e9fbf24928280d39dcfefba9a0372d1c38187ffffd0a9283957a10a8cd5b
simpleidn (0.2.3) sha256=08ce96f03fa1605286be22651ba0fc9c0b2d6272c9b27a260bc88be05b0d2c29
smart_properties (1.17.0) sha256=f9323f8122e932341756ddec8e0ac9ec6e238408a7661508be99439ca6d6384b
spreadsheet (1.3.4) sha256=0aefd6f3dfdc8b43528109f7fbd54db54f85ce5920429413d48305906bc59253
spreadsheet (1.3.5) sha256=cd83ea66803d9cae4ac258dfe16cd8c2b85da33eec18a6d7b48fd4a45840ab7d
spring (4.4.2) sha256=22f61bacd8dc8595cedcdc738de46d7fc18be4d7a770986760344c924f485ce7
spring-commands-rspec (1.0.4) sha256=6202e54fa4767452e3641461a83347645af478bf45dddcca9737b43af0dd1a2c
spring-commands-rubocop (0.4.0) sha256=3e677a2c8a27ae8a986f04bfb69e66d5d55b017541e8be93bf0dc48a7f5690c1
@@ -2293,7 +2292,7 @@ CHECKSUMS
turbo_power (0.7.0) sha256=ad95d147e0fa761d0023ad9ca00528c7b7ddf6bba8ca2e23755d5b21b290d967
turbo_tests (2.2.0)
tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b
tzinfo-data (1.2026.1) sha256=4ea36519ae5ae2cf0fad471207a519be006daf42e3b2359ee9e9c53f113609fd
tzinfo-data (1.2026.2) sha256=7db0d3d3d53b8d7601fc183fccc8c6d056a3004e14eb59ea995bf6aec4ae10bc
uber (0.1.0) sha256=5beeb407ff807b5db994f82fa9ee07cfceaa561dad8af20be880bc67eba935dc
unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
@@ -2303,7 +2302,7 @@ CHECKSUMS
validate_url (1.0.15) sha256=72fe164c0713d63a9970bd6700bea948babbfbdcec392f2342b6704042f57451
vcr (6.4.0) sha256=077ac92cc16efc5904eb90492a18153b5e6ca5398046d8a249a7c96a9ea24ae6
vernier (1.10.0) sha256=5b1dc57012e08ed23e14f4d2943540140d454aa8434c7c35e7eb97befd4969bf
view_component (4.6.0) sha256=aabbcc68ab4af8a0135bd3f488e1a4132180cb611aa2565f86cb6e9135f4ed7e
view_component (4.8.0) sha256=0a1b716cce87f8f6799d7aefb57911ef6eee5ef8214466a7ca22c421853f7309
virtus (2.0.0) sha256=8841dae4eb7fcc097320ba5ea516bf1839e5d056c61ee27138aa4bddd6e3d1c2
warden (1.2.9) sha256=46684f885d35a69dbb883deabf85a222c8e427a957804719e143005df7a1efd0
warden-basic_auth (0.2.1) sha256=bfc752e0109c0182c3e69e930284c5e1e81e7b4a354aeb2b5914ead1391f3c6e
@@ -2323,7 +2322,7 @@ CHECKSUMS
yabeda-puma-plugin (0.9.0) sha256=b78673ecc7ee30bc50691ddc41b7022c1c1801843900d5101418f4a14b550bc8
yabeda-rails (0.11.0) sha256=afa2581bd44c8f419cb3f2bbf9f6fb40f817c30476f7caf5d1c55c48d69a5b29
yaml (0.4.0) sha256=240e69d1e6ce3584d6085978719a0faa6218ae426e034d8f9b02fb54d3471942
yard (0.9.42) sha256=4e2be01f8623556093497731d44c801e600d7c9759ec7a35a2dd5dd83bbbba68
yard (0.9.43) sha256=cf8733a8f0485df2a162927e9b5f182215a61f6d22de096b8f402c726a1c5821
zeitwerk (2.7.5) sha256=d8da92128c09ea6ec62c949011b00ed4a20242b255293dd66bf41545398f73dd
RUBY VERSION
@@ -60,6 +60,8 @@ module My
end
def expires_on
return I18n.t(:label_never) if client_token.expires_in.blank?
helpers.format_time(client_token.updated_at + client_token.expires_in.seconds)
end
@@ -28,6 +28,8 @@ See COPYRIGHT and LICENSE files for more details.
++#%>
<%= render(Primer::BaseComponent.new(tag: :span, **@system_arguments)) do %>
<%= leading_visual_icon %>
<%= content %>
<%= render(Primer::BaseComponent.new(tag: :span, display: :inline_flex, align_items: :center)) do %>
<%= leading_visual_icon %>
<%= content %>
<% end %>
<% end %>
@@ -31,7 +31,7 @@
module OpPrimer
class InlineMacroComponent < Primer::Component
renders_one :leading_visual_icon, ->(icon:, color: :muted) do
Primer::Beta::Octicon.new(icon:, color:, mr: 2, vertical_align: :middle)
Primer::Beta::Octicon.new(icon:, color:, size: :xsmall, mr: 2)
end
def initialize(**system_arguments)
@@ -1,7 +1,2 @@
@media screen
.op-inline-macro
display: inline
background: var(--bgColor-muted)
border: 1px solid transparent
border-radius: var(--borderRadius-medium)
padding: 4px 8px
.op-inline-macro
@include macro--text-style
+1 -1
View File
@@ -55,7 +55,7 @@ class UserFilterComponent < IndividualPrincipalBaseFilterComponent
end
def base_query
Queries::Users::UserQuery
UserQuery
end
protected
@@ -70,7 +70,7 @@
icon: :"screen-full",
tag: :a,
classes: "hidden-for-small-laptops",
href: work_package_path(work_package.id, full_screen_tab),
href: work_package_path(work_package.display_id, full_screen_tab),
target: "_top",
scheme: :invisible,
test_selector: "wp-details-tab-component--full-screen",
@@ -16,7 +16,7 @@
font_size: @font_size,
color: :muted
)
) { "##{@work_package.id}" }
) { @work_package.formatted_id }
end
if @show_status
@@ -0,0 +1,2 @@
<%= helpers.angular_component_tag "opce-wp-split-create",
inputs: { projectIdentifier: @project_identifier } %>
@@ -1,3 +1,5 @@
# frozen_string_literal: true
#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) the OpenProject GmbH
@@ -26,13 +28,10 @@
# See COPYRIGHT and LICENSE files for more details.
#++
class VersionSetting < ApplicationRecord
belongs_to :project
belongs_to :version
class WorkPackages::SplitCreateComponent < ApplicationComponent
def initialize(project_identifier:)
super
validates_presence_of :project
DISPLAY_NONE = 1
DISPLAY_LEFT = 2
DISPLAY_RIGHT = 3
@project_identifier = project_identifier
end
end
@@ -32,7 +32,7 @@ See COPYRIGHT and LICENSE files for more details.
blankslate.with_heading(tag: :h2).with_content(t("admin.workflows.blankslate.title"))
blankslate.with_description_content(t("admin.workflows.blankslate.description"))
blankslate.with_primary_action(
href: helpers.status_dialog_workflow_tab_path(@type, @tab, role_id: @role.id),
href: helpers.status_dialog_workflow_tab_path(@type, @tab, role_ids: @roles.map(&:id)),
scheme: :secondary,
data: { controller: "async-dialog" }
) do |button|
@@ -32,9 +32,9 @@ module Workflows
class BlankslateComponent < ApplicationComponent
include OpPrimer::ComponentHelpers
def initialize(role:, type:, tab:)
def initialize(roles:, type:, tab:)
super
@role = role
@roles = roles
@type = type
@tab = tab
end
@@ -30,7 +30,7 @@
module Workflows::PageHeaders
class EditComponent < BaseComponent
options :tabs, :role
options :tabs, :roles
def type = model
@@ -49,7 +49,7 @@ module Workflows::PageHeaders
mobile_icon: :copy,
mobile_label: t(:button_copy),
size: :medium,
href: new_workflow_copy_path(type, source_role_id: role&.id),
href: new_workflow_copy_path(type, source_role_id: roles&.first&.id),
aria: { label: helpers.t(:button_copy) },
title: helpers.t(:button_copy)
) do |button|
@@ -42,7 +42,7 @@ See COPYRIGHT and LICENSE files for more details.
Workflows::StatusFormComponent.new(
all_statuses: @all_statuses,
current_statuses: @current_statuses,
role: @role,
roles: @roles,
type: @type,
tab: @tab
)
@@ -35,11 +35,11 @@ module Workflows
DIALOG_ID = "workflows-status-dialog"
def initialize(all_statuses:, current_statuses:, role:, type:, tab:)
def initialize(all_statuses:, current_statuses:, roles:, type:, tab:)
super
@all_statuses = all_statuses
@current_statuses = current_statuses
@role = role
@roles = roles
@type = type
@tab = tab
end
@@ -29,7 +29,7 @@ See COPYRIGHT and LICENSE files for more details.
<%=
primer_form_with(
url: helpers.confirm_statuses_workflow_tab_path(@type, @tab, role_id: @role.id),
url: helpers.confirm_statuses_workflow_tab_path(@type, @tab, role_ids: @roles.map(&:id)),
method: :post,
id: FORM_ID,
data: { turbo_frame: "workflow-table" }
@@ -39,7 +39,6 @@ See COPYRIGHT and LICENSE files for more details.
f,
all_statuses: @all_statuses,
current_statuses: @current_statuses,
role: @role,
type: @type,
tab: @tab,
dialog_id:
@@ -32,11 +32,11 @@ module Workflows
class StatusFormComponent < ApplicationComponent
FORM_ID = "status-selection-form"
def initialize(all_statuses:, current_statuses:, role:, type:, tab:)
def initialize(all_statuses:, current_statuses:, roles:, type:, tab:)
super
@all_statuses = all_statuses
@current_statuses = current_statuses
@role = role
@roles = roles
@type = type
@tab = tab
end
@@ -32,21 +32,39 @@ See COPYRIGHT and LICENSE files for more details.
render Primer::OpenProject::SubHeader.new do |subheader|
if @type && @available_roles.any?
subheader.with_filter_component do
render(Primer::Alpha::ActionMenu.new(select_variant: :single)) do |menu|
menu.with_show_button(scheme: :secondary) do |button|
render(
Primer::Alpha::SelectPanel.new(
select_variant: :multiple,
fetch_strategy: :local,
title: t("admin.workflows.role_selector.title"),
data: data_attributes
)
) do |panel|
panel.with_show_button(scheme: :secondary) do |button|
button.with_trailing_visual_icon(icon: :"triangle-down")
@role ? t("admin.workflows.role_selector.label", role: @role.name) : t("admin.workflows.role_selector.no_role")
if @roles.many?
t("admin.workflows.role_selector.roles", count: @roles.size)
elsif @roles.one?
t("admin.workflows.role_selector.label", role: @roles.first.name)
else
t("admin.workflows.role_selector.no_role")
end
end
@available_roles.each do |available_role|
menu.with_item(
panel.with_item(
label: available_role.name,
active: available_role == @role,
tag: :a,
href: helpers.edit_workflow_tab_path(@type, @tab, role_id: available_role.id),
content_arguments: { data: { "admin--workflow-checkbox-state-confirmation-trigger": "click",
turbo_action: "advance" } }
active: @roles.include?(available_role),
item_id: available_role.id
)
end
panel.with_footer(show_divider: true) do
render(
Primer::Beta::Button.new(
scheme: :primary,
data: { action: "click->admin--workflow-role-select#apply" }
)
) { t(:button_apply) }
end
end
end
end
@@ -56,7 +74,7 @@ See COPYRIGHT and LICENSE files for more details.
scheme: :secondary,
leading_icon: :plus,
label: t("admin.workflows.status_button"),
href: helpers.status_dialog_workflow_tab_path(@type, @tab, role_id: @role&.id, status_ids: @statuses.pluck(:id).presence),
href: helpers.status_dialog_workflow_tab_path(@type, @tab, role_ids: @roles.map(&:id), status_ids: @statuses.pluck(:id).presence),
data: { controller: "async-dialog" }
) do
t("admin.workflows.status_button")
@@ -67,7 +85,7 @@ See COPYRIGHT and LICENSE files for more details.
<% if @statuses.any? %>
<%= form_tag(
workflow_tab_path(@type),
id: "workflow_form",
id: form_id,
method: :patch,
autocomplete: "off",
data: {
@@ -76,7 +94,9 @@ See COPYRIGHT and LICENSE files for more details.
}
) do %>
<%= hidden_field_tag "type_id", @type.id %>
<%= hidden_field_tag "role_id", @role.id %>
<% @roles.each do |role| %>
<%= hidden_field_tag "role_ids[]", role.id %>
<% end %>
<%= hidden_field_tag "tab", @tab %>
<%= helpers.render_tabs helpers.workflow_tabs(@type) %>
@@ -94,7 +114,7 @@ See COPYRIGHT and LICENSE files for more details.
Primer::OpenProject::FeedbackDialog.new(
title: t("admin.workflows.leave_confirmation.title"),
data: {
"admin--workflow-checkbox-state-target": "confirmationDialog",
"admin--workflow-checkbox-state-target": "confirmationDialog"
}
)
) do |dialog|
@@ -118,6 +138,6 @@ See COPYRIGHT and LICENSE files for more details.
%>
<% end %>
<% else %>
<%= render Workflows::BlankslateComponent.new(role: @role, type: @type, tab: @tab) %>
<%= render Workflows::BlankslateComponent.new(roles: @roles, type: @type, tab: @tab) %>
<% end %>
<% end %>
@@ -33,14 +33,29 @@ module Workflows
include OpTurbo::Streamable
include OpPrimer::ComponentHelpers
def initialize(tab:, role:, type:, available_roles:, statuses:, has_status_changes:)
FORM_ID = "workflow_form"
def initialize(tab:, roles:, type:, available_roles:, statuses:, has_status_changes:)
super
@tab = tab
@role = role
@roles = roles
@type = type
@available_roles = available_roles
@statuses = statuses
@has_status_changes = has_status_changes
end
private
def form_id = FORM_ID
def data_attributes
{
controller: "admin--workflow-role-select",
"admin--workflow-role-select-base-url-value": helpers.edit_workflow_tab_path(@type, @tab),
"admin--workflow-role-select-current-role-ids-value": @roles.map(&:id),
"admin--workflow-role-select-admin--workflow-checkbox-state-outlet": "##{form_id}"
}
end
end
end
@@ -46,7 +46,7 @@ See COPYRIGHT and LICENSE files for more details.
# The reason this is done here is because the submit is not a DELETE, and GET form submissions
# strip url params
dialog.with_additional_details do
concat(hidden_field_tag(:role_id, @role.id))
@roles.each { |role| concat(hidden_field_tag("role_ids[]", role.id)) }
@status_ids.each { |id| concat(hidden_field_tag("status_ids[]", id)) }
end
end
@@ -35,9 +35,9 @@ module Workflows
DIALOG_ID = "workflows-status-removal-dialog"
def initialize(role:, type:, tab:, status_ids:, removed_count:)
def initialize(roles:, type:, tab:, status_ids:, removed_count:)
super
@role = role
@roles = roles
@type = type
@tab = tab
@status_ids = Array(status_ids).flatten.map(&:to_i)
@@ -35,6 +35,7 @@ module CustomActions
validates :work_package_id, presence: true
validate :work_package_visible
validate :custom_action_conditions_fulfilled
private
@@ -45,5 +46,17 @@ module CustomActions
errors.add(:work_package_id, :does_not_exist)
end
end
def custom_action_conditions_fulfilled
return unless model.work_package_id
return unless options[:custom_action]
work_package = WorkPackage.visible(user).find_by(id: model.work_package_id)
return unless work_package
unless options[:custom_action].conditions_fulfilled?(work_package, user)
errors.add(:base, :error_unauthorized)
end
end
end
end
@@ -36,7 +36,10 @@ module OAuthClients
validates :client_id, presence: true, length: { maximum: 255 }
attribute :client_secret, writable: true
validates :client_secret, presence: true, length: { maximum: 255 }
validates :client_secret, presence: true, if: :client_secret_required?
validates :client_secret, length: { maximum: 255 }
def client_secret_required? = true
attribute :integration_type, writable: true
validates :integration_type, presence: true
-2
View File
@@ -102,13 +102,11 @@ module Users
errors.add(:identity_url, :error_readonly) if model.user_auth_provider_links.any?(&:changed?)
end
# rubocop:disable Rails/DynamicFindBy
def existing_auth_source
if ldap_auth_source_id && LdapAuthSource.find_by_unique(ldap_auth_source_id).nil?
errors.add :auth_source, :error_not_found
end
end
# rubocop:enable Rails/DynamicFindBy
def can_create_or_manage_users?
user.allowed_globally?(:manage_user) || user.allowed_globally?(:create_user)
+1 -1
View File
@@ -52,7 +52,7 @@ module My
token = cookies[OpenProject::Configuration["autologin_cookie_name"]]
if token
@current_token = @autologin_tokens.find_by_plaintext_value(token) # rubocop:disable Rails/DynamicFindBy
@current_token = @autologin_tokens.find_by_plaintext_value(token)
end
end
+7 -6
View File
@@ -77,19 +77,20 @@ class OAuthClientsController < ApplicationController
storage_id = params.fetch(:storage_id)
oauth_client = OAuthClient.find_by(client_id:, integration_id: storage_id)
handle_absent_oauth_client unless oauth_client
return handle_absent_oauth_client unless oauth_client
storage = oauth_client.integration
# check if the origin is the same
integration = oauth_client.integration
destination_url = destination_url(params.fetch(:destination_url, ""))
auth_state = ::Storages::Adapters::Authentication.authorization_state(storage:, user: User.current)
configuration = integration.oauth_configuration
connection = ::OAuthClients::ConnectionManager.new(user: User.current, configuration:)
.get_access_token
if auth_state == :connected
if connection.success?
redirect_to(destination_url)
else
nonce = SecureRandom.uuid
cookies["oauth_state_#{nonce}"] = { value: { href: destination_url, storageId: storage_id }.to_json, expires: 1.hour }
redirect_to(storage.oauth_configuration.authorization_uri(state: nonce), allow_other_host: true)
redirect_to(configuration.authorization_uri(state: nonce), allow_other_host: true)
end
end
+67 -25
View File
@@ -38,27 +38,37 @@ class Workflows::TabsController < ApplicationController
before_action :set_type
before_action :set_tab
before_action :set_eligible_roles
before_action :set_role
before_action :set_roles
def edit
unless turbo_frame_request?
redirect_to edit_workflow_path(@type, role_id: params[:role_id], tab: @tab)
redirect_to edit_workflow_path(@type, role_ids: params[:role_ids], tab: @tab)
return
end
statuses_for_form
if @type && @role && @statuses.any?
if @type && @roles.any? && @statuses.any?
workflows_for_form
end
end
def update
call = Workflows::BulkUpdateService
.new(role: @role, type: @type, tab: @tab)
.call(permitted_status_params)
def update # rubocop:disable Metrics/AbcSize
success = false
Workflow.transaction do
success = true
base_params = permitted_status_params
indeterminate = permitted_indeterminate_params
@roles.each do |role|
role_params = indeterminate.empty? ? base_params : role_specific_params(base_params, indeterminate, role)
result = Workflows::BulkUpdateService.new(role:, type: @type, tab: @tab)
.call(role_params)
success = false unless result.success?
end
raise ActiveRecord::Rollback unless success
end
if call.success?
if success
render_flash_message_via_turbo_stream(
message: I18n.t(:notice_successful_update),
scheme: :success
@@ -69,7 +79,7 @@ class Workflows::TabsController < ApplicationController
update_via_turbo_stream(
component: Workflows::StatusMatrixFormComponent.new(
tab: @tab,
role: @role,
roles: @roles,
type: @type,
available_roles: @eligible_roles,
statuses:,
@@ -92,8 +102,8 @@ class Workflows::TabsController < ApplicationController
all_statuses = Status.order(:position)
current_statuses = if params[:status_ids].present?
Status.where(id: params[:status_ids].map(&:to_i)).order(:position)
elsif @type && @role
statuses_for_role_and_type
elsif @type && @roles.any?
statuses_for_roles_and_type
else
Status.none
end
@@ -101,7 +111,7 @@ class Workflows::TabsController < ApplicationController
respond_with_dialog Workflows::StatusDialogComponent.new(
all_statuses:,
current_statuses:,
role: @role,
roles: @roles,
type: @type,
tab: @tab
)
@@ -114,7 +124,7 @@ class Workflows::TabsController < ApplicationController
if removed_count > 0
respond_with_dialog Workflows::StatusRemovalDangerDialogComponent.new(
role: @role,
roles: @roles,
type: @type,
tab: @tab,
status_ids: current_status_ids,
@@ -125,7 +135,7 @@ class Workflows::TabsController < ApplicationController
update_via_turbo_stream(
component: Workflows::StatusMatrixFormComponent.new(
tab: @tab,
role: @role,
roles: @roles,
type: @type,
available_roles: @eligible_roles,
statuses:,
@@ -150,8 +160,9 @@ class Workflows::TabsController < ApplicationController
@eligible_roles = Workflow.eligible_roles.order(:builtin, :position)
end
def set_role
@role = @eligible_roles.find(params[:role_id])
def set_roles
@roles = @eligible_roles.where(id: params[:role_ids])
@roles = [@eligible_roles.first] if @roles.empty?
end
def statuses_for_form
@@ -159,8 +170,8 @@ class Workflows::TabsController < ApplicationController
@has_status_changes = false
@statuses = if @type && params[:status_ids].present?
statuses_from_params
elsif @type && @role
statuses_for_role_and_type
elsif @type && @roles.any?
statuses_for_roles_and_type
elsif @type
@type.statuses
else
@@ -170,18 +181,19 @@ class Workflows::TabsController < ApplicationController
def statuses_from_params
status_ids = params[:status_ids].map(&:to_i)
saved_ids = statuses_for_role_and_type.pluck(:id)
saved_ids = statuses_for_roles_and_type.pluck(:id)
@added_status_ids = status_ids - saved_ids
@has_status_changes = @added_status_ids.any? || (saved_ids - status_ids).any?
Status.where(id: status_ids).order(:position)
end
def statuses_for_role_and_type
@type.statuses(role: @role, tab: @tab)
def statuses_for_roles_and_type
status_ids = @roles.map { |role| @type.statuses(role:, tab: @tab).pluck(:id) }.flatten.uniq
Status.where(id: status_ids)
end
def workflows_for_form
workflows = Workflow.where(role_id: @role.id, type_id: @type.id)
workflows = Workflow.where(role_id: @roles.map(&:id), type_id: @type.id)
@workflows = {}
@workflows["always"] = workflows.select { |w| !w.author && !w.assignee }
@workflows["author"] = workflows.select(&:author)
@@ -189,10 +201,40 @@ class Workflows::TabsController < ApplicationController
end
def permitted_status_params
return {} if params["status"].blank?
status_params("status")
end
params["status"]
def permitted_indeterminate_params
status_params("indeterminate_status")
end
def status_params(key)
return {} if params[key].blank?
params[key]
.to_unsafe_h
.select { |key, value| /\A\d+\z/.match?(key) && value.keys.all? { /\A\d+\z/.match?(it) } }
.select { |k, value| /\A\d+\z/.match?(k) && value.keys.all? { /\A\d+\z/.match?(it) } }
end
def role_specific_params(base_params, indeterminate, role)
params = base_params.deep_dup
indeterminate.each do |old_id, new_ids|
new_ids.each_key do |new_id|
# Restore from DB so that it isn't overwritten by indeterminate state (unchecked)
had_transition = Workflow.exists?(
role_id: role.id,
type_id: @type.id,
old_status_id: old_id.to_i,
new_status_id: new_id.to_i,
author: @tab == "author",
assignee: @tab == "assignee"
)
if had_transition
params[old_id] ||= {}
params[old_id][new_id] = "1"
end
end
end
params
end
end
+5 -7
View File
@@ -38,7 +38,7 @@ class WorkflowsController < ApplicationController
before_action :find_types, only: %i[index]
before_action :find_type, only: %i[edit]
before_action :find_optional_role, only: %i[edit]
before_action :find_optional_roles, only: %i[edit]
def index; end
@@ -56,16 +56,14 @@ class WorkflowsController < ApplicationController
@types = ::Type.order(:position)
end
def find_role
@role = eligible_roles.find(params[:role_id])
end
def find_type
@type = ::Type.find(params[:type_id])
end
def find_optional_role
@role = eligible_roles.find_by(id: params[:role_id]) || eligible_roles.order(:builtin, :position).first
def find_optional_roles
ordered = eligible_roles.order(:builtin, :position)
@roles = ordered.where(id: params[:role_ids])
@roles = [ordered.first] if @roles.empty?
end
def eligible_roles
@@ -51,19 +51,42 @@ module Settings
f.select_list(
name: :new_project_user_role_id,
label: I18n.t(:setting_new_project_user_role_id),
caption: I18n.t(:setting_new_project_user_role_id_caption),
input_width: :medium,
include_blank: I18n.t(:actionview_instancetag_blank_option)
include_blank: false
) do |select|
ProjectRole.givable.each do |role|
select.option(
value: role.id.to_s,
label: role.name,
selected: Setting.new_project_user_role_id == role.id
)
end
build_new_project_user_role_options(select)
end
f.submit
end
# Adds the role options to the new_project_user_role_id select. Roles that pass the
# `assignable_to_project_creator` filter are listed first; the currently configured role is
# always included even when it has lost required permissions (with a label suffix), so the
# admin can see and change the current selection.
def build_new_project_user_role_options(select)
assignable = ProjectRole.assignable_to_project_creator.to_a
assignable.each { |role| add_assignable_role_option(select, role) }
configured = ProjectRole.givable.find_by(id: Setting.new_project_user_role_id)
add_non_qualifying_role_option(select, configured) if configured && assignable.exclude?(configured)
end
def add_assignable_role_option(select, role)
select.option(
value: role.id.to_s,
label: role.name,
selected: Setting.new_project_user_role_id == role.id
)
end
def add_non_qualifying_role_option(select, role)
select.option(
value: role.id.to_s,
label: I18n.t(:label_role_missing_permissions, role: role.name),
selected: true
)
end
end
end
+1 -3
View File
@@ -30,18 +30,16 @@
module Workflows
class StatusSelectForm < ApplicationForm
def initialize(all_statuses:, current_statuses:, role:, type:, tab:, dialog_id:)
def initialize(all_statuses:, current_statuses:, type:, tab:, dialog_id:)
super()
@all_statuses = all_statuses
@current_statuses = current_statuses
@role = role
@type = type
@tab = tab
@dialog_id = dialog_id
end
form do |f|
f.hidden(name: :role_id, value: @role.id)
f.hidden(name: :type_id, value: @type.id)
f.hidden(name: :tab, value: @tab || "always")
@current_statuses.each { |status| f.hidden(name: "original_status_ids[]", value: status.id) }
@@ -33,6 +33,14 @@ module WorkPackages::SplitViewHelper
params[:work_package_split_view].present?
end
def render_work_package_split_create?
params[:work_package_split_create].present?
end
def split_create_instance
WorkPackages::SplitCreateComponent.new(project_identifier: params[:project_id])
end
def split_view_instance
WorkPackages::SplitViewComponent.new(id: params[:work_package_id],
tab: params[:tab],
+1 -1
View File
@@ -37,7 +37,7 @@ module WorkflowHelper
].map do |tab|
tab.merge(
partial: "workflows/form",
path: edit_workflow_tab_path(type, tab[:name], params.permit(:role_id)),
path: edit_workflow_tab_path(type, tab[:name], params.permit(role_ids: [])),
data: { "admin--workflow-checkbox-state-confirmation-trigger": "click",
turbo_frame: "workflow-table",
turbo_action: "advance" }
+1 -1
View File
@@ -36,7 +36,7 @@ class OAuthClientToken < ApplicationRecord
validates :user, uniqueness: { scope: :oauth_client }
validates :access_token, presence: true
validates :refresh_token, presence: true
validates :refresh_token, presence: true, if: -> { expires_in.present? }
scope :for_user_and_client, ->(user, client) { where(user:, oauth_client: client) }
end
@@ -28,20 +28,12 @@
# See COPYRIGHT and LICENSE files for more details.
#++
module OpenProject::Backlogs::Patches::API::V3::Utilities::ResourceLinkGeneratorPatch
extend ActiveSupport::Concern
class OrderedPersistedQueryEntity < ApplicationRecord
belongs_to :persisted_query, optional: false
belongs_to :entity, polymorphic: true, optional: false
included do
singleton_class.prepend(ClassMethods)
end
validates :position, presence: true
validates :entity_id, uniqueness: { scope: %i[persisted_query_id entity_type] }
module ClassMethods
private
def determine_path_method(record)
return :sprint if record.is_a?(Agile::Sprint)
super
end
end
default_scope { order(position: :asc) }
end
+79
View File
@@ -0,0 +1,79 @@
# 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 PersistedQuery < ApplicationRecord
include Queries::BaseQuery
include Queries::Serialization::Hash
include ::Scopes::Scoped
belongs_to :project, optional: true
belongs_to :principal, optional: true, inverse_of: :persisted_queries
has_many :views, class_name: "PersistedView",
as: :query,
dependent: :restrict_with_error,
inverse_of: :query
has_many :ordered_entities, -> { order(position: :asc) },
class_name: "OrderedPersistedQueryEntity",
dependent: :destroy,
inverse_of: :persisted_query
validates :name, length: { maximum: 255, allow_nil: true }
def self.inherited(subclass)
super
subclass.serialize :filters, coder: Queries::Serialization::Filters.new(subclass)
subclass.serialize :orders, coder: Queries::Serialization::Orders.new(subclass)
subclass.serialize :selects, coder: Queries::Serialization::Selects.new(subclass)
end
def self.register_query(&)
Queries::Register.register(self, &)
end
def user
principal if principal.is_a?(User)
end
def user=(user)
self.principal = user
end
# Returns the query results, bypassing filters and orders when the query has
# manually-added entities — in that case they are returned in the order
# stored on the join records.
def results
return super if ordered_entities.empty?
entity_ids = ordered_entities.pluck(:entity_id)
self.class.model.where(id: entity_ids).in_order_of(:id, entity_ids)
end
end
+75
View File
@@ -0,0 +1,75 @@
# 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 PersistedView < ApplicationRecord
belongs_to :project, optional: true
belongs_to :principal, optional: true, inverse_of: :persisted_views
belongs_to :query, polymorphic: true, optional: true
belongs_to :parent, class_name: "PersistedView", optional: true
has_many :children, class_name: "PersistedView", foreign_key: "parent_id", dependent: :destroy, inverse_of: :parent
acts_as_favoritable
enum :category, {
work_package: "work_package",
project: "project",
resource_management: "resource_management"
}, validate: { allow_nil: true }
validates :name, presence: true, length: { maximum: 255 }
scope :public_views, -> { where(public: true) }
scope :private_views, ->(principal: User.current) { where(public: false, principal:) }
scope :visible, (lambda do |principal: User.current|
public_views.or(private_views(principal:))
end)
after_destroy :destroy_query_if_orphaned
# Returns the query of this view or, if not set, the query of the parent view.
def effective_query
query || parent&.effective_query
end
private
# When this view is destroyed, also destroy its query unless another public
# view still references it. Views belonging to the same owner that are also
# going away (e.g. during user deletion) do not count as "still referencing"
# since only public views keep a query alive.
def destroy_query_if_orphaned
return if query.nil?
return if PersistedView.exists?(query:, public: true)
query.destroy!
end
end
+3
View File
@@ -77,6 +77,9 @@ class Principal < ApplicationRecord
inverse_of: :principal
has_many :auth_providers, through: :user_auth_provider_links
has_many :persisted_views, inverse_of: :principal, dependent: :nullify
has_many :persisted_queries, inverse_of: :principal, dependent: :nullify
has_paper_trail
scopes :like,
@@ -41,7 +41,7 @@ module Principals::Scopes
def ordered_by_name(desc: false)
direction = desc ? "DESC" : "ASC"
order_case = Arel.sql <<~SQL
order_case = Arel.sql(<<~SQL.squish)
CASE
WHEN users.type = 'User' THEN LOWER(#{user_concat_sql})
WHEN users.type != 'User' THEN LOWER(users.lastname)
+33 -2
View File
@@ -29,6 +29,20 @@
# ++
class ProjectRole < Role
# Permissions a role must grant in order to be assignable as the default
# role for a non-admin user who creates a project. Without these, the
# creator cannot complete project setup (filling out the PIR, adding
# members, etc.).
PERMISSIONS_FOR_PROJECT_CREATOR = %i[
view_project
view_project_attributes
edit_project_attributes
view_members
manage_members
].freeze
has_many :custom_fields_roles,
foreign_key: "role_id",
dependent: :restrict_with_error,
@@ -39,6 +53,20 @@ class ProjectRole < Role
.where(type: "ProjectRole")
end
# Roles eligible to be granted to a non-admin user upon project creation.
# Restricted to givable roles that include all PERMISSIONS_FOR_PROJECT_CREATOR.
def self.assignable_to_project_creator
permissions = PERMISSIONS_FOR_PROJECT_CREATOR.map(&:to_s)
role_ids = RolePermission
.where(permission: permissions)
.group(:role_id)
.having("COUNT(DISTINCT permission) = ?", permissions.size)
.select(:role_id)
givable.where(id: role_ids)
end
# Return the builtin 'non member' role. If the role doesn't exist,
# it will be created on the fly.
def self.non_member
@@ -66,9 +94,12 @@ class ProjectRole < Role
end
def self.in_new_project
givable
assignable_to_project_creator
.except(:order)
.order(Arel.sql("COALESCE(#{Setting.new_project_user_role_id.to_i} = id, false) DESC, position"))
.reorder(Arel.sql(
"COALESCE(#{Setting.new_project_user_role_id.to_i} = #{quoted_table_name}.id, false) DESC, " \
"#{quoted_table_name}.position"
))
.first
end
end
+79 -42
View File
@@ -31,18 +31,20 @@
module Projects::Identifier
extend ActiveSupport::Concern
IDENTIFIER_MAX_LENGTH = 100
CLASSIC_IDENTIFIER_MAX_LENGTH = 100
SEMANTIC_IDENTIFIER_MAX_LENGTH = 10
RESERVED_IDENTIFIERS = %w[new menu queries filters identifier_update_dialog identifier_suggestion].freeze
# Classic identifier format: lowercase letters, digits, hyphens, underscores — but not all-numeric.
CLASSIC_IDENTIFIER_FORMAT = /\A(?!\d+\z)[a-z0-9\-_]+\z/
# Semantic identifier format is covered by validate_identifier_semantic_format via multiple validators
RESERVED_IDENTIFIERS = %w[new menu queries filters identifier_update_dialog identifier_suggestion].freeze
included do
extend FriendlyId
normalizes :identifier, with: OpenProject::RemoveInvisibleCharacters
### ID generators
# Generators
# There are two supported formats:
# 1. slug identifiers (e.g. "project_one"), generated by acts_as_url
# * work package ID = global ID (e.g. "#123")
@@ -52,7 +54,7 @@ module Projects::Identifier
url_attribute: :identifier,
sync_url: false, # Don't update identifier when name changes
only_when_blank: true, # Only generate when identifier not set
limit: IDENTIFIER_MAX_LENGTH,
limit: CLASSIC_IDENTIFIER_MAX_LENGTH,
blacklist: RESERVED_IDENTIFIERS,
adapter: OpenProject::ActsAsUrl::Adapter::OpActiveRecord, # use a custom adapter able to handle edge cases
skip_if: -> { Setting::WorkPackageIdentifier.semantic? }
@@ -62,28 +64,13 @@ module Projects::Identifier
on: :create,
if: -> { Setting::WorkPackageIdentifier.semantic? && identifier.blank? }
### ID validators
# Shared validators for all identifier formats
# Validators
validates :identifier,
presence: true,
uniqueness: { case_sensitive: false },
length: { maximum: IDENTIFIER_MAX_LENGTH },
if: ->(p) { p.persisted? || p.identifier.present? }
# Validators for the numeric (legacy) identifier format (e.g. "my-project", "project_one")
validate :identifier_numeric_format,
if: ->(p) { p.identifier_changed? && p.identifier.present? && Setting::WorkPackageIdentifier.classic? }
# Validators for the semantic (alphanumeric) identifier format (e.g. "PROJ1")
validate :identifier_alphanumeric_format,
if: ->(p) { p.identifier_changed? && p.identifier.present? && Setting::WorkPackageIdentifier.semantic? }
validate :identifier_not_reserved, if: -> { identifier.present? }
# Complements the uniqueness validation above: once an identifier has been used by a
# project, it remains reserved for that project even after the project moves to a new
# identifier. This prevents another project from claiming a "retired" identifier.
validate :identifier_not_historically_reserved, if: ->(p) { p.identifier_changed? }
validate :validate_identifier, if: ->(p) { p.identifier_changed? && p.identifier.present? }
friendly_id :identifier, use: %i[finders history], slug_column: :identifier
@@ -96,23 +83,61 @@ module Projects::Identifier
def unset_slug_if_invalid; end
end
# Domain-named scopes for the FriendlyId::Slug relation returned by Project.identifier_slugs.
# Lets callers compose against verbs like .historically_reserved / .for_identifier / .upcased_values
# instead of raw SQL fragments — keeping FriendlyId::Slug column knowledge in one place.
module IdentifierSlugScopes
# Slugs that are no longer used as any active project's identifier, but remain reserved
# because FriendlyId still owns them — so they cannot be reused by another project.
def historically_reserved
where("LOWER(slug) NOT IN (SELECT LOWER(identifier) FROM projects)")
end
# Slugs whose lowercase form equals the lowercased input.
def for_identifier(value)
where("LOWER(slug) = ?", value.downcase)
end
# Excludes the given project's own slug history. No-op when project is nil.
def excluding_project(project)
project ? where.not(sluggable_id: project) : self
end
def upcased_values = pluck(Arel.sql("UPPER(slug)"))
def downcased_values = pluck(Arel.sql("LOWER(slug)"))
# Verbatim values, no case folding. Named `raw_values` to avoid colliding
# with `ActiveRecord::Relation#values` (an internal Rails method).
def raw_values = pluck(:slug)
end
class_methods do
def classic_identifier_format?(str)
str.match?(CLASSIC_IDENTIFIER_FORMAT)
end
def suggest_identifier(name)
if Setting::WorkPackageIdentifier.semantic?
# FriendlyId's :history module records a row on every save, so this relation contains
# both currently-used identifiers and historically-reserved ones. Compose with
# `.historically_reserved` to filter to the latter. The name aligns with FriendlyId's
# `project.slugs` association for vocabulary consistency.
def identifier_slugs
FriendlyId::Slug.where(sluggable_type: name).extending(IdentifierSlugScopes)
end
def suggest_identifier(name, mode: Setting[:work_packages_identifier])
if mode == Setting::WorkPackageIdentifier::SEMANTIC
exclude = ProjectIdentifiers::IdentifierAutofix::ProblematicIdentifiers.reserved_identifiers
ProjectIdentifiers::IdentifierAutofix::ProjectIdentifierSuggestionGenerator
.suggest_identifier(name, exclude:)
else # This should closely enough emulate Project models' usage of acts_as_url
name.to_url.first(IDENTIFIER_MAX_LENGTH).presence ||
"project-#{SecureRandom.alphanumeric(5).downcase}"
else
ProjectIdentifiers::ClassicIdentifierSuggestionGenerator.new.suggest_identifier(name)
end
end
end
def suggest_identifier(mode: Setting[:work_packages_identifier])
self.class.suggest_identifier(name, mode:)
end
# Override the `validation_context` getter to include the `default_validation_context` when the
# context is `:saving_custom_fields`. This is required, because the `acts_as_url` plugin from
# `stringex` defines a callback on the `:create` context for initialising the `identifier` field.
@@ -133,15 +158,26 @@ module Projects::Identifier
private
# Contains only a-z, 0-9, dashes and underscores but cannot consist of numbers only
# as that would clash with the numeric id.
def identifier_numeric_format
unless identifier.match?(CLASSIC_IDENTIFIER_FORMAT)
errors.add(:identifier, :invalid)
def validate_identifier
validate_identifier_not_reserved_keyword
if Setting::WorkPackageIdentifier.semantic? || Array(validation_context).include?(:semantic_conversion)
validate_identifier_semantic_format
else
validate_identifier_classic_format
end
validate_identifier_not_historically_reserved
end
def validate_identifier_classic_format
errors.add(:identifier, :invalid) unless self.class.classic_identifier_format?(identifier)
if identifier.length > CLASSIC_IDENTIFIER_MAX_LENGTH
errors.add(:identifier, :too_long, count: CLASSIC_IDENTIFIER_MAX_LENGTH)
end
end
def identifier_alphanumeric_format
def validate_identifier_semantic_format
errors.add(:identifier, :must_start_with_letter) unless identifier.match?(/\A[A-Z]/)
errors.add(:identifier, :no_special_characters) unless identifier.match?(/\A[A-Z0-9_]*\z/)
if identifier.length > SEMANTIC_IDENTIFIER_MAX_LENGTH
@@ -149,8 +185,8 @@ module Projects::Identifier
end
end
def identifier_not_reserved
if RESERVED_IDENTIFIERS.include?(identifier&.downcase)
def validate_identifier_not_reserved_keyword
if RESERVED_IDENTIFIERS.include?(identifier.downcase)
errors.add(:identifier, :exclusion)
end
end
@@ -158,17 +194,18 @@ module Projects::Identifier
# Checks friendly_id_slugs for any project that previously used this identifier and
# has since changed it. It allows a project to switch back to an identifier it has
# used before. Uses LOWER() because slugs may be stored in a different case than the
# incoming identifier (e.g. old lowercase slug vs new uppercase alphanumeric identifier).
def identifier_not_historically_reserved
# incoming identifier (e.g. old lowercase slug vs new uppercase semantic identifier).
def validate_identifier_not_historically_reserved
return if errors.any? { |error| error.attribute == :identifier && error.type == :taken }
already_existing = FriendlyId::Slug
.where("LOWER(slug) = LOWER(?)", identifier)
.where(sluggable_type: self.class.to_s)
.where.not(sluggable_id: id)
.exists?
errors.add(:identifier, :taken, value: identifier) if identifier_used_by_other_project_in_past?
end
errors.add(:identifier, :taken, value: identifier) if already_existing
def identifier_used_by_other_project_in_past?
self.class.identifier_slugs
.for_identifier(identifier)
.where.not(sluggable_id: id)
.exists?
end
def generate_semantic_identifier
-44
View File
@@ -1,44 +0,0 @@
# 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::Users
::Queries::Register.register(UserQuery) do
filter Filters::NameFilter
filter Filters::AnyNameAttributeFilter
filter Filters::GroupFilter
filter Filters::StatusFilter
filter Filters::LoginFilter
filter Filters::BlockedFilter
order Orders::DefaultOrder
order Orders::NameOrder
order Orders::GroupOrder
end
end
+64
View File
@@ -0,0 +1,64 @@
# 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 UserCardView < PersistedView
SECONDARY_INFO = %w[role email login none].freeze
TAG_SOURCES = %w[groups roles none].freeze
CARD_SIZES = %w[compact default expanded].freeze
store_attribute :options, :secondary_info, :string, default: "role"
store_attribute :options, :show_status_badge, :boolean, default: true
store_attribute :options, :show_email, :boolean, default: false
store_attribute :options, :tag_source, :string, default: "groups"
store_attribute :options, :tag_limit, :integer, default: 3
store_attribute :options, :card_size, :string, default: "default"
store_attribute :options, :columns_per_row, :integer, default: 3
validates :secondary_info, inclusion: { in: SECONDARY_INFO }
validates :tag_source, inclusion: { in: TAG_SOURCES }
validates :card_size, inclusion: { in: CARD_SIZES }
validates :tag_limit, numericality: { only_integer: true, in: 0..10 }
validates :columns_per_row, numericality: { only_integer: true, in: 1..4 }
validate :query_must_be_user_query
def results
effective_query&.results
end
private
def query_must_be_user_query
resolved = effective_query
return if resolved.nil? || resolved.is_a?(UserQuery)
errors.add(:query, :invalid)
end
end
+53
View File
@@ -0,0 +1,53 @@
# 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 UserQuery < PersistedQuery
def self.model
User
end
def default_scope
# Excludes the SystemUser, DeletedUser, AnonymousUser STI descendants of User.
User.user
end
register_query do
filter Queries::Users::Filters::NameFilter
filter Queries::Users::Filters::AnyNameAttributeFilter
filter Queries::Users::Filters::GroupFilter
filter Queries::Users::Filters::StatusFilter
filter Queries::Users::Filters::LoginFilter
filter Queries::Users::Filters::BlockedFilter
order Queries::Users::Orders::DefaultOrder
order Queries::Users::Orders::NameOrder
order Queries::Users::Orders::GroupOrder
end
end
@@ -88,6 +88,27 @@ module WorkPackage::SemanticIdentifier
identifier.presence || id
end
# Returns the identifier formatted for inline UI display.
# Semantic mode: "PROJ-42" (no prefix — self-describing)
# Classic mode: "#42" (hash-prefixed)
def formatted_id
did = display_id
did.is_a?(String) && did.match?(/[A-Za-z]/) ? did : "##{did}"
end
# Override ActiveRecord's default `to_param` so Rails URL helpers
# (work_package_path, polymorphic_path, form_for, etc.) automatically
# produce semantic-id URLs in semantic mode. In classic mode display_id
# returns the integer primary key, so this is behaviourally identical
# to the inherited `id&.to_s`.
#
# API v3 deliberately bypasses this by passing `id:` kwargs explicitly
# (see lib/api/v3/work_packages/work_package_representer.rb) so HAL
# self-links remain numeric and stable for API consumers.
def to_param
display_id&.to_s
end
# Allocates the next semantic identifier in the current project and assigns it to the WP.
# Also writes alias rows for every identifier the project has ever used (including "ghost" aliases).
#
+1 -1
View File
@@ -118,7 +118,7 @@ module WorkPackages::Costs
reassign_to = ::WorkPackage
.joins(:project)
.merge(Project.allowed_to(user, :edit_cost_entries))
.find_by_id(ids)
.find_by(id: ids)
if reassign_to.nil?
work_packages.each do |wp|
+1 -1
View File
@@ -37,7 +37,7 @@ module McpResources
default_description "Access users of this OpenProject instance."
def read(id:)
user = ::User.visible(current_user).find_by_unique(id) # rubocop:disable Rails/DynamicFindBy
user = ::User.visible(current_user).find_by_unique(id)
return nil if user.nil?
API::V3::Users::UserRepresenter.create(user, current_user:)
@@ -0,0 +1,85 @@
# 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 ProjectIdentifiers
# Generates a unique classic-format (acts_as_url-style) identifier from a project name,
# mirroring acts_as_url's own duplicate loop: appends -1, -2, … until a free slug is found.
#
# Instantiate once to load the taken-identifier set from the DB, then call +suggest_identifier+.
class ClassicIdentifierSuggestionGenerator
FALLBACK_BASE = "project"
def initialize(project: nil)
@exclude = taken_identifiers(project:)
end
# Returns the most-recent classic-format slug from the project's FriendlyId history,
# or nil if none exists. Availability is not checked — callers must handle conflicts.
def restore_identifier(project)
project.slugs
.order(created_at: :desc)
.pluck(:slug)
.find { |slug| Project.classic_identifier_format?(slug) }
end
# Generates a unique classic-format identifier from +name+, mirroring acts_as_url's
# duplicate loop: appends -1, -2, … until a slug not in the taken set is found.
# Falls back to a randomised +FALLBACK_BASE+ slug when +name+ produces a blank slug.
def suggest_identifier(name)
base = slugify(name) || fallback_base
candidate = base
n = 1
loop do
return candidate if @exclude.exclude?(candidate.downcase)
candidate = "#{base}-#{n}"
n += 1
end
end
private
def slugify(name)
name.to_url.first(Projects::Identifier::CLASSIC_IDENTIFIER_MAX_LENGTH).presence
end
def fallback_base
"#{FALLBACK_BASE}-#{SecureRandom.alphanumeric(5).downcase}"
end
def taken_identifiers(project: nil)
current = Project.unscoped.pluck(:identifier).compact.to_set(&:downcase)
historical = Project.identifier_slugs.excluding_project(project).downcased_values.to_set
reserved = Projects::Identifier::RESERVED_IDENTIFIERS.to_set
current | historical | reserved
end
end
end
@@ -71,23 +71,17 @@ module ProjectIdentifiers
end
def assign_semantic_identifier
# Re-instantiate inside the lock so the exclusion set reflects all
# identifiers committed since this job started.
detector = ProjectIdentifiers::IdentifierAutofix::ProblematicIdentifiers.new
generator = ProjectIdentifiers::IdentifierAutofix::ProjectIdentifierSuggestionGenerator
# Prefer restoring the project's last known semantic identifier (from
# FriendlyId history) so that existing WP identifiers remain valid and
# aliases need no update. Fall back to generating a fresh suggestion.
new_identifier = project.previous_semantic_identifier ||
generator.suggest_identifier(project.name, exclude: detector.exclusion_set)
project.suggest_identifier(mode: Setting::WorkPackageIdentifier::SEMANTIC)
raise "Generated identifier is blank for project #{project.id}" if new_identifier.blank?
project.identifier = new_identifier
# Bypass validation, because we're technically still in classic mode, so the model would be applying
# validation for classic identifiers.
project.save!(validate: false)
# Save with the validation context that allows to save semantic ID while system is in classic mode
project.save!(context: :semantic_conversion)
end
def reset_stale_identifiers
@@ -53,7 +53,7 @@ module ProjectIdentifiers
def generate_suggestions(analysis)
ProjectIdentifierSuggestionGenerator.call(
preview_projects(analysis.scope),
exclude: analysis.exclusion_set.to_set(&:upcase)
exclude: analysis.reserved_identifiers_for_admin_preview.to_set(&:upcase)
)
end
@@ -37,7 +37,7 @@ module ProjectIdentifiers
#
# == Performance notes
#
# * +#exclusion_set+ loads all non-problematic identifiers and historical slugs
# * +#reserved_identifiers_for_admin_preview+ loads all non-problematic identifiers and historical slugs
# into memory. Fine for a one-off admin migration; if this ever becomes a hot
# path, consider a DB-backed exclusion check instead.
#
@@ -47,11 +47,15 @@ module ProjectIdentifiers
#
#
class ProblematicIdentifiers
# Returns all project identifiers (current and historical) tracked by
# FriendlyId's slug history. Useful as an exclusion set when generating
# new identifiers, since any slug that was ever in use must not be reused.
# Returns a Set of uppercased identifiers that must not be reused.
# Combines all FriendlyId slug history for projects (current and historical slugs)
# with system-reserved keywords from Projects::Identifier::RESERVED_IDENTIFIERS.
def self.reserved_identifiers
FriendlyId::Slug.where(sluggable_type: Project.name).pluck(:slug).to_set
Project.identifier_slugs.upcased_values.to_set | model_reserved_identifiers
end
def self.model_reserved_identifiers
Projects::Identifier::RESERVED_IDENTIFIERS.to_set(&:upcase)
end
# Priority-ordered format rules for identifier classification.
@@ -77,7 +81,7 @@ module ProjectIdentifiers
end
def self.max_identifier_length
ProjectIdentifierSuggestionGenerator::IDENTIFIER_LENGTH[:max]
Projects::Identifier::SEMANTIC_IDENTIFIER_MAX_LENGTH
end
def scope
@@ -96,20 +100,17 @@ module ProjectIdentifiers
end
# Returns a Set of identifiers that must not be suggested for new assignments.
# Combines currently active identifiers from non-problematic projects with
# historically reserved identifiers from FriendlyId slug history.
def exclusion_set
historical_identifiers | in_use_identifiers
# Unions currently active identifiers (non-problematic projects), historical FriendlyId slugs,
# and system-reserved keywords — the full exclusion set used by #collision_error_reason.
# Uses instance-level memoization so the same loaded sets power both this method and collision checks.
def reserved_identifiers_for_admin_preview
historical_identifiers | current_identifiers | self.class.model_reserved_identifiers
end
private
def historical_identifiers
@historical_identifiers ||= FriendlyId::Slug
.where(sluggable_type: Project.name)
.where("LOWER(slug) NOT IN (SELECT LOWER(identifier) FROM projects)")
.pluck(:slug)
.to_set
@historical_identifiers ||= Project.identifier_slugs.historically_reserved.upcased_values.to_set
end
def exceeds_max_length = Project.where("length(identifier) > ?", self.class.max_identifier_length)
@@ -118,17 +119,18 @@ module ProjectIdentifiers
def not_fully_uppercased = Project.where("identifier != UPPER(identifier)")
def collision_error_reason(identifier)
if in_use_identifiers.include?(identifier)
if self.class.model_reserved_identifiers.include?(identifier)
:reserved_by_system
elsif current_identifiers.include?(identifier)
:in_use
elsif historical_identifiers.include?(identifier)
:reserved
:used_in_past
end
end
def in_use_identifiers
@in_use_identifiers ||= Project.where.not(id: scope.select(:id)).pluck(:identifier).to_set
def current_identifiers
@current_identifiers ||= Project.where.not(id: scope.select(:id)).pluck(:identifier).to_set
end
end
end
end
@@ -51,18 +51,9 @@ module ProjectIdentifiers
attr_reader :project
def restore_classic_identifier
classic = previous_classic_identifier.presence || Project.suggest_identifier(project.name)
generator = ProjectIdentifiers::ClassicIdentifierSuggestionGenerator.new
classic = generator.restore_identifier(project) || generator.suggest_identifier(project.name)
project.update!(identifier: classic)
end
# Returns the most-recent FriendlyId slug for this project that is in classic
# acts_as_url format (lowercase letters, digits, hyphens, underscores; not
# all-numeric), or nil if no such slug exists.
def previous_classic_identifier
project.slugs
.order(created_at: :desc)
.pluck(:slug)
.find { |slug| Project.classic_identifier_format?(slug) }
end
end
end
+6 -1
View File
@@ -41,7 +41,12 @@ xml.feed "xmlns" => "http://www.w3.org/2005/Atom" do
xml.entry do
xml.title "#{work_package.project.name} - #{work_package.type.name} ##{work_package.id}: #{work_package.subject}"
xml.link "rel" => "alternate", "href" => work_package_url(work_package)
xml.id url_for(controller: "/work_packages", action: "show", id: work_package, journal_id: change,
# RFC 4287 §4.2.6.1: atom:id MUST NOT change over time. Feed readers
# key entry deduplication on its byte value, so flipping the URL
# across a work_packages_identifier mode change would re-surface every
# historical entry as new in subscribers' readers. Pin to the numeric
# primary key to keep the id stable.
xml.id url_for(controller: "/work_packages", action: "show", id: work_package.id, journal_id: change,
only_path: false)
xml.updated change.created_at.xmlschema
xml.author do
+22 -9
View File
@@ -32,16 +32,29 @@ See COPYRIGHT and LICENSE files for more details.
<%=
render Primer::OpenProject::PageHeader.new do |header|
header.with_title { @role.name }
header.with_breadcrumbs([{ href: admin_index_path, text: t("label_administration") },
{ href: admin_settings_users_path, text: t(:label_user_and_permission) },
{ href: roles_path, text: t(:label_role_and_permissions) },
@role.name])
header.with_breadcrumbs(
[{ href: admin_index_path, text: t("label_administration") },
{ href: admin_settings_users_path, text: t(:label_user_and_permission) },
{ href: roles_path, text: t(:label_role_and_permissions) },
@role.name]
)
end
%>
<%= labelled_tabular_form_for @role, :url => { :action => 'update' }, :html => {:id => 'role_form'}, :as => :role do |f| %>
<%= hidden_field_tag :id, @role.id %>
<%= render partial: 'form', locals: { f: f , role: @role } %>
<br/>
<%= styled_button_tag t(:button_save), class: '-with-icon icon-checkmark' %>
<% if @role.is_a?(ProjectRole) && Setting.new_project_user_role_id.to_i == @role.id %>
<%= render(Primer::Alpha::Banner.new(scheme: :warning, icon: :alert, mb: 3)) do %>
<p><%= t("roles.edit.default_for_new_projects_warning") %></p>
<ul>
<% ProjectRole::PERMISSIONS_FOR_PROJECT_CREATOR.each do |permission| %>
<li><%= t("permission_#{permission}") %></li>
<% end %>
</ul>
<% end %>
<% end %>
<%= labelled_tabular_form_for @role, url: { action: "update" }, html: { id: "role_form" }, as: :role do |f| %>
<%= hidden_field_tag :id, @role.id %>
<%= render partial: "form", locals: { f: f, role: @role } %>
<br>
<%= styled_button_tag t(:button_save), class: "-with-icon icon-checkmark" %>
<% end %>
@@ -0,0 +1,3 @@
<%= turbo_frame_tag "content-bodyRight" do %>
<%= render(split_create_instance) %>
<% end %>
+7 -4
View File
@@ -187,9 +187,11 @@ See COPYRIGHT and LICENSE files for more details.
<% end %>
</th>
<% @statuses.each do |new_status| -%>
<% transition_saved = workflows.any? { it.old_status_id == old_status.id && it.new_status_id == new_status.id }
newly_added_status = @added_status_ids.include?(old_status.id) || @added_status_ids.include?(new_status.id) %>
<% transition_role_ids = workflows.select { it.old_status_id == old_status.id && it.new_status_id == new_status.id }.map(&:role_id).uniq
newly_added_status = @added_status_ids.include?(old_status.id) || @added_status_ids.include?(new_status.id)
some_roles = !transition_role_ids.empty? && transition_role_ids.size < @roles.size && !newly_added_status %>
<td>
<%= hidden_field_tag "indeterminate_status[#{old_status.id}][#{new_status.id}]", "1" if some_roles %>
<%=
render(Primer::BaseComponent.new(tag: :div, display: :flex, align_items: :center, mx: 1)) do
render(
@@ -198,13 +200,14 @@ See COPYRIGHT and LICENSE files for more details.
name: "status[#{old_status.id}][#{new_status.id}]",
id: "status_#{old_status.id}_#{new_status.id}", # See BUG https://github.com/primer/view_components/issues/3811
value: name,
checked: transition_saved || newly_added_status,
checked: !some_roles && (transition_role_ids.any? || newly_added_status),
label: t(".matrix_checkbox_label", old_status: old_status.name, new_status: new_status.name),
visually_hide_label: true,
data: {
checkable_target: "checkbox",
old_status: old_status.id,
new_status: new_status.id
new_status: new_status.id,
indeterminate: (true if some_roles)
}
)
)
+3 -3
View File
@@ -28,9 +28,9 @@ See COPYRIGHT and LICENSE files for more details.
++#%>
<% html_title t(:label_administration), t(:label_workflow_plural), @type.name -%>
<% content_for :content_header do %>
<%= render Workflows::PageHeaders::EditComponent.new(@type, role: @role, tabs: workflow_tabs(@type)) %>
<%= render Workflows::PageHeaders::EditComponent.new(@type, roles: @roles, tabs: workflow_tabs(@type)) %>
<% end %>
<% if @type && @role %>
<%= turbo_frame_tag "workflow-table", src: edit_workflow_tab_path(@type, @current_tab, role_id: @role.id, status_ids: params[:status_ids]) %>
<% if @type && @roles.any? %>
<%= turbo_frame_tag "workflow-table", src: edit_workflow_tab_path(@type, @current_tab, role_ids: @roles.map(&:id), status_ids: params[:status_ids]) %>
<% end %>
+1 -1
View File
@@ -61,7 +61,7 @@ See COPYRIGHT and LICENSE files for more details.
<td><%= h type %></td>
<% roles.each do |role, count| -%>
<td>
<%= link_to((count > 0 ? count : content_tag(:span, "", class: "icon-close icon-context icon-button")), edit_workflow_path(type, role_id: role), title: t(:button_edit)) %>
<%= link_to((count > 0 ? count : content_tag(:span, "", class: "icon-close icon-context icon-button")), edit_workflow_path(type, role_ids: [role]), title: t(:button_edit)) %>
</td>
<% end -%>
</tr>
+2 -2
View File
@@ -28,8 +28,8 @@ See COPYRIGHT and LICENSE files for more details.
++#%>
<%= turbo_frame_tag "workflow-table", data: { turbo_cache: false } do %>
<%= render Workflows::StatusMatrixFormComponent.new(tab: @tab, role: @role, type: @type, available_roles: @eligible_roles, statuses: @statuses, has_status_changes: @has_status_changes) %>
<%= render Workflows::StatusMatrixFormComponent.new(tab: @tab, roles: @roles, type: @type, available_roles: @eligible_roles, statuses: @statuses, has_status_changes: @has_status_changes) %>
<%= turbo_stream.replace(Workflows::PageHeaders::EditComponent.wrapper_key) do %>
<%= render Workflows::PageHeaders::EditComponent.new(@type, role: @role, tabs: workflow_tabs(@type)) %>
<%= render Workflows::PageHeaders::EditComponent.new(@type, roles: @roles, tabs: workflow_tabs(@type)) %>
<% end %>
<% end %>
+27
View File
@@ -67,6 +67,9 @@ class Principals::DeleteJob < ApplicationJob
def delete_associated(principal)
delete_notifications(principal)
delete_private_queries(principal)
delete_private_persisted_views(principal)
nullify_persisted_query_principals(principal)
delete_user_ordered_query_entities(principal)
delete_tokens(principal)
delete_favorites(principal)
end
@@ -84,6 +87,30 @@ class Principals::DeleteJob < ApplicationJob
CostQuery.where(user_id: principal.id, is_public: false).delete_all
end
# Private persisted views belong to their owner and are removed with them.
# Public views are kept, but their principal reference is nullified so the
# view becomes "ownerless" rather than pointing at the soon-to-be-deleted
# user. Destroying the private views also triggers the view's after_destroy
# hook, which cleans up queries that are no longer referenced by any public
# view.
def delete_private_persisted_views(principal)
PersistedView.where(principal_id: principal.id, public: false).destroy_all
PersistedView.where(principal_id: principal.id, public: true).update_all(principal_id: nil)
end
# Queries have no public/private flag — their visibility is derived from the
# views that reference them. Any query still reachable after the view
# cleanup above stays; we just drop the owner pointer.
def nullify_persisted_query_principals(principal)
PersistedQuery.where(principal_id: principal.id).update_all(principal_id: nil)
end
# Manually curated entries that point at the deleted user are dropped — a
# list of "Deleted user, Deleted user, …" is worse than just removing them.
def delete_user_ordered_query_entities(principal)
OrderedPersistedQueryEntity.where(entity: principal).delete_all
end
def delete_favorites(principal)
Favorite.where(user_id: principal.id).delete_all
end
+8 -1
View File
@@ -13,6 +13,10 @@ fi
COMPOSE_FILE=docker-compose.yml
if [ -f docker-compose.override.yml ]; then
COMPOSE_FILE="$COMPOSE_FILE -f docker-compose.override.yml"
fi
if [ $# -eq 0 ]; then
echo "Usage: bin/compose <command> [args*]"
echo
@@ -21,6 +25,7 @@ if [ $# -eq 0 ]; then
echo " reset - Resets everything by removing all containers and deleting all volumes. You need to run \`setup\` again afterwards. "
echo " start - Starts both backend and frontend in the background. Access via http://localhost:3000/ by default."
echo " run - Starts the frontend in the background and backend in the foreground. Useful for debugging using pry."
echo " restart [service] - Restarts one or all running services."
echo " rspec - Runs rspec inside the \`backend-test\` container which will be started if it's not running yet."
echo " * - Everything else will be passed straight to \`docker-compose\`."
echo
@@ -54,6 +59,8 @@ elif [[ "$@" = "run" ]]; then
elif [[ "$1" = "setup" ]]; then
$DOCKER_COMPOSE -f $COMPOSE_FILE run backend setup
yes no | $DOCKER_COMPOSE -f $COMPOSE_FILE run frontend npm install
elif [[ "$1" = "restart" ]]; then
$DOCKER_COMPOSE -f $COMPOSE_FILE restart "${@:2}"
elif [[ "$1" = "reset" ]]; then
$DOCKER_COMPOSE -f $COMPOSE_FILE down && docker volume rm `docker volume ls -q | grep ${PWD##*/}_`
elif [[ "$1" = "rspec" ]]; then
@@ -84,5 +91,5 @@ elif [[ "$1" = "rspec" ]]; then
$DOCKER_COMPOSE -f $COMPOSE_FILE exec backend-test bundle exec rspec "${@:2}"
else
$DOCKER_COMPOSE -f $COMPOSE_FILE $*
$DOCKER_COMPOSE -f $COMPOSE_FILE "$@"
fi
+1 -1
View File
@@ -38,7 +38,7 @@ development:
adapter: postgresql
encoding: unicode
database: openproject_development
pool: 5
pool: 100
username: openproject_development
password:
@@ -121,7 +121,7 @@ Rails.application.config.after_initialize do
# Configure CSP directives
policy.default_src(*default_src)
policy.base_uri("'self'")
policy.font_src(*assets_src, "data:", "'self'")
policy.font_src(*assets_src, "data:")
policy.form_action(*form_action)
policy.frame_src(*frame_src, "'self'")
policy.frame_ancestors("'self'")
+27 -6
View File
@@ -28,12 +28,33 @@
# See COPYRIGHT and LICENSE files for more details.
#++
config = Rails.env.production? && Rails.application.config.database_configuration[Rails.env]
pool_size = config && [OpenProject::Configuration.web_max_threads + 1, config["pool"].to_i].max
if Rails.env.production?
config = Rails.application.config.database_configuration[Rails.env]
pool_size = config && [OpenProject::Configuration.web_max_threads + 1, config["pool"].to_i].max
# make sure we have enough connections in the pool for each thread and then some
if pool_size && pool_size > ActiveRecord::Base.connection_pool.size
Rails.logger.info { "Increasing database pool size to #{pool_size} to match max threads" }
# make sure we have enough connections in the pool for each thread and then some
if pool_size && pool_size > ActiveRecord::Base.connection_pool.size
Rails.logger.info { "Increasing database pool size to #{pool_size} to match max threads" }
ActiveRecord::Base.establish_connection config.merge(pool: pool_size)
ActiveRecord::Base.establish_connection config.merge(pool: pool_size)
end
end
# Log a warning if we encounter an under-provisioned dev setup
if Rails.env.local?
utility_connections = 1 + GoodJob::SharedExecutor::MAX_THREADS # based on GoodJob documentation
required_pool_size = OpenProject::Configuration.web_max_threads +
OpenProject::Configuration.good_job_max_threads +
utility_connections
if ActiveRecord::Base.connection_pool.size < required_pool_size
Rails.logger.warn do
"DB pool size of #{ActiveRecord::Base.connection_pool.size} is too small and could cause problems. " \
"The recommended sizing is at least #{required_pool_size} " \
"(#{OpenProject::Configuration.web_max_threads} for web_max_threads + " \
"#{OpenProject::Configuration.good_job_max_threads} for web_max_threads + " \
"#{utility_connections} for GoodJob utility connections). " \
"Please adjust the pool parameter in database.yml or \"?pool=N\" parameter in DATABASE_URL."
end
end
end
+35 -1
View File
@@ -419,7 +419,8 @@ af:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
one: "... 1 more project"
@@ -460,8 +461,12 @@ af:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
one: "%{count} role selected"
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1110,6 +1115,8 @@ af:
no_results_title_text: There is currently no news to report.
no_results_content_text: Add a news item
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -2000,6 +2007,29 @@ af:
type: Soort
version: Weergawe
watcher: Dophouer
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: must be accepted.
@@ -4219,6 +4249,7 @@ af:
label_role_new: New role
label_role_grantable: Grantable role
label_role_plural: Rolle
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Assign role to new members
label_scm: SCM
label_scroll_left: Scroll left
@@ -5157,6 +5188,9 @@ af:
setting_mail_handler_body_delimiter_regex: Stomp eposse af wat ooreenstem met hierdie "regular expression"
setting_mail_handler_ignore_filenames: Ignored mail attachments
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+39 -1
View File
@@ -443,7 +443,8 @@ ar:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
zero: "... %{count} more projects"
@@ -492,8 +493,16 @@ ar:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
zero: "%{count} roles selected"
one: "%{count} role selected"
two: "%{count} roles selected"
few: "%{count} roles selected"
many: "%{count} roles selected"
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1170,6 +1179,8 @@ ar:
no_results_title_text: لا يوجد حالياً أخبار لتقدم.
no_results_content_text: أضف عنصر أخبار
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -2080,6 +2091,29 @@ ar:
type: النّوع
version: الإصدار
watcher: المشاهد
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: يجب أن تقبل.
@@ -4461,6 +4495,7 @@ ar:
label_role_new: دور جديد
label_role_grantable: Grantable role
label_role_plural: دور
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: تعيين دور للأعضاء الجدد
label_scm: اختصاراً لِ:"Supply Chain Management" إدارة سلسة الإمداد
label_scroll_left: Scroll left
@@ -5411,6 +5446,9 @@ ar:
setting_mail_handler_body_delimiter_regex: حذف رسائل البريد الإلكتروني المطابقة لهذا التعبير الاعتيادي
setting_mail_handler_ignore_filenames: Ignored mail attachments
setting_new_project_user_role_id: الدور الممنوح لمستخدم غير مسؤول الذي يقوم بإنشاء مشروع
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+35 -1
View File
@@ -419,7 +419,8 @@ az:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
one: "... 1 more project"
@@ -460,8 +461,12 @@ az:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
one: "%{count} role selected"
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1110,6 +1115,8 @@ az:
no_results_title_text: There is currently no news to report.
no_results_content_text: Add a news item
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -2000,6 +2007,29 @@ az:
type: Type
version: Version
watcher: Watcher
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: must be accepted.
@@ -4219,6 +4249,7 @@ az:
label_role_new: New role
label_role_grantable: Grantable role
label_role_plural: Roles
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Assign role to new members
label_scm: SCM
label_scroll_left: Scroll left
@@ -5157,6 +5188,9 @@ az:
setting_mail_handler_body_delimiter_regex: Truncate emails matching this regex
setting_mail_handler_ignore_filenames: Ignored mail attachments
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+37 -1
View File
@@ -431,7 +431,8 @@ be:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
one: "... 1 more project"
@@ -476,8 +477,14 @@ be:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
one: "%{count} role selected"
few: "%{count} roles selected"
many: "%{count} roles selected"
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1140,6 +1147,8 @@ be:
no_results_title_text: There is currently no news to report.
no_results_content_text: Add a news item
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -2040,6 +2049,29 @@ be:
type: Type
version: Version
watcher: Watcher
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: must be accepted.
@@ -4341,6 +4373,7 @@ be:
label_role_new: New role
label_role_grantable: Grantable role
label_role_plural: Roles
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Assign role to new members
label_scm: SCM
label_scroll_left: Scroll left
@@ -5289,6 +5322,9 @@ be:
setting_mail_handler_body_delimiter_regex: Truncate emails matching this regex
setting_mail_handler_ignore_filenames: Ignored mail attachments
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+35 -1
View File
@@ -419,7 +419,8 @@ bg:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
one: "... 1 more project"
@@ -460,8 +461,12 @@ bg:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
one: "%{count} role selected"
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1110,6 +1115,8 @@ bg:
no_results_title_text: Няма новини за докладване.
no_results_content_text: Добави новина
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -2000,6 +2007,29 @@ bg:
type: Тип
version: Версия
watcher: Наблюдател
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: трябва да бъде одобрено.
@@ -4217,6 +4247,7 @@ bg:
label_role_new: Нова роля
label_role_grantable: Grantable role
label_role_plural: Роли
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Assign role to new members
label_scm: SCM
label_scroll_left: Scroll left
@@ -5151,6 +5182,9 @@ bg:
setting_mail_handler_body_delimiter_regex: Съкрати мейл адресите от една област
setting_mail_handler_ignore_filenames: Ignored mail attachments
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+35 -1
View File
@@ -419,7 +419,8 @@ ca:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
one: "... 1 more project"
@@ -460,8 +461,12 @@ ca:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
one: "%{count} role selected"
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1109,6 +1114,8 @@ ca:
no_results_title_text: Actualment no hi ha cap novetat per a informar.
no_results_content_text: Afegir una notícia
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -1999,6 +2006,29 @@ ca:
type: Classe
version: Versió
watcher: Observador
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: hauran de ser acceptats.
@@ -4216,6 +4246,7 @@ ca:
label_role_new: Nou rol
label_role_grantable: Grantable role
label_role_plural: Rols
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Assignar rols als nous membres
label_scm: SCM
label_scroll_left: Scroll left
@@ -5144,6 +5175,9 @@ ca:
setting_mail_handler_body_delimiter_regex: Trunca els missatges de correu electrònic que coincideixen amb aquesta expressió regular
setting_mail_handler_ignore_filenames: Ignora els fitxers adjunts del correu electrònic
setting_new_project_user_role_id: Rol donat per un usuari no-admin que crea un projecte
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+35 -1
View File
@@ -419,7 +419,8 @@ ckb-IR:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
one: "... 1 more project"
@@ -460,8 +461,12 @@ ckb-IR:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
one: "%{count} role selected"
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1110,6 +1115,8 @@ ckb-IR:
no_results_title_text: There is currently no news to report.
no_results_content_text: Add a news item
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -2000,6 +2007,29 @@ ckb-IR:
type: Type
version: Version
watcher: Watcher
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: must be accepted.
@@ -4219,6 +4249,7 @@ ckb-IR:
label_role_new: New role
label_role_grantable: Grantable role
label_role_plural: Roles
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Assign role to new members
label_scm: SCM
label_scroll_left: Scroll left
@@ -5157,6 +5188,9 @@ ckb-IR:
setting_mail_handler_body_delimiter_regex: Truncate emails matching this regex
setting_mail_handler_ignore_filenames: Ignored mail attachments
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+62 -26
View File
@@ -431,7 +431,8 @@ cs:
error_special_characters: Speciální znaky nejsou povoleny
error_not_fully_uppercased: Musí být napsán velkými písmeny
error_in_use: Již se používá jako identifikátor jiného projektu
error_reserved: Již se dříve používal jako identifikátor jiného projektu
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Potřebuje ruční revizi
remaining_projects:
one: "... 1 další projekt"
@@ -476,8 +477,14 @@ cs:
ignore: Ignorovat změny
save: Uložit změny a pokračovat
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Vybrat roli
roles:
one: "%{count} role selected"
few: "%{count} roles selected"
many: "%{count} roles selected"
other: "%{count} roles selected"
blankslate:
title: Nejsou nakonfigurovány žádné stavové přechody
description: Add statuses to start configuring workflows for this role
@@ -1140,6 +1147,8 @@ cs:
no_results_title_text: V současné době neexistují žádné zprávy k zobrazení.
no_results_content_text: Přidat příspěvek
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -1800,7 +1809,7 @@ cs:
enabled_modules: Povolené moduly
identifier: Identifikátor
latest_activity_at: Poslední aktivita
parent: Nadřazený projekt
parent: Podprojekt
project_creation_wizard_enabled: Project initiation request
public_value:
title: Viditelnost
@@ -2042,6 +2051,29 @@ cs:
type: Typ
version: Verze
watcher: Sledující
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: musí být přijato.
@@ -2212,7 +2244,7 @@ cs:
message:
cannot_move_message_to_forum_of_different_project: A message cannot be moved to a forum of a different project.
notifications:
at_least_one_channel: Pro odesílání notifikací musí být specifikován alespoň jeden kanál
at_least_one_channel: Alespoň jeden kanál pro odesílání oznámení musí být specifikován.
attributes:
read_ian:
read_on_creation: 'nelze nastavit na pravdivé při vytváření oznámení '
@@ -2522,11 +2554,11 @@ cs:
member: Člen
news: Novinky
notification:
one: Notifikace
few: Notifikací
many: Notifikací
other: Notifikace
placeholder_user: Placeholder uživatel
one: Oznámení
few: Oznámení
many: Oznámení
other: Oznámení
placeholder_user: placeholder uživatel
project:
one: Projekt
few: Projekty
@@ -3617,7 +3649,7 @@ cs:
ai: Umělá Inteligence (AI)
aggregation: Agregace
api_and_webhooks: API & Webhooky
mail_notification: E-mailové notifikace
mail_notification: E-mailová upozornění
mails_and_notifications: E-maily a oznámení
mcp_configurations: Protokol MCP (Model Context Protocol)
quick_add:
@@ -3779,7 +3811,7 @@ cs:
by_project: Nepřečteno dle projektu
by_reason: Důvod
inbox: Doručená pošta
send_notifications: Pro tuto akci odeslat notifikaci
send_notifications: Odeslat oznámení pro tuto akci
work_packages:
subject:
created: Pracovní balíček byl vytvořen.
@@ -4244,9 +4276,9 @@ cs:
label_permissions: Práva
label_permissions_report: Přehled oprávnění
label_personalize_page: Přizpůsobit tuto stránku
label_placeholder_user: Placeholder uživatel
label_placeholder_user: placeholder uživatel
label_placeholder_user_new: ''
label_placeholder_user_plural: Placeholder uživatelé
label_placeholder_user_plural: placeholder uživatelé
label_planning: Plánování
label_please_login: Přihlaste se prosím
label_plugins: Pluginy
@@ -4271,7 +4303,7 @@ cs:
label_project_attribute_plural: Atributy projektu
label_project_attribute_manage_link: Správa atributů produktu
label_project_count: Celkový počet projektů
label_project_copy_notifications: Během kopírování projektu odeslat notifikace e-mailem
label_project_copy_notifications: Během kopie projektu odeslat oznámení e-mailem
label_project_initiation_export_pdf: Export PDF for %{project_creation_name}
label_project_latest: Nejnovější projekty
label_project_default_type: Povolit prázdný typ
@@ -4343,6 +4375,7 @@ cs:
label_role_new: Nová role
label_role_grantable: Udělitelná role
label_role_plural: Role
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Přiřadit roli novým členům
label_scm: SCM
label_scroll_left: Rolovat vlevo
@@ -4432,7 +4465,7 @@ cs:
label_version_new: Nová verze
label_version_edit: Upravit verzi
label_version_plural: Verze
label_version_sharing_descendants: S podprojekty
label_version_sharing_descendants: S Podprojekty
label_version_sharing_hierarchy: S hierarchií projektu
label_version_sharing_none: Není sdíleno
label_version_sharing_system: Se všemi projekty
@@ -4570,28 +4603,28 @@ cs:
digests:
including_mention_singular: včetně zmínky
including_mention_plural: včetně %{number_mentioned} zmínění
unread_notification_singular: 1 nepřečtená notifikace
unread_notification_plural: "%{number_unread} nepřečtených notifikací"
unread_notification_singular: 1 nepřečtené oznámení
unread_notification_plural: "%{number_unread} nepřečtených oznámení"
you_have: Máte
logo_alt_text: Logo
mention:
subject: "%{user_name} vás zmínil v #%{id} - %{subject}"
notification:
center: Centrum notifikací
center: Centrum oznámení
see_in_center: Zobrazit komentář v oznamovacím centru
settings: Změnit nastavení e-mailu
salutation: Dobrý den, %{user},
salutation_full_name: Jméno a příjmení
work_packages:
created_at: 'Vytvořeno v %{timestamp} uživatelem %{user} '
login_to_see_all: Přihlaste se pro zobrazení všech notifikací.
login_to_see_all: Přihlaste se pro zobrazení všech oznámení.
mentioned: Byli jste <b>zmíněni v komentáři</b>
mentioned_by: "%{user} vás zmínil v komentáři OpenProject"
more_to_see:
one: Existuje ještě 1 pracovní balíček s notifikací.
few: Existuje ještě %{count} pracovních balíčků s notifikacema.
many: Existuje ještě %{count} pracovních balíčků s notifikacema.
other: Existuje ještě %{count} pracovních balíčků s notifikacema.
one: Máte ještě 1 pracovní balíček s notifikací.
few: Existuje ještě %{count} pracovních balíčků s oznámeními.
many: Máte ještě %{count} pracovních balíčků s notifikacemi.
other: Existuje ještě %{count} pracovních balíčků s oznámeními.
open_in_browser: Otevřít v prohlížeči
reason:
watched: Sledováno
@@ -4600,7 +4633,7 @@ cs:
mentioned: Zmíněné
shared: Sdílené
subscribed: vše
prefix: 'Obdrženo z důvodu nastavení notifikací: %{reason}'
prefix: 'Obdrženo z důvodu nastavení oznámení: %{reason}'
date_alert_start_date: Upozornění na datum
date_alert_due_date: Upozornění na datum
reminder: Připomínka
@@ -4913,7 +4946,7 @@ cs:
permission_move_work_packages: Přesun pracovních balíčků
permission_protect_wiki_pages: Ochrana stránky wiki
permission_rename_wiki_pages: Přejmenovat stránky wiki
permission_save_queries: Uložit zobrazení
permission_save_queries: Uložit pohled
permission_search_project: Hledat projekt
permission_select_custom_fields: Vybrat vlastní pole
permission_select_project_custom_fields: Vyberte atributy projektu
@@ -5291,6 +5324,9 @@ cs:
setting_mail_handler_body_delimiter_regex: Zkrátit e-maily odpovídající tomuto regexu
setting_mail_handler_ignore_filenames: Ignorované přílohy e-mailů
setting_new_project_user_role_id: Role přiřazená uživateli bez práv administrátora, který projekt vytvořil
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Text notifikace
setting_password_active_rules: Password requirements
@@ -5441,7 +5477,7 @@ cs:
enable_subscriptions_text_html: Umožňuje uživatelům s nezbytnými oprávněními přihlásit se do OpenProject kalendářů a získat přístup k informacím o pracovním balíčku prostřednictvím externího klienta kalendáře. <strong>Poznámka:</strong> Před povolením si prosím přečtěte <a href="%{link}" target="_blank">podrobnosti o odběru</a>.
language_name_being_default: "%{language_name} (výchozí)"
notifications:
events_explanation: Určuje, pro kterou událost je odeslán e-mail. Pracovní balíčky jsou z tohoto seznamu vyloučeny, protože notifikace pro ně mohou být nastavena speciálně pro každého uživatele.
events_explanation: Určuje, pro kterou událost je odeslán e-mail. Pracovní balíčky jsou z tohoto seznamu vyloučeny, protože oznámení pro ně mohou být nastavena speciálně pro každého uživatele.
delay_minutes_explanation: Odesílání e-mailu může být pozdrženo, aby bylo uživatelům s nakonfigurovaným v oznámení aplikace před odesláním pošty potvrzeno oznámení. Uživatelé, kteří si přečtou oznámení v aplikaci, nedostanou e-mail pro již přečtené oznámení.
other: Ostatní
passwords: Hesla
@@ -5646,7 +5682,7 @@ cs:
text_destroy_what_to_do: Co chcete udělat?
text_diff_truncated: "... Toto rozlišení bylo zkráceno, protože přesahuje maximální velikost, kterou lze zobrazit."
text_email_delivery_not_configured: |-
Doručení e-mailu není nakonfigurováno a notifikace jsou zakázány.
Doručení e-mailu není nakonfigurováno a oznámení jsou zakázána.
Nakonfigurujte váš SMTP server pro jejich povolení.
text_enumeration_category_reassign_to: 'Přiřadit je k této hodnotě:'
text_enumeration_destroy_question: "%{count} objektů je přiřazeno k této hodnotě."
+35 -1
View File
@@ -419,7 +419,8 @@ da:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
one: "... 1 more project"
@@ -460,8 +461,12 @@ da:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
one: "%{count} role selected"
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1109,6 +1114,8 @@ da:
no_results_title_text: There is currently no news to report.
no_results_content_text: Add a news item
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -1999,6 +2006,29 @@ da:
type: Type
version: Version
watcher: Tilsynsførende
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: skal accepteres.
@@ -4218,6 +4248,7 @@ da:
label_role_new: Ny rolle
label_role_grantable: Grantable role
label_role_plural: Rollee
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Assign role to new members
label_scm: Versionskontrolsystem
label_scroll_left: Scroll left
@@ -5150,6 +5181,9 @@ da:
setting_mail_handler_body_delimiter_regex: Truncate emails matching this regex
setting_mail_handler_ignore_filenames: Ignored mail attachments
setting_new_project_user_role_id: Rolle givet til bruger der opretter projekt uden at være administrator
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+49 -15
View File
@@ -87,11 +87,11 @@ de:
type_token_text: Ihr Enterprise-Token-Text
token_placeholder: Enterprise-Token Text hier einfügen
token_caption: Weitere Informationen über die Aktivierung der Enterprise Edition finden Sie in unserer [Dokumentation](docs_url).
add_token: Enterprise-Edition Support Token hochladen
add_token: Enterprise edition Support Token hochladen
replace_token: Aktuellen Enterprise edition Support Token ersetzen
order: Enterprise on-premises bestellen
paste: Enterprise-Edition Support Token hier einfügen
required_for_feature: Dieses Add-on ist nur mit einem aktiven Enterprise-Edition Support-Token verfügbar.
paste: Enterprise edition Support Token hier einfügen
required_for_feature: Dieses Add-on ist nur mit einem aktiven Enterprise edition Support-Token verfügbar.
enterprise_link: Klicken Sie hier für weitere Informationen.
start_trial: Kostenlose Testversion starten
book_now: Jetzt buchen
@@ -419,7 +419,8 @@ de:
error_special_characters: Sonderzeichen sind nicht erlaubt
error_not_fully_uppercased: Muss in Großbuchstaben sein
error_in_use: Bereits als aktive Kennung für ein anderes Projekt verwendet
error_reserved: Reserviert durch eine frühere Kennung eines anderen Projekts
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Benötigt manuelle Überprüfung
remaining_projects:
one: "... 1 weiteres Projekt"
@@ -460,8 +461,12 @@ de:
ignore: Änderungen ignorieren
save: Änderungen speichern und fortfahren
role_selector:
title: Select roles
label: 'Rolle: %{role}'
no_role: Rolle auswählen
roles:
one: "%{count} role selected"
other: "%{count} roles selected"
blankslate:
title: Keine Statusübergänge konfiguriert
description: Status hinzufügen, um mit der Konfiguration von Arbeitsabläufen für diese Rolle zu beginnen
@@ -1109,6 +1114,8 @@ de:
no_results_title_text: Es gibt aktuell keine Neuigkeiten.
no_results_content_text: Neuigkeit hinzufügen
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Alle %{module} Berechtigungen zuweisen
section_uncheck_all_label: Alle %{module} Berechtigungen zuweisen
@@ -1342,10 +1349,10 @@ de:
tab: Titel konfigurieren
manually_editable_subjects:
label: Manuell bearbeitbare Titel
caption: Nutzer:innen können die Titel der Arbeitspakete ohne Einschränkungen manuell eingeben und bearbeiten.
caption: Benutzer können die Titel der Arbeitspakete ohne Einschränkungen manuell eingeben und bearbeiten.
automatically_generated_subjects:
label: Automatisch generierte Titel
caption: Definieren Sie ein Schema aus referenzierten Attributen und Freitext für die automatische Generierung von Arbeitspakettiteln. Nutzer:innen können diese nicht manuell editieren.
caption: Definieren Sie ein Schema aus referenzierten Attributen und Freitext für die automatische Generierung von Arbeitspakettiteln. Nutzer können diese nicht manuell editieren.
token:
label_with_context: "%{attribute_context}: %{attribute_label}"
context:
@@ -1446,7 +1453,7 @@ de:
manual_with_children: Hat Unteraufgaben aber ihre Startdaten werden ignoriert.
title:
automatic_mobile: Automatisch geplant.
automatic_with_children: Unteraufgaben bestimmen Termine.
automatic_with_children: Die Termine sind durch untergeordnete Arbeitspakete bestimmt.
automatic_with_predecessor: Der Anfangstermin wird von einem Vorgänger festgelegt.
manual_mobile: Manuell geplant.
manually_scheduled: Manuell geplant Daten unabhängig von Beziehungen.
@@ -1549,7 +1556,7 @@ de:
label_child_plural: Unteraufgaben
new_child: Neue Unteraufgabe
new_child_description: Erstellt ein zugehöriges Arbeitspaket als Unteraufgabe des aktuellen (übergeordneten) Arbeitspakets
child: Unteraufgabe
child: Kind
child_description: Macht das zugehörige Arbeitspaket zu einer Unteraufgabe des aktuellen (übergeordneten) Arbeitspakets
parent: Übergeordnetes Arbeitspaket
parent_description: Wandelt das verknüpfte in ein übergeordnetes Arbeitspaket dieses Arbeitspakets um
@@ -1809,7 +1816,7 @@ de:
column_names: Spalten
relations_to_type_column: Beziehungen zu %{type}
relations_of_type_column: 'Beziehungen der Art: %{type}'
child_work_packages: Unteraufgaben
child_work_packages: Kinder
group_by: Gruppiere Ergebnisse nach
sort_by: Ergebnisse sortieren nach
filters: Filter
@@ -1996,6 +2003,29 @@ de:
type: Typ
version: Version
watcher: Beobachter
ordered_persisted_query_entity:
persisted_query: Gespeicherte Abfrage
entity: Entität
position: Position
persisted_query:
name: Name
views: Ansichten
filters: Filter
orders: Sortierungen
selects: Ausgewählte Attribute
persisted_view:
name: Name
query: Abfrage
parent: Übergeordnete Ansicht
public: Öffentlich
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: muss akzeptiert werden.
@@ -2355,7 +2385,7 @@ de:
status_transition_invalid: ist ungültig, da kein valider Übergang vom alten zum neuen Status für die aktuelle Rolle des Nutzers existiert.
status_invalid_in_type: ist ungültig, da der aktuelle Status nicht in diesem Typ vorhanden ist.
type:
cannot_be_milestone_due_to_children: kann kein Meilenstein werden, da dieses Arbeitspaket Unteraufgaben besitzt.
cannot_be_milestone_due_to_children: kann kein Meilenstein werden, da dieses Arbeitspaket Unterelemente besitzt.
priority_id:
only_active_priorities_allowed: muss aktiv sein.
category:
@@ -3174,7 +3204,7 @@ de:
error_custom_option_not_found: Option ist nicht vorhanden.
error_enterprise_plan_needed: Sie benötigen den Enterprise-Plan %{plan}, um diese Aktion durchzuführen.
error_enterprise_activation_user_limit: Ihr Konto konnte nicht aktiviert werden (Nutzerlimit erreicht). Bitte kontaktieren Sie Ihren Administrator um Zugriff zu erhalten.
error_enterprise_token_invalid_domain: Die Enterprise-Edition ist nicht aktiv. Die aktuelle Domain (%{actual}) entspricht nicht dem erwarteten Hostnamen (%{expected}).
error_enterprise_token_invalid_domain: Die Enterprise edition ist nicht aktiv. Die aktuelle Domain (%{actual}) entspricht nicht dem erwarteten Hostnamen (%{expected}).
error_failed_to_delete_entry: Fehler beim Löschen dieses Eintrags.
error_in_dependent: 'Fehler beim Versuch, abhängiges Objekt zu ändern: %{dependent_class} #%{related_id} - %{related_subject}: %{error}'
error_in_new_dependent: 'Fehler beim Versuch, abhängiges Objekt zu erstellen: %{dependent_class} - %{related_subject}: %{error}'
@@ -3461,7 +3491,7 @@ de:
dates:
working: "%{date} ist jetzt ein Arbeitstag"
non_working: "%{date} ist jetzt ein arbeitsfreier Tag"
progress_mode_changed_to_status_based: Fortschrittberechnung wurde auf Status-bezogen gesetzt
progress_mode_changed_to_status_based: Fortschrittberechnung wurde auf Status-basiert gesetzt
status_excluded_from_totals_set_to_false_message: jetzt in den Gesamtwerten der Hierarchie enthalten
status_excluded_from_totals_set_to_true_message: jetzt von den Hierarchie-Gesamtwerten ausgeschlossen
status_percent_complete_changed: "% abgeschlossen von %{old_value}% auf %{new_value} % geändert"
@@ -3864,7 +3894,7 @@ de:
label_enumerations: Aufzählungen
label_enterprise: Enterprise
label_enterprise_active_users: "%{current}/%{limit} gebuchte aktive Nutzer"
label_enterprise_edition: Enterprise Edition
label_enterprise_edition: Enterprise edition
label_enterprise_support: Enterprise Support
label_environment: Umgebung
label_estimates_and_progress: Schätzungen und Fortschritt
@@ -4213,6 +4243,7 @@ de:
label_role_new: Neue Rolle
label_role_grantable: Zuweisbare Rolle
label_role_plural: Rollen
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Rolle für neue Mitglieder zuweisen
label_scm: Versionskontrollsystem
label_scroll_left: Nach links scrollen
@@ -4982,7 +5013,7 @@ de:
Erhöhen Sie diesen Wert zur Verbesserung der Performance, da die Erfassung des genutzten Festplattenspeichers Ressourcen-intensiv ist.
oauth_application_details_html: 'Der Client Geheimcode wird nach dem Schließen dieses Fensters nicht mehr zugänglich sein. Bitte kopieren Sie diese Werte in die Nextcloud OpenProject Integrationseinstellungen:'
oauth_application_details_link_text: Zu den Einstellungen gehen
setup_documentation_details: 'Wenn Sie Hilfe bei der Konfiguration eines neuen Dateispeichers benötigen, konsultieren Sie bitte die Dokumentation: '
setup_documentation_details: 'Wenn Sie Hilfe bei der Konfiguration eines neuen Datei-Speichers benötigen, konsultieren Sie bitte die Dokumentation: '
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:
@@ -5153,6 +5184,9 @@ de:
setting_mail_handler_body_delimiter_regex: Schneide E-Mails nach Zeile ab, die diesem regulären Ausdruck entspricht
setting_mail_handler_ignore_filenames: Ignorierte E-Mail-Anhänge
setting_new_project_user_role_id: Rolle, die einem Nicht-Administrator zugeordnet wird, der ein Projekt erstellt
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Benachrichtigung an den Autor senden, wenn ein neues Projekt erstellt wird
setting_new_project_notification_text: Benachrichtigungstext
setting_password_active_rules: Password requirements
@@ -5692,7 +5726,7 @@ de:
warning_user_limit_reached_admin_html: 'Das Hinzufügen zusätzlicher Benutzer überschreitet das aktuelle Benutzerlimit. Bitte [aktualisieren Sie Ihr Abonnement](upgrade_url) um sicherzustellen, dass externe Benutzer auf diese Instanz zugreifen können.
'
warning_user_limit_reached_instructions: 'Du hast dein Nutzerlimit erreicht (%{current}/%{max} active users). Bitte kontaktiere sales@openproject.com um deinen Enterprise Edition Plan upzugraden und weitere Nutzer hinzuzufügen.
warning_user_limit_reached_instructions: 'Du hast dein Nutzerlimit erreicht (%{current}/%{max} active users). Bitte kontaktiere sales@openproject.com um deinen Enterprise edition Plan upzugraden und weitere Nutzer hinzuzufügen.
'
warning_protocol_mismatch_html: ''
+35 -1
View File
@@ -419,7 +419,8 @@ el:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
one: "... 1 more project"
@@ -460,8 +461,12 @@ el:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
one: "%{count} role selected"
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1109,6 +1114,8 @@ el:
no_results_title_text: Δεν υπάρχουν προς το παρόν νέα για αναφορά.
no_results_content_text: Προσθέστε ένα στοιχείο νέων
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -1999,6 +2006,29 @@ el:
type: Τύπος
version: Έκδοση
watcher: Παρατηρητής
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: πρέπει να γίνει αποδεκτό.
@@ -4218,6 +4248,7 @@ el:
label_role_new: Νέος ρόλος
label_role_grantable: Grantable role
label_role_plural: Ρόλοι
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Ανάθεση ρόλων σε νέα μέλη
label_scm: SCM
label_scroll_left: Scroll left
@@ -5152,6 +5183,9 @@ el:
setting_mail_handler_body_delimiter_regex: Περικοπή των email που ταιριάζουμε με αυτό το regex
setting_mail_handler_ignore_filenames: Συνημμένα mail που αγνοήθηκαν
setting_new_project_user_role_id: Ο ρόλος δόθηκε σε μη-διαχειριστή χρήστη ο οποίος δημιουργεί ένα έργο
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+35 -1
View File
@@ -419,7 +419,8 @@ eo:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
one: "... 1 more project"
@@ -460,8 +461,12 @@ eo:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
one: "%{count} role selected"
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1110,6 +1115,8 @@ eo:
no_results_title_text: Nun estas neniu novaĵo por informi.
no_results_content_text: Aldoni novan eron
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -2000,6 +2007,29 @@ eo:
type: Tipo
version: Versio
watcher: Atentanto
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: devas esti akceptita.
@@ -4219,6 +4249,7 @@ eo:
label_role_new: New role
label_role_grantable: Grantable role
label_role_plural: Roloj
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Assign role to new members
label_scm: SCM
label_scroll_left: Scroll left
@@ -5157,6 +5188,9 @@ eo:
setting_mail_handler_body_delimiter_regex: Truncate emails matching this regex
setting_mail_handler_ignore_filenames: Ignored mail attachments
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+36 -2
View File
@@ -419,7 +419,8 @@ es:
error_special_characters: No se permiten caracteres especiales
error_not_fully_uppercased: Debe estar en mayúsculas
error_in_use: Ya está en uso como identificador activo de otro proyecto
error_reserved: Reservado por el historial de identificadores de otro proyecto
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Necesita revisión manual
remaining_projects:
one: "... 1 proyecto más"
@@ -460,8 +461,12 @@ es:
ignore: Descartar cambios
save: Guardar cambios y continuar
role_selector:
title: Select roles
label: 'Rol: %{role}'
no_role: Seleccionar rol
roles:
one: "%{count} role selected"
other: "%{count} roles selected"
blankslate:
title: No hay transiciones de estado configuradas
description: Añade estados para empezar a configurar los flujos de trabajo de este rol
@@ -1107,6 +1112,8 @@ es:
no_results_title_text: No hay noticias sobre las que informar por el momento.
no_results_content_text: Añadir un elemento de noticias
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Asignar todos los permisos de %{module}
section_uncheck_all_label: Quitar todos los permisos de %{module}
@@ -1448,7 +1455,7 @@ es:
automatic_with_children: Fechas determinadas por paquetes de trabajo secundarios.
automatic_with_predecessor: La fecha de inicio la fija un predecesor.
manual_mobile: Programado manualmente.
manually_scheduled: Programado manualmente. No afectadas por relaciones.
manually_scheduled: Programado manualmente. Fechas no afectadas por relaciones.
blankslate:
title: Sin predecesores
description: Para activar la programación automática, este paquete de trabajo debe tener al menos un predecesor. Entonces se programará automáticamente para que comience después del predecesor más cercano.
@@ -1995,6 +2002,29 @@ es:
type: Tipo
version: Versión
watcher: Observador
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: debe ser aceptado.
@@ -4210,6 +4240,7 @@ es:
label_role_new: Nuevo rol
label_role_grantable: Rol otorgable
label_role_plural: Perfiles
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Asignar rol a nuevos miembros
label_scm: SCM
label_scroll_left: Desplazar hacia la izquierda
@@ -5142,6 +5173,9 @@ es:
setting_mail_handler_body_delimiter_regex: Truncar correos que coincidan con esta expresión regular
setting_mail_handler_ignore_filenames: Archivos adjuntos de email ignorados
setting_new_project_user_role_id: Papel ortorgado a usuario no administrador que crea un proyecto
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Enviar notificación al autor al crear un nuevo proyecto
setting_new_project_notification_text: Texto de la notificación
setting_password_active_rules: Password requirements
+35 -1
View File
@@ -419,7 +419,8 @@ et:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
one: "... 1 more project"
@@ -460,8 +461,12 @@ et:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
one: "%{count} role selected"
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1110,6 +1115,8 @@ et:
no_results_title_text: There is currently no news to report.
no_results_content_text: Add a news item
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -2000,6 +2007,29 @@ et:
type: Tüüp
version: Versioon
watcher: Jälgija
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: must be accepted.
@@ -4219,6 +4249,7 @@ et:
label_role_new: Uus roll
label_role_grantable: Grantable role
label_role_plural: Rollid
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Assign role to new members
label_scm: Lähtekoodi haldusvahendid
label_scroll_left: Scroll left
@@ -5155,6 +5186,9 @@ et:
setting_mail_handler_body_delimiter_regex: Truncate emails matching this regex
setting_mail_handler_ignore_filenames: Ignored mail attachments
setting_new_project_user_role_id: Projekti looja vaikimisi roll oma loodud projektis
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+35 -1
View File
@@ -419,7 +419,8 @@ eu:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
one: "... 1 more project"
@@ -460,8 +461,12 @@ eu:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
one: "%{count} role selected"
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1110,6 +1115,8 @@ eu:
no_results_title_text: There is currently no news to report.
no_results_content_text: Add a news item
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -2000,6 +2007,29 @@ eu:
type: Type
version: Bertsioa
watcher: Watcher
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: must be accepted.
@@ -4219,6 +4249,7 @@ eu:
label_role_new: New role
label_role_grantable: Grantable role
label_role_plural: Roles
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Assign role to new members
label_scm: SCM
label_scroll_left: Scroll left
@@ -5157,6 +5188,9 @@ eu:
setting_mail_handler_body_delimiter_regex: Truncate emails matching this regex
setting_mail_handler_ignore_filenames: Ignored mail attachments
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+35 -1
View File
@@ -419,7 +419,8 @@ fa:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
one: "... 1 more project"
@@ -460,8 +461,12 @@ fa:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
one: "%{count} role selected"
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1110,6 +1115,8 @@ fa:
no_results_title_text: There is currently no news to report.
no_results_content_text: Add a news item
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -2000,6 +2007,29 @@ fa:
type: نوع
version: نسخه
watcher: ناظر
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: must be accepted.
@@ -4219,6 +4249,7 @@ fa:
label_role_new: New role
label_role_grantable: Grantable role
label_role_plural: نقش‌ها
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Assign role to new members
label_scm: SCM
label_scroll_left: Scroll left
@@ -5157,6 +5188,9 @@ fa:
setting_mail_handler_body_delimiter_regex: Truncate emails matching this regex
setting_mail_handler_ignore_filenames: Ignored mail attachments
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+35 -1
View File
@@ -419,7 +419,8 @@ fi:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
one: "... 1 more project"
@@ -460,8 +461,12 @@ fi:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
one: "%{count} role selected"
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1110,6 +1115,8 @@ fi:
no_results_title_text: Tällä hetkellä ei ole uutisia.
no_results_content_text: Lisää uutinen
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -2000,6 +2007,29 @@ fi:
type: Tyyppi
version: Versio
watcher: Seuraajat
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: täytyy olla hyväksytty.
@@ -4217,6 +4247,7 @@ fi:
label_role_new: Uusi rooli
label_role_grantable: Grantable role
label_role_plural: Roolit
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Määritä rooli uusille jäsenille
label_scm: SCM
label_scroll_left: Scroll left
@@ -5155,6 +5186,9 @@ fi:
setting_mail_handler_body_delimiter_regex: Truncate emails matching this regex
setting_mail_handler_ignore_filenames: Ignored mail attachments
setting_new_project_user_role_id: Rooli joka annetaan projektin luojalle, joka ei ole hallinnoija (admin)
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+35 -1
View File
@@ -419,7 +419,8 @@ fil:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
one: "... 1 more project"
@@ -460,8 +461,12 @@ fil:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
one: "%{count} role selected"
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1110,6 +1115,8 @@ fil:
no_results_title_text: Sa kasalukuyan ay walang mga balita para ma-ireport.
no_results_content_text: Magdagdag ng bagong news item
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -2000,6 +2007,29 @@ fil:
type: Uri
version: Bersyon
watcher: Tagapagmasid
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: kailangang tanggapin.
@@ -4219,6 +4249,7 @@ fil:
label_role_new: Bagong tungkulin
label_role_grantable: Grantable role
label_role_plural: Ang mga tungkulin
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Magtalaga ng tungkulin ss mga bagong miyembro
label_scm: SCM
label_scroll_left: Scroll left
@@ -5153,6 +5184,9 @@ fil:
setting_mail_handler_body_delimiter_regex: Ang nga truncate email ay nagkakatugma sa regex na ito
setting_mail_handler_ignore_filenames: Ignored mail attachments
setting_new_project_user_role_id: Ibinigay na tungkulin para sa non-admin na gumagamit isa sa mga lumilikha ng proyekto
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+35 -1
View File
@@ -419,7 +419,8 @@ fr:
error_special_characters: Caractères spéciaux non autorisés
error_not_fully_uppercased: Doit être en majuscules
error_in_use: Déjà utilisé comme alias actif d'un autre projet
error_reserved: Réservé par l'historique des alias d'un autre projet
error_used_in_past: Réservé par l'historique des alias d'un autre projet
error_reserved_by_system: Réservé comme mot-clé du système
error_unknown: Nécessite une vérification manuelle
remaining_projects:
one: "... 1 projet supplémentaire"
@@ -460,8 +461,12 @@ fr:
ignore: Ignorer les changements
save: Enregistrer les modifications et continuer
role_selector:
title: Sélectionner les rôles
label: 'Rôle : %{role}'
no_role: Sélectionner un rôle
roles:
one: "%{count} rôle sélectionné"
other: "%{count} rôles sélectionnés"
blankslate:
title: Aucune transition de statut configurée
description: Ajouter des statuts pour commencer à configurer des workflows pour ce rôle
@@ -1110,6 +1115,8 @@ fr:
no_results_title_text: Il n'y a actuellement aucune actualité à publier.
no_results_content_text: Ajouter une actualité
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Attribuer toutes les autorisations %{module}
section_uncheck_all_label: Désattribuer toutes les autorisations %{module}
@@ -1993,6 +2000,29 @@ fr:
type: Type
version: Version
watcher: Observateur
ordered_persisted_query_entity:
persisted_query: Requête persistante
entity: Entité
position: Position
persisted_query:
name: Nom
views: Affichages
filters: Filtres
orders: Commandes
selects: Sélectionne
persisted_view:
name: Nom
query: Requête
parent: Vue parente
public: Public
user_card_view:
secondary_info: Informations secondaires
show_status_badge: Afficher le badge d'état
show_email: Afficher l'adresse électronique
tag_source: Source des étiquettes
tag_limit: Limite des étiquettes
card_size: Taille des cartes
columns_per_row: Colonne par ligne
errors:
messages:
accepted: doi(ven)t être accepté(e)(s).
@@ -4212,6 +4242,7 @@ fr:
label_role_new: Nouveau rôle
label_role_grantable: Rôle admissible
label_role_plural: Rôles
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Assigner un rôle aux nouveaux membres
label_scm: SCM
label_scroll_left: Défilement vers la gauche
@@ -5148,6 +5179,9 @@ fr:
setting_mail_handler_body_delimiter_regex: Tronquer les e-mails correspondant à cette expression régulière
setting_mail_handler_ignore_filenames: Pièces jointes du courrier ignorées
setting_new_project_user_role_id: Rôle donné à un utilisateur non administrateur qui crée un projet
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Envoyer une notification à l'auteur lors de la création d'un nouveau projet
setting_new_project_notification_text: Texte de la notification
setting_password_active_rules: Exigences relatives au mot de passe
+37 -1
View File
@@ -431,7 +431,8 @@ he:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
one: "... 1 more project"
@@ -476,8 +477,14 @@ he:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
one: "%{count} role selected"
two: "%{count} roles selected"
many: "%{count} roles selected"
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1140,6 +1147,8 @@ he:
no_results_title_text: There is currently no news to report.
no_results_content_text: להוסיף פריט חדשות
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -2040,6 +2049,29 @@ he:
type: סוג
version: גירסה
watcher: צופה
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: must be accepted.
@@ -4341,6 +4373,7 @@ he:
label_role_new: New role
label_role_grantable: Grantable role
label_role_plural: תפקידים
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Assign role to new members
label_scm: SCM
label_scroll_left: Scroll left
@@ -5289,6 +5322,9 @@ he:
setting_mail_handler_body_delimiter_regex: Truncate emails matching this regex
setting_mail_handler_ignore_filenames: Ignored mail attachments
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+35 -1
View File
@@ -419,7 +419,8 @@ hi:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
one: "... 1 more project"
@@ -460,8 +461,12 @@ hi:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
one: "%{count} role selected"
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1110,6 +1115,8 @@ hi:
no_results_title_text: There is currently no news to report.
no_results_content_text: Add a news item
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -2000,6 +2007,29 @@ hi:
type: प्रकार
version: संस्करण
watcher: वॉचर
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: must be accepted.
@@ -4219,6 +4249,7 @@ hi:
label_role_new: New role
label_role_grantable: Grantable role
label_role_plural: भूमिकाएं
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Assign role to new members
label_scm: SCM
label_scroll_left: Scroll left
@@ -5157,6 +5188,9 @@ hi:
setting_mail_handler_body_delimiter_regex: Truncate emails matching this regex
setting_mail_handler_ignore_filenames: Ignored mail attachments
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+36 -1
View File
@@ -425,7 +425,8 @@ hr:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
one: "... 1 more project"
@@ -468,8 +469,13 @@ hr:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
one: "%{count} role selected"
few: "%{count} roles selected"
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1125,6 +1131,8 @@ hr:
no_results_title_text: Nema novih vijesti.
no_results_content_text: Nova vijest
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -2020,6 +2028,29 @@ hr:
type: Tip
version: Verzija
watcher: Nadglednik
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: mora biti prihvaćeno.
@@ -4278,6 +4309,7 @@ hr:
label_role_new: Nova rola
label_role_grantable: Grantable role
label_role_plural: Role
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Dodijeli uloge novim korisnicima
label_scm: SCM
label_scroll_left: Scroll left
@@ -5219,6 +5251,9 @@ hr:
setting_mail_handler_body_delimiter_regex: Truncate emails matching this regex
setting_mail_handler_ignore_filenames: Ignored mail attachments
setting_new_project_user_role_id: Role given to a non-admin user who creates a project
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+35 -1
View File
@@ -419,7 +419,8 @@ hu:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
one: "... 1 more project"
@@ -460,8 +461,12 @@ hu:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
one: "%{count} role selected"
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1116,6 +1121,8 @@ hu:
no_results_title_text: Nincs megjeleníthető hír.
no_results_content_text: Hír hozzáadása
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -2024,6 +2031,29 @@ hu:
type: Típus
version: Verzió
watcher: Megfigyelő
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: el kell fogadni.
@@ -4283,6 +4313,7 @@ hu:
label_role_new: Új szerepkör
label_role_grantable: Grantable role
label_role_plural: Szerepkörök
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Szerep hozzárendelése az új tagokhoz
label_scm: SCM
label_scroll_left: Scroll left
@@ -5245,6 +5276,9 @@ hu:
setting_mail_handler_body_delimiter_regex: E-mailek csonkítása a megegyező kifejezéssel
setting_mail_handler_ignore_filenames: Összes melléklet figyelmen kívül hagyva
setting_new_project_user_role_id: Szerepkör a nem admin felhasználónak, aki létrehoz egy projektet,
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+34 -1
View File
@@ -413,7 +413,8 @@ id:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
other: "... %{count} more projects"
@@ -452,8 +453,11 @@ id:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1094,6 +1098,8 @@ id:
no_results_title_text: There is currently no news to report.
no_results_content_text: Add a news item
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -1984,6 +1990,29 @@ id:
type: Tipe
version: Versi
watcher: Pemantau
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: harus disetujui.
@@ -4169,6 +4198,7 @@ id:
label_role_new: Role baru
label_role_grantable: Grantable role
label_role_plural: Roles
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Menetapkan role kepada anggota baru
label_scm: SCM
label_scroll_left: Scroll left
@@ -5092,6 +5122,9 @@ id:
setting_mail_handler_body_delimiter_regex: Truncate emails matching this regex
setting_mail_handler_ignore_filenames: Ignored mail attachments
setting_new_project_user_role_id: Role yang diberikan kepada user non-admin yang membuat Project
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+35 -1
View File
@@ -419,7 +419,8 @@ it:
error_special_characters: I caratteri speciali non sono consentiti
error_not_fully_uppercased: Deve essere maiuscolo
error_in_use: Già in uso come identificatore attivo di un altro progetto
error_reserved: Riservato dalla cronologia degli identificatori di un altro progetto
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Necessita di controllo manuale
remaining_projects:
one: "... 1 altro progetto"
@@ -460,8 +461,12 @@ it:
ignore: Ignora le modifiche
save: Salva le modifiche e continua
role_selector:
title: Select roles
label: 'Ruolo: %{role}'
no_role: Seleziona il ruolo
roles:
one: "%{count} role selected"
other: "%{count} roles selected"
blankslate:
title: Nessuna transizione di stato configurata
description: Aggiungi stati per iniziare a configurare i flussi di lavoro per questo ruolo
@@ -1109,6 +1114,8 @@ it:
no_results_title_text: Al momento non c'è nessuna notizia da segnalare.
no_results_content_text: Aggiungi una notizia
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assegna tutti i permessi di %{module}
section_uncheck_all_label: Annulla l'assegnazione di tutti i permessi di %{module}
@@ -1998,6 +2005,29 @@ it:
type: Tipo
version: Versione
watcher: Osservatore
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: deve essere accettato.
@@ -4219,6 +4249,7 @@ it:
label_role_new: Nuovo ruolo
label_role_grantable: Ruolo ammissibile
label_role_plural: Ruoli
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: Assegna ruolo ai nuovi membri
label_scm: SCM
label_scroll_left: Scorri a sinistra
@@ -5155,6 +5186,9 @@ it:
setting_mail_handler_body_delimiter_regex: Troncare le email che corrispondono a questa espressione regolare
setting_mail_handler_ignore_filenames: Allegati email ignorati
setting_new_project_user_role_id: Ruolo assegnato ad un utente non amministratore che crea un progetto
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Invia una notifica all'autore quando crea un nuovo progetto
setting_new_project_notification_text: Testo della notifica
setting_password_active_rules: Password requirements
+85 -51
View File
@@ -339,13 +339,13 @@ ja:
success: MCP configuration was updated successfully.
scim_clients:
authentication_methods:
sso: IDプロバイダからのJWT
oauth2_client: OAuth 2.0クライアント認証情報
sso: アイデンティティプロバイダからのJWT
oauth2_client: OAuth 2.0 クライアント資格情報
oauth2_token: 静的アクセストークン
created_client_credentials_dialog_component:
title: クライアント認証情報作成
heading: クライアント認証情報が生成されました
one_time_hint: クライアントシークレットが表示されるのはこの時だけです。必ずコピーしてください。
title: クライアントの資格情報作成されました
heading: クライアントの資格情報が生成されました
one_time_hint: クライアントシークレットが表示される唯一の時間です。今すぐコピーしてください。
created_token_dialog_component:
title: トークンを作成しました
heading: トークンが生成されました
@@ -358,21 +358,21 @@ ja:
edit:
label_delete_scim_client: SCIM クライアントを削除
form:
auth_provider_description: これは、SCIM プロバイダによって追加されたユーザが OpenProject で認証するために使用するサービスです。
authentication_method_description_html: これは SCIM クライアントが OpenProject で認証する方法です。OAuth トークンに<code>scim_v2</code>スコープが含まれていることを確認してください。
description: これらの設定オプションの詳細については、[SCIMクライアントの設定に関する文書](docs_url)を参照してください。
auth_provider_description: これは、SCIMプロバイダが追加したユーザがOpenProjectでの認証に使用するサービスです。
authentication_method_description_html: これは SCIM クライアントが OpenProject で認証する方法です。OAuth トークンに <code>scim_v2</code> スコープが含まれていることを確認してください。
description: 設定オプションの詳細については、[SCIM クライアントの設定に関するドキュメント](docs_url)を参照してください。
jwt_sub_description: 例えば、Keycloakの場合、これはSCIMクライアントに関連付けられたサービスアカウントのUUIDです。あなたのユースケースにあった Subject claim を見つける方法については [ドキュメント](docs_url) を参照してください。
name_description: このクライアントが設定された理由を他の管理者が理解しやすい名前を選んでください。
name_description: 他の管理者がこのクライアントが設定された理由を理解するのに役立つ名前を選択してください。
index:
description: ここで設定された SCIM クライアントは、OpenProject SCIM サーバ API と対話し、ユーザアカウントグループのプロビジョニング、更新、デプロビジョニングを行うことができます。
label_create_button: SCIMクライアント追加
description: ここで設定されたSCIMクライアントは、OpenProjectSCIMサーバ APIと相互作用して、ユーザアカウントグループのプロビジョニング、更新、およびデプロビジョニングを行うことができます。
label_create_button: SCIMクライアント追加
new:
title: 新しいSCIMクライアント
revoke_static_token_dialog_component:
confirm_button: 取り消す
title: 静的トークンの失効
heading: このトークンを本当に取り消しすか?
description: このトークンを使っている SCIM クライアントは、OpenProject の SCIM サーバ API にアクセスできなくなります。
title: 静的トークンを取り消す
heading: このトークンを取り消してもよろしいですか?
description: このトークンを使用する SCIM クライアントは、OpenProject の SCIM サーバ API にアクセスできなくなります。
table_component:
blank_slate:
title: SCIMクライアントがまだ設定されていません
@@ -413,7 +413,8 @@ ja:
error_special_characters: Special characters not allowed
error_not_fully_uppercased: Must be uppercase
error_in_use: Already in use as another project's active handle
error_reserved: Reserved by another project's handle history
error_used_in_past: Reserved by another project's handle history
error_reserved_by_system: Reserved as a system keyword
error_unknown: Needs manual review
remaining_projects:
other: "... %{count} more projects"
@@ -452,8 +453,11 @@ ja:
ignore: Ignore changes
save: Save changes and continue
role_selector:
title: Select roles
label: 'Role: %{role}'
no_role: Select role
roles:
other: "%{count} roles selected"
blankslate:
title: No status transitions configured
description: Add statuses to start configuring workflows for this role
@@ -1043,26 +1047,26 @@ ja:
other: また、 %{shared_work_packages_link} はこのユーザーと共有されています。
remove_project_membership_or_work_package_shares_too: 直接のメンバーとしてのユーザーだけを削除したい(および共有を維持したい)、またはワークパッケージの共有も削除しますか?
will_remove_all_user_access_priveleges: このメンバーを削除すると、プロジェクトへのユーザーのすべてのアクセス権が削除されます。ユーザーはまだサイトの一部として存在します。
will_remove_all_group_access_priveleges: このメンバを削除すると、プロジェクトに対するグループのすべてのアクセス権が削除されます。グループはサイトの一部としてまだ存在します。
cannot_delete_inherited_membership: このプロジェクトのメンバーであるグループに属しているため、このメンバーを削除することはできません。
cannot_delete_inherited_membership_note_admin_html: "%{administration_settings_link}で、プロジェクトのメンバーとしてグループを削除することも、特定のメンバーをグループから削除することできます。"
cannot_delete_inherited_membership_note_non_admin: プロジェクトのメンバーとしてグループを削除するか、管理者に連絡してこの特定のメンバーをグループから削除することができます。
will_remove_all_group_access_priveleges: このメンバを削除すると、グループのすべてのアクセス権がプロジェクトに削除されます。グループはサイトの一部として存在します。
cannot_delete_inherited_membership: このメンバーはこのプロジェクトのメンバーであるグループに属しているため、削除できません。
cannot_delete_inherited_membership_note_admin_html: プロジェクトのメンバーとしてグループを削除するか、 %{administration_settings_link} のグループからこの特定のメンバーを削除することできます。
cannot_delete_inherited_membership_note_non_admin: プロジェクトのメンバーとしてグループを削除するか、管理者に問い合わせてグループから特定のメンバーを削除することができます。
delete_work_package_shares_dialog:
title: ワークパッケージ・シェアの破棄
title: ワークパッケージの共有の取り消し
shared_with_this_user_html:
other: "%{all_shared_work_packages_link} はこのユーザーと共有されています。"
shared_with_this_group_html:
other: "%{all_shared_work_packages_link} はこのグループと共有されています。"
shared_with_permission_html:
other: "%{shared_work_packages_link} のみが %{shared_role_name} 権限と共有されています。"
revoke_all_or_with_role: すべての共有ワークパッケージ、または %{shared_role_name} 権限を持つワークパッケージのみへのアクセス権を剥奪しますか?
will_not_affect_inherited_shares: "(これは、そのグループと共有ているワークパッケージには影響しません。"
cannot_remove_inherited: グループで共有されワークパッケージの共有は削除できません。
cannot_remove_inherited_with_role: ロール %{shared_role_name} 共有されるワークパッケージは、グループを介して共有され、削除することはできません。
cannot_remove_inherited_note_admin_html: "%{administration_settings_link}、グループへの共有を取り消すか、グループからこの特定のメンバーを削除することができます。"
cannot_remove_inherited_note_non_admin: グループへの共有を取り消すか、管理者に連絡して特定のメンバーをグループから削除することができます。
will_revoke_directly_granted_access: このアクションは、グループと共有されているワークパッケージ以外の、すべてのワークパッケージへのアクセス権を剥奪する
will_revoke_access_to_all: このアクションは、すべてのアクセス権を剥奪する
revoke_all_or_with_role: 共有されたワークパッケージ、または %{shared_role_name} 権限を持つワークパッケージのみへのアクセスを取り消しますか?
will_not_affect_inherited_shares: "(これはグループと共有されているワークパッケージには影響しません)。"
cannot_remove_inherited: グループで共有されワークパッケージは削除できません。
cannot_remove_inherited_with_role: ワークパッケージとロール %{shared_role_name} 共有されているため、削除できません。
cannot_remove_inherited_note_admin_html: あなたは、グループへの共有を取り消すか、 %{administration_settings_link}グループからこの特定のメンバーを削除することができます。
cannot_remove_inherited_note_non_admin: 共有をグループ取り消すか、管理者に問い合わせてグループから特定のメンバーを削除することができます。
will_revoke_directly_granted_access: このアクションは、すべてのユーザーへのアクセスを取り消しますが、グループと共有されているワークパッケージです
will_revoke_access_to_all: このアクションは、すべてのユーザーへのアクセスを取り消します
my:
access_token:
dialog:
@@ -1086,7 +1090,7 @@ ja:
no_results_title_text: 現在、有効なアクセス トークンはありません。
notice_api_token_revoked: APIトークンが削除されました。新しいトークンを作成するには、APIセクションの作成ボタンを使用してください。
notice_rss_token_revoked: RSSトークンが削除されました。新しいトークンを作成するには、RSSセクションのリンクを使用してください。
notice_ical_token_revoked: プロジェクト "%{project_name}" のカレンダー "%{calendar_name}" の iCalendar トークン "%{token_name}" が失効しました。このトークンを持つiCalendar URLは無効になりました
notice_ical_token_revoked: プロジェクト "%{token_name}" のカレンダー "%{calendar_name}" の iCalendar トークン "%{project_name}" が取り消されました。 このトークンiCalendar URLは無効です
password_confirmation_dialog:
confirmation_required: You need to enter your account password to confirm this change.
title: Confirm your password to continue
@@ -1095,6 +1099,8 @@ ja:
no_results_title_text: 現在、報告するニュースはありません。
no_results_content_text: ニュース項目を追加
roles:
edit:
default_for_new_projects_warning: 'This role is configured as the default role given to non-admin users who create a project. Do not remove the following permissions, otherwise project creators will be unable to complete the setup of their newly created projects:'
permissions:
section_check_all_label: Assign all %{module} permissions
section_uncheck_all_label: Unassign all %{module} permissions
@@ -1109,7 +1115,7 @@ ja:
force_password_change_hint: The user must set a new password on their next login. Automatically enabled when sending credentials via email.
send_information_hint: Emails the password in plain text. When checked, the user will be required to change their password on first login.
autologins:
prompt: ログインしたまま %{num_days}
prompt: "%{num_days} のログインを維持"
sessions:
session_name: "%{browser_name} %{browser_version} の %{os_name}"
browser: ブラウザ
@@ -1123,17 +1129,17 @@ ja:
current: Current (this device)
title: セッション管理
instructions: You are logged in to your account through the following devices. Revoke sessions that you do not recognise or from devices you do not control.
may_not_delete_current: 現在のセッション削除することはできません。
may_not_delete_current: 現在のセッション削除できません。
deletion_warning: Are you sure you want to revoke this session? You will be logged out on this device.
groups:
member_in_these_groups: このユーザーは現在以下のグループのメンバーです:
no_results_title_text: このユーザーは現在どのグループのメンバーでもありません。
summary_with_more_html: Member of %{names} and %{count_link}.
more: "%{count} もっと見る"
more: "%{count} 以上"
summary_html: Member of %{names}.
memberships:
no_results_title_text: このユーザは現在プロジェクトのメンバーではありません。
open_profile: プロフィール
open_profile: プロファイルを開く
invite_user_modal:
invite: 招待
title:
@@ -1250,7 +1256,7 @@ ja:
right_to_manage_members_missing: 'プレースホルダーユーザを削除する権限がありません。 プレースホルダー ユーザーがメンバーであるすべてのプロジェクトのメンバーを管理する権利はありません。
'
delete_tooltip: プレースホルダーユーザー削除
delete_tooltip: プレースホルダー ユーザー削除
deletion_info:
heading_html: Delete placeholder user %{name}
data_consequences: 'プレースホルダー ユーザのすべての発生(担当者、担当者、その他のユーザ値など)は、「削除されたユーザー」というアカウントに再割り当てられます。 削除されたすべてのアカウントのデータがこのアカウントに再割り当てられるため、ユーザーが作成したデータと別の削除されたアカウントのデータを区別することはできません。
@@ -1269,11 +1275,11 @@ ja:
reactions:
action_title: リアクト
add_reaction: リアクションを追加
react_with: "%{reaction} と リアクト"
and_user: および %{user}
react_with: "%{reaction} で反応する"
and_user: %{user}
and_others:
other: と %{count} その他
reaction_by: "%{reaction} によって"
reaction_by: "%{reaction} によ"
reportings:
index:
no_results_title_text: 現在、ステータス報告はありません。
@@ -1283,19 +1289,20 @@ ja:
status_color_text: |
このステータスの色を割り当てたり変更する場合にクリックします。
ステータスボタンに表示され、テーブル内のワークパッケージを強調表示するために使用できます。
status_default_text: 新しいワークパッケージはデフォルトでこのタイプに設定され。読み取り専用にはできない
status_default_text: 新しいワークパッケージはデフォルトでこのタイプに設定されています。読み取り専用にすることはできません
status_excluded_from_totals_text: |-
このステータスを持つワークパッケージを、階層内の「作業」、「
残作業」、「完了率」の合計から除外するには、このオプションをオンにします。
このオプションをオンにすると、このステータスワークパッケージを合計作業量
残作業量、および階層構造で完了させることができます。
status_percent_complete_text_html: |-
In [status-based progress calculation mode](setting_url), the % Complete of a work
package is automatically set to this value when this status is selected.
Ignored in work-based mode.
status_readonly_html: |
このステータスを持つワークパッケージを読み取り専用としてマークするには、このオプションをチェックする
ステータス以外の属性は変更できません。
ワークパッケージを読み取り専用としてマークするには、このオプションをオンにしてください
ステータスを除いて変更することはできません。
<br>
<strong>注意</strong>: 継承された値 (子やリレーションなど) 適用されます。
<strong>メモ</strong>: 継承された値 (例えば、子や関連) 適用されます。
index:
no_results_title_text: 現在、ワークパッケージのステータスはありません。
no_results_content_text: 新しいステータスを追加
@@ -1305,7 +1312,7 @@ ja:
is_readonly: 読み取り専用
excluded_from_totals: 合計から除外
themes:
dark: 暗い
dark: ダーク
light: ライト
sync_with_os: 自動(OSのテーマ設定に追従)
types:
@@ -1468,15 +1475,15 @@ ja:
could_not_be_saved: '次のワークパッケージを保存できませんでした:'
none_could_be_saved: "%{total} ワークパッケージのどれも更新できませんでした。"
x_out_of_y_could_be_saved: "%{failing} の %{total} ワークパッケージのうち、 %{success} を更新できませんでした。"
selected_because_descendants: "%{selected} ワークパッケージが選択されたが、合計 %{total} ワークパッケージが影響を受け、その中には子孫も含まれる。"
descendant: 選択された子孫
selected_because_descendants: "%{selected} ワークパッケージが選択されている間、合計 %{total} ワークパッケージが子孫を含む影響を受けます。"
descendant: 選択された子孫です
move:
no_common_statuses_exists: 選択されたすべてのワークパッケージに利用できるステータスはありません。 それらの状態は変更できません。
unsupported_for_multiple_projects: 複数のプロジェクトからのワークパッケージの一括移動 / コピーはサポートされていません
current_type_not_available_in_target_project: 'ワークパッケージの現在のタイプがターゲットプロジェクトで有効になっていません。変更しない場合は、ターゲットプロジェクトタイプを有効にしてください。そうでない場合は、リストからターゲットプロジェクトで使用可能なタイプを選択してください
current_type_not_available_in_target_project: 'ターゲット プロジェクトで現在のワークパッケージのタイプが有効になっていません。 変更を行わないようにしたい場合は、対象プロジェクトタイプを有効にしてください。 それ以外の場合は、リストからターゲット プロジェクトで使用可能なタイプを選択します
'
bulk_current_type_not_available_in_target_project: 'ワークパッケージの現在のタイプがターゲットプロジェクトで有効になっていません。変更しない場合は、ターゲットプロジェクトタイプを有効にしてください。そうでない場合は、リストからターゲットプロジェクトで使用可能なタイプを選択してください
bulk_current_type_not_available_in_target_project: '現在のタイプのワークパッケージターゲット プロジェクトで有効になっていません。 変更を行わないようにしたい場合は、対象プロジェクトタイプを有効にしてください。 それ以外の場合は、リストからターゲット プロジェクトで使用可能なタイプを選択します
'
sharing:
@@ -1502,9 +1509,9 @@ ja:
no_results_title_text: 現在、有効なバージョンはありません。
work_package_relations_tab:
index:
action_bar_title: 他のワークパッケージとのリレーションを追加して、それらの間にリンクを作成す
no_results_title_text: 現在利用可能な関係はない
blankslate_heading: 関係なし
action_bar_title: 他のワークパッケージリレーションを追加して、その間にリンクを作成します。
no_results_title_text: 現在利用可能なリレーションはありません
blankslate_heading: リレーションなし
blankslate_description: このワークパッケージにはまだリレーションがありません。
label_add_child_button: 子要素
label_add_x: "%{x} を追加"
@@ -1982,6 +1989,29 @@ ja:
type: タイプ
version: バージョン
watcher: ウォッチャー
ordered_persisted_query_entity:
persisted_query: Persisted query
entity: Entity
position: Position
persisted_query:
name: Name
views: Views
filters: Filters
orders: Orders
selects: Selects
persisted_view:
name: Name
query: Query
parent: Parent view
public: Public
user_card_view:
secondary_info: Secondary info
show_status_badge: Show status badge
show_email: Show email
tag_source: Tag source
tag_limit: Tag limit
card_size: Card size
columns_per_row: Columns per row
errors:
messages:
accepted: は受諾しなければなりません。
@@ -4160,6 +4190,7 @@ ja:
label_role_new: 新しいロール
label_role_grantable: 権限のある役割
label_role_plural: ロール
label_role_missing_permissions: "%{role} (missing required permissions)"
label_role_search: 新しいメンバーに役割を割り当てる
label_scm: バージョン管理システム
label_scroll_left: 左にスクロール
@@ -5087,6 +5118,9 @@ ja:
setting_mail_handler_body_delimiter_regex: この正規表現に一致するメールを切り捨てる
setting_mail_handler_ignore_filenames: 無視するメールの添付ファイル
setting_new_project_user_role_id: システム管理者以外のプロジェクト作成者に設定するロール
setting_new_project_user_role_id_caption: 'Only roles that include the permissions to edit project attributes and to manage members are listed, so that the creator can complete the project setup.
'
setting_new_project_send_confirmation_email: Send notification to author when creating a new project
setting_new_project_notification_text: Notification text
setting_password_active_rules: Password requirements
+1 -1
View File
@@ -109,7 +109,7 @@ ca:
button_save: Desa
button_settings: Configuració
button_uncheck_all: Desmarca-ho tot
button_update: Actualitzar
button_update: Actualitza
button_export-atom: Descarregar Atom
button_generate_pdf: Generate PDF
button_create: Crear
+3 -3
View File
@@ -143,7 +143,7 @@ de:
description_available_columns: Verfügbare Spalten
description_current_position: 'Sie sind hier: '
description_select_work_package: 'Arbeitspaket #%{id} auswählen'
description_subwork_package: 'Unteraufgabe von Arbeitspaket #%{id}'
description_subwork_package: 'Kind von Arbeitspaket #%{id}'
editor:
revisions: Lokale Änderungen anzeigen
no_revisions: Keine lokalen Änderungen gefunden
@@ -460,7 +460,7 @@ de:
label_total_progress: "%{percent}% Gesamtfortschritt"
label_total_amount: 'Gesamt: %{amount}'
label_updated_on: aktualisiert am
label_value_derived_from_children: "(aggregierter Wert von Unteraufgaben)"
label_value_derived_from_children: "(aggregierter Wert von Kindelementen)"
label_children_derived_duration: Aggregierte Dauer der Unteraufgaben
label_warning: Warnung
label_work_package: Arbeitspaket
@@ -790,7 +790,7 @@ de:
title: Neues Arbeitspaket
header: 'Neu: %{type}'
header_no_type: Neues Arbeitspaket (Typ noch nicht gesetzt)
header_with_parent: 'Neu: %{type} (Unteraufgabe von %{parent_type} #%{id})'
header_with_parent: 'Neu: %{type} (Kind von %{parent_type} #%{id})'
button: Erstellen
duplicate:
title: Arbeitspaket duplizieren
+28 -28
View File
@@ -34,12 +34,12 @@ ja:
draggable_hint: |
埋め込み画像または添付ファイルをエディタにドラッグします。
ドラッグしつづけると閉じているエディタ領域が開きます。
quarantined_hint: ウイルスが発見されたように、ファイルは隔離されています。ダウンロードできません。
quarantined_hint: ウイルスが発見されたため,ファイルは隔離されています。ダウンロードできません。
autocomplete_ng_select:
add_tag: アイテムを追加
add_tag: 項目を追加
clear_all: すべてクリア
loading: 読み込み中...
not_found: アイテムが見つかりません
not_found: 見つかりませんでした
type_to_search: 検索キーワードを入力
autocomplete_select:
placeholder:
@@ -71,7 +71,7 @@ ja:
button_back_to_list_view: リスト表示に戻る
button_cancel: キャンセル
button_close: 閉じる
button_change_project: のプロジェクトに移
button_change_project: のプロジェクトに移
button_check_all: 全てを選択
button_configure-form: フォームを設定
button_confirm: 確認
@@ -79,7 +79,7 @@ ja:
button_copy: コピー
button_copy_to_clipboard: クリップボードにコピー
button_copy_link_to_clipboard: クリップボードにリンクをコピー
button_copy_to_other_project: 別のプロジェクトで複製
button_copy_to_other_project: 別のプロジェクトで複製する
button_custom-fields: カスタムフィールド
button_delete: 削除
button_delete_watcher: ウォッチャーを削除
@@ -101,7 +101,7 @@ ja:
button_open_fullscreen: 全画面表示を開く
button_show_cards: カードビュー表示
button_show_list: リストビュー表示
button_show_table: テーブルビューを表示
button_show_table: テーブル表示
button_show_gantt: ガントビューを表示
button_show_fullscreen: 全画面表示
button_more_actions: その他の操作
@@ -111,7 +111,7 @@ ja:
button_uncheck_all: 全てを選択解除
button_update: 更新
button_export-atom: Atomをダウンロード
button_generate_pdf: PDFを生
button_generate_pdf: PDF
button_create: 作成
card:
add_new: 新規カード追加
@@ -145,8 +145,8 @@ ja:
description_select_work_package: 'ワークパッケージを選択 #%{id}'
description_subwork_package: 'ワークパッケージの子 #%{id}'
editor:
revisions: ローカルの変更を表示
no_revisions: ローカルの変更は見つかりませんでした
revisions: ローカルの修正を表示
no_revisions: ローカルでの修正は見つからず
preview: プレビューモードの切り替え
source_code: Markdown ソースモードの切り替え
error_saving_failed: '次のエラーで文書を保存するのに失敗しました: %{error}'
@@ -159,7 +159,7 @@ ja:
attribute_reference:
macro_help_tooltip: このテキストセグメントはマクロによって動的にレンダリングされています。
not_found: 要求されたリソースが見つかりませんでした
nested_macro: このマクロは %{model} %{id} を再帰的に参照しています
nested_macro: このマクロは %{model} %{id}を再帰的に参照してい
invalid_attribute: 選択した属性 '%{name}' は存在しません。
child_pages:
button: 子ページへのリンク
@@ -216,10 +216,10 @@ ja:
calendar:
empty_state_header: 休業日
empty_state_description: 休業日が定義されていません。「休業日を追加」ボタンをクリックして日付を追加してください。
new_date: "(新)"
new_date: "(新)"
add_non_working_day: 休業日を追加
already_added_error: この日付の非業日はすでに存在します。それぞれの日付に1つの非作業日が作成されます。
change_button: 保存してスケジュールを変更
already_added_error: この日付の非業日はすでに存在します。一意の日付に対して作成できる非営業日は1つだけです。
change_button: 保存してスケジュール
change_title: 営業日を変更する
removed_title: 以下の日を非稼働日リストから削除します:
change_description: 営業日とみなす曜日を変更すると、このサイト内のすべてのプロジェクトのすべてのワークパッケージの開始日と終了日に影響を与える可能性があります。
@@ -301,14 +301,14 @@ ja:
ical_sharing_modal:
title: カレンダーを購読する
inital_setup_error_message: データ取得中にエラーが発生しました。
description: URLiCalendarを使って外部クライアントでこのカレンダーを購読し、そこから最新のワークパッケージ情報をることができます。
warning: このURLを他のユーザーと共有しないでください。このリンクがあれば、誰でもアカウントやパスワードなしでワークパッケージの詳細をることができます。
token_name_label: どこで使うのですか?
description: URL(iCalendar)を使用して、外部クライアントでこのカレンダーを購読し、そこから最新のワークパッケージ情報を表示することができます。
warning: このURLを他のユーザーと共有しないでください。このリンクを持つ誰でもアカウントやパスワードなしでワークパッケージの詳細を表示することができます。
token_name_label: どこで使うのですか?
token_name_placeholder: 名前を入力してください。例:"電話"
token_name_description_text: If you subscribe to this calendar from multiple devices, this name will help you distinguish between them in your <a href="%{myAccessTokensUrl}" target="_blank">access tokens</a> list.
copy_url_label: URLをコピー
ical_generation_error_text: カレンダー URL生成にエラーが発生しました。
success_message: URL "%{name}" は正常にクリップボードにコピーされました。サブスクリプションを完了するためにカレンダークライアントに貼り付けてください。
ical_generation_error_text: カレンダーURL生成にエラーが発生しました。
success_message: URL "%{name}" クリップボードにコピーされました。カレンダークライアントに貼り付けて購読を完了してください。
label_activate: 有効にする
label_assignee: 担当者
label_assignee_alt_text: This work package is assigned to %{name}
@@ -321,7 +321,7 @@ ja:
label_add_row_before: 前に行を追加
label_add_selected_columns: 選択した列を追加
label_added_by: 追加した人
label_added_time_by: <a href="%{authorLink}">%{author}</a> %{age} に追加しました
label_added_time_by: 追加 <a href="%{authorLink}">%{author}</a> %{age}
label_ago: "○日前"
label_all: 全て
label_all_projects: すべてのプロジェクト
@@ -432,7 +432,7 @@ ja:
label_repository_plural: リポジトリ
label_resize_project_menu: Resize project menu
label_save_as: 名前をつけて保存
label_search_columns: 列を検索
label_search_columns: 列を検索する
label_select_watcher: ウォッチャーを選択...
label_selected_filter_list: 選択されたフィルタ
label_show_attributes: すべての属性を表示
@@ -470,8 +470,8 @@ ja:
label_watch_work_package: ワークパッケージをウォッチ
label_watcher_added_successfully: ウォッチャーが正常に追加されました
label_watcher_deleted_successfully: ウォッチャーが正常に削除されました
label_work_package_details_you_are_here: あなたは %{tab} %{type} %{subject} のタブにいます。
label_work_package_context_menu: ワークパッケージのコンテキスト メニュー
label_work_package_details_you_are_here: あなたは %{type} %{subject}の %{tab} タブを表示しています。
label_work_package_context_menu: ワークパッケージのコンテキストメニュー
label_unwatch: ウォッチしない
label_unwatch_work_package: ワークパッケージのウォッチを削除
label_uploaded_by: アップロードした人
@@ -502,7 +502,7 @@ ja:
label_version_plural: バージョン
label_view_has_changed: このビューには未保存の変更があります。 クリックすると保存します。
help_texts:
show_modal: ヘルプテキストを表示
show_modal: ヘルプテキストを表示する
onboarding:
buttons:
skip: スキップ
@@ -510,7 +510,7 @@ ja:
got_it: 了承
steps:
help_menu: ヘルプ(?)メニューは、<b>その他のヘルプリソースを</b>提供します。ここでは、ユーザーガイド、役立つハウツービデオなどを見つけることができます。 <br> OpenProjectでの作業をお楽しみください!
members: 新しい <b>メンバー</b>プロジェクトに招待します。
members: 新しい<b>メンバー</b>プロジェクトに招待す
quick_add_button: ヘッダーナビゲーションにあるプラス(+)アイコンをクリックして、<b>新規プロジェクトを作成</b>したり、<b>同僚を招待</b>したりできます。
sidebar_arrow: プロジェクトの<b>メインメニューに</b>戻るには、左上の矢印を使います。
welcome: 3分間のイントロダクションツアーで、最も<b>重要な</b>機能を学びましょう。 <br> 最後までステップを完了することをお勧めします。ツアーはいつでも再開できます。
@@ -587,12 +587,12 @@ ja:
title: 通知設定
pagination:
no_other_page: このページだけです。
pages_skipped: ページスキップされました
pages_skipped: ページスキップ。
page_navigation: ページネーション・ナビゲーション
per_page_navigation: ページ毎のアイテム選択
pages:
page_number: ページ %{number}
show_per_page: ページあたり %{number} を表示
show_per_page: ページごとに %{number}
placeholders:
default: "-"
subject: ここにタイトルを入力します
@@ -602,7 +602,7 @@ ja:
project:
autocompleter:
label: プロジェクト名の入力補完
click_to_switch_to_project: 'プロジェクト: %{projectname}'
click_to_switch_to_project: プロジェクト: %{projectname}
context: プロジェクトのコンテキスト
not_available: プロジェクトなし
required_outside_context: 'ワークパッケージを作成するプロジェクトを選択して、すべての属性を確認してください。 上記で有効になっているタイプのプロジェクトのみ選択できます。
@@ -1087,7 +1087,7 @@ ja:
toggle_title: ベースライン
clear: クリア
apply: 適用
header_description: 過去のいずれかの時点からこのリストに加えられた変更を強調する。
header_description: 過去の選択した時点からこのリストに加えられた変更をハイライト
show_changes_since: 以降の変更を表示する
help_description: ベースラインの基準タイムゾーン。
time_description: '現地時間: %{datetime}'
+1 -1
View File
@@ -109,7 +109,7 @@
button_save: Lagre
button_settings: Innstillinger
button_uncheck_all: Avmerk alle
button_update: Oppdater
button_update: Oppdatèr
button_export-atom: Last ned Atom
button_generate_pdf: Generate PDF
button_create: Opprett
+1 -1
View File
@@ -109,7 +109,7 @@ ro:
button_save: Salvează
button_settings: Setări
button_uncheck_all: Deselectează tot
button_update: Actualizează
button_update: Actualizare
button_export-atom: Descarcă Atom
button_generate_pdf: Generează PDF
button_create: Creează

Some files were not shown because too many files have changed in this diff Show More