From: Tom Hughes Date: Sun, 25 Feb 2024 13:40:11 +0000 (+0000) Subject: Merge remote-tracking branch 'upstream/pull/4272' X-Git-Tag: live~1591 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/71cb2c50fcaf29e2b933fc981e40a00223d94d34?hp=f9ab1e0432354b6fa6f9eb992e59b202e4ef906c Merge remote-tracking branch 'upstream/pull/4272' --- diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 2050aaf3f..9fc132014 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -19,6 +19,7 @@ jobs: uses: ruby/setup-ruby@v1 with: ruby-version: ${{ env.ruby }} + rubygems: 3.4.10 bundler-cache: true - name: Run rubocop run: bundle exec rubocop --format fuubar @@ -32,6 +33,7 @@ jobs: uses: ruby/setup-ruby@v1 with: ruby-version: ${{ env.ruby }} + rubygems: 3.4.10 bundler-cache: true - name: Run erblint run: bundle exec erblint . @@ -45,9 +47,10 @@ jobs: uses: ruby/setup-ruby@v1 with: ruby-version: ${{ env.ruby }} + rubygems: 3.4.10 bundler-cache: true - name: Cache node modules - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: node_modules key: yarn-${{ env.os }}-${{ hashFiles('yarn.lock') }} @@ -69,6 +72,7 @@ jobs: uses: ruby/setup-ruby@v1 with: ruby-version: ${{ env.ruby }} + rubygems: 3.4.10 bundler-cache: true - name: Run brakeman run: bundle exec brakeman -q @@ -84,6 +88,7 @@ jobs: uses: ruby/setup-ruby@v1 with: ruby-version: ${{ env.ruby }} + rubygems: 3.4.10 bundler-cache: true - name: Setup database run: | diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3ee6129e1..bfe456076 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -11,7 +11,7 @@ jobs: strategy: matrix: ubuntu: [20.04, 22.04] - ruby: ['3.0', '3.1'] + ruby: ['3.0', '3.1', '3.2'] runs-on: ubuntu-${{ matrix.ubuntu }} env: RAILS_ENV: test @@ -23,9 +23,10 @@ jobs: uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby }} + rubygems: 3.4.10 bundler-cache: true - name: Cache node modules - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: node_modules key: yarn-ubuntu-${{ matrix.ubuntu }}-${{ hashFiles('yarn.lock') }} diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index e3407c6dc..fdc7c35a5 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -14,6 +14,11 @@ require: - rubocop-rails - rubocop-rake +# Offense count: 11 +# Configuration parameters: Include, MaxAmount +FactoryBot/ExcessiveCreateList: + MaxAmount: 200 + # Offense count: 557 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns. @@ -61,12 +66,12 @@ Metrics/BlockNesting: # Offense count: 26 # Configuration parameters: CountComments, CountAsOne. Metrics/ClassLength: - Max: 286 + Max: 314 # Offense count: 59 # Configuration parameters: AllowedMethods, AllowedPatterns. Metrics/CyclomaticComplexity: - Max: 26 + Max: 29 # Offense count: 753 # Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns. @@ -81,7 +86,7 @@ Metrics/ParameterLists: # Offense count: 56 # Configuration parameters: AllowedMethods, AllowedPatterns. Metrics/PerceivedComplexity: - Max: 29 + Max: 30 # Offense count: 2394 # This cop supports safe autocorrection (--autocorrect). diff --git a/CONFIGURE.md b/CONFIGURE.md index 3bf0724fc..dcc8ae2ac 100644 --- a/CONFIGURE.md +++ b/CONFIGURE.md @@ -47,8 +47,6 @@ $ bundle exec rails console => #[ ... ] >> user.roles.create(:role => "moderator", :granter_id => user.id) => #[ ... ] ->> user.save! -=> true >> quit ``` @@ -63,7 +61,7 @@ For iD, do the following: * Go to "[OAuth 2 applications](http://localhost:3000/oauth2/applications)" on the My settings page. * Click on "Register new application". -* Unless you have set up alternatives, use Name: "Local iD" and Main Application URL: "http://localhost:3000" +* Unless you have set up alternatives, use Name: "Local iD" and Redirect URIs: "http://localhost:3000" * Check boxes for the following Permissions * 'Read user preferences' * 'Modify user preferences' diff --git a/Gemfile b/Gemfile index f9f12d64e..832b96c9a 100644 --- a/Gemfile +++ b/Gemfile @@ -26,8 +26,8 @@ gem "jbuilder", "~> 2.7" # Reduces boot times through caching; required in config/boot.rb gem "bootsnap", ">= 1.4.2", :require => false -# Use R2 for RTL conversion -gem "r2", "~> 0.2.7" +# Use rtlcss for RTL conversion +gem "rtlcss" # Use autoprefixer to generate CSS prefixes gem "autoprefixer-rails" @@ -41,6 +41,9 @@ gem "argon2" # Support brotli compression for assets gem "sprockets-exporters_pack" +# Restore File.exists? for oauth gem +gem "file_exists" + # Load rails plugins gem "actionpack-page_caching", ">= 1.2.0" gem "activerecord-import" @@ -133,6 +136,9 @@ gem "aws-sdk-s3" # Used to resize user images gem "image_processing" +# Used to validate widths +gem "unicode-display_width" + # Gems useful for development group :development do gem "better_errors" @@ -151,6 +157,7 @@ group :test do gem "factory_bot_rails" gem "jwt" gem "minitest", "~> 5.1" + gem "minitest-focus", :require => false gem "puma", "~> 5.6" gem "rails-controller-testing" gem "rubocop" diff --git a/Gemfile.lock b/Gemfile.lock index c313665c4..234090689 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,35 +3,35 @@ GEM specs: aasm (5.5.0) concurrent-ruby (~> 1.0) - actioncable (7.1.2) - actionpack (= 7.1.2) - activesupport (= 7.1.2) + actioncable (7.1.3.2) + actionpack (= 7.1.3.2) + activesupport (= 7.1.3.2) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (7.1.2) - actionpack (= 7.1.2) - activejob (= 7.1.2) - activerecord (= 7.1.2) - activestorage (= 7.1.2) - activesupport (= 7.1.2) + actionmailbox (7.1.3.2) + actionpack (= 7.1.3.2) + activejob (= 7.1.3.2) + activerecord (= 7.1.3.2) + activestorage (= 7.1.3.2) + activesupport (= 7.1.3.2) mail (>= 2.7.1) net-imap net-pop net-smtp - actionmailer (7.1.2) - actionpack (= 7.1.2) - actionview (= 7.1.2) - activejob (= 7.1.2) - activesupport (= 7.1.2) + actionmailer (7.1.3.2) + actionpack (= 7.1.3.2) + actionview (= 7.1.3.2) + activejob (= 7.1.3.2) + activesupport (= 7.1.3.2) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp rails-dom-testing (~> 2.2) - actionpack (7.1.2) - actionview (= 7.1.2) - activesupport (= 7.1.2) + actionpack (7.1.3.2) + actionview (= 7.1.3.2) + activesupport (= 7.1.3.2) nokogiri (>= 1.8.5) racc rack (>= 2.2.4) @@ -41,39 +41,39 @@ GEM rails-html-sanitizer (~> 1.6) actionpack-page_caching (1.2.4) actionpack (>= 4.0.0) - actiontext (7.1.2) - actionpack (= 7.1.2) - activerecord (= 7.1.2) - activestorage (= 7.1.2) - activesupport (= 7.1.2) + actiontext (7.1.3.2) + actionpack (= 7.1.3.2) + activerecord (= 7.1.3.2) + activestorage (= 7.1.3.2) + activesupport (= 7.1.3.2) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.1.2) - activesupport (= 7.1.2) + actionview (7.1.3.2) + activesupport (= 7.1.3.2) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) active_record_union (1.3.0) activerecord (>= 4.0) - activejob (7.1.2) - activesupport (= 7.1.2) + activejob (7.1.3.2) + activesupport (= 7.1.3.2) globalid (>= 0.3.6) - activemodel (7.1.2) - activesupport (= 7.1.2) - activerecord (7.1.2) - activemodel (= 7.1.2) - activesupport (= 7.1.2) + activemodel (7.1.3.2) + activesupport (= 7.1.3.2) + activerecord (7.1.3.2) + activemodel (= 7.1.3.2) + activesupport (= 7.1.3.2) timeout (>= 0.4.0) - activerecord-import (1.5.0) + activerecord-import (1.5.1) activerecord (>= 4.2) - activestorage (7.1.2) - actionpack (= 7.1.2) - activejob (= 7.1.2) - activerecord (= 7.1.2) - activesupport (= 7.1.2) + activestorage (7.1.3.2) + actionpack (= 7.1.3.2) + activejob (= 7.1.3.2) + activerecord (= 7.1.3.2) + activesupport (= 7.1.3.2) marcel (~> 1.0) - activesupport (7.1.2) + activesupport (7.1.3.2) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) @@ -83,7 +83,7 @@ GEM minitest (>= 5.1) mutex_m tzinfo (~> 2.0) - addressable (2.8.5) + addressable (2.8.6) public_suffix (>= 2.0.2, < 6.0) annotate (3.2.0) activerecord (>= 3.2, < 8.0) @@ -92,23 +92,24 @@ GEM ffi (~> 1.15) ffi-compiler (~> 1.0) ast (2.4.2) - autoprefixer-rails (10.4.15.0) + autoprefixer-rails (10.4.16.0) execjs (~> 2) - aws-eventstream (1.2.0) - aws-partitions (1.849.0) - aws-sdk-core (3.186.0) - aws-eventstream (~> 1, >= 1.0.2) + aws-eventstream (1.3.0) + aws-partitions (1.894.0) + aws-sdk-core (3.191.2) + aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) - aws-sigv4 (~> 1.5) + aws-sigv4 (~> 1.8) + base64 jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.72.0) - aws-sdk-core (~> 3, >= 3.184.0) + aws-sdk-kms (1.77.0) + aws-sdk-core (~> 3, >= 3.191.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.136.0) - aws-sdk-core (~> 3, >= 3.181.0) + aws-sdk-s3 (1.143.0) + aws-sdk-core (~> 3, >= 3.191.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.6) - aws-sigv4 (1.6.1) + aws-sigv4 (~> 1.8) + aws-sigv4 (1.8.0) aws-eventstream (~> 1, >= 1.0.2) base64 (0.2.0) better_errors (2.10.1) @@ -122,10 +123,10 @@ GEM erubi (~> 1.4) parser (>= 2.4) smart_properties - bigdecimal (3.1.4) + bigdecimal (3.1.6) binding_of_caller (1.0.0) debug_inspector (>= 0.0.1) - bootsnap (1.17.0) + bootsnap (1.18.3) msgpack (~> 1.2) bootstrap (5.3.2) autoprefixer-rails (>= 9.1.0) @@ -133,8 +134,9 @@ GEM bootstrap_form (5.4.0) actionpack (>= 6.1) activemodel (>= 6.1) - brakeman (6.0.1) - brotli (0.4.0) + brakeman (6.1.2) + racc + brotli (0.5.0) browser (5.3.1) builder (3.2.4) bzip2-ffi (1.1.1) @@ -142,24 +144,25 @@ GEM cancancan (3.5.0) canonical-rails (0.2.15) actionview (>= 4.1, <= 7.2) - capybara (3.39.2) + capybara (3.40.0) addressable matrix mini_mime (>= 0.1.3) - nokogiri (~> 1.8) + nokogiri (~> 1.11) rack (>= 1.6.0) rack-test (>= 0.6.3) regexp_parser (>= 1.5, < 3.0) xpath (~> 3.2) - concurrent-ruby (1.2.2) - config (5.0.0) + concurrent-ruby (1.2.3) + config (5.1.0) deep_merge (~> 1.2, >= 1.2.1) dry-validation (~> 1.0, >= 1.0.0) connection_pool (2.4.1) - crack (0.4.5) + crack (1.0.0) + bigdecimal rexml crass (1.0.6) - dalli (3.2.6) + dalli (3.2.8) dartsass-ruby (3.0.2) sass-embedded (~> 1.54, < 1.67) dartsass-sprockets (3.0.0) @@ -169,7 +172,7 @@ GEM sprockets-rails tilt date (3.3.4) - debug_inspector (1.1.0) + debug_inspector (1.2.0) deep_merge (1.2.2) delayed_job (4.1.11) activesupport (>= 3.0, < 8.0) @@ -177,7 +180,7 @@ GEM activerecord (>= 3.0, < 8.0) delayed_job (>= 3.0, < 5) docile (1.4.0) - doorkeeper (5.6.6) + doorkeeper (5.6.9) railties (>= 5) doorkeeper-i18n (5.2.7) doorkeeper (>= 5.2) @@ -206,7 +209,8 @@ GEM dry-logic (>= 1.4, < 2) dry-types (>= 1.7, < 2) zeitwerk (~> 2.6) - dry-types (1.7.1) + dry-types (1.7.2) + bigdecimal (~> 3.0) concurrent-ruby (~> 1.0) dry-core (~> 1.0) dry-inflector (~> 1.0) @@ -228,33 +232,33 @@ GEM erubi (1.12.0) execjs (2.9.1) exifr (1.4.0) - factory_bot (6.2.1) + factory_bot (6.4.6) activesupport (>= 5.0.0) - factory_bot_rails (6.2.0) - factory_bot (~> 6.2.0) + factory_bot_rails (6.4.3) + factory_bot (~> 6.4) railties (>= 5.0.0) - faraday (2.7.11) - base64 - faraday-net_http (>= 2.0, < 3.1) - ruby2_keywords (>= 0.0.4) - faraday-net_http (3.0.2) + faraday (2.9.0) + faraday-net_http (>= 2.0, < 3.2) + faraday-net_http (3.1.0) + net-http ffi (1.16.3) ffi-compiler (1.0.1) ffi (>= 1.0.0) rake - ffi-libarchive (1.1.13) + ffi-libarchive (1.1.14) ffi (~> 1.0) - frozen_record (0.27.0) + file_exists (0.2.0) + frozen_record (0.27.1) activemodel fspath (3.1.2) gd2-ffij (0.4.0) ffi (>= 1.0.0) globalid (1.2.1) activesupport (>= 6.1) - google-protobuf (3.25.0) - hashdiff (1.0.1) + google-protobuf (3.25.3) + hashdiff (1.1.0) hashie (5.0.0) - highline (2.1.0) + highline (3.0.1) htmlentities (4.3.4) http_accept_language (2.1.1) i18n (1.14.1) @@ -285,12 +289,12 @@ GEM image_processing (1.12.2) mini_magick (>= 4.9.5, < 5) ruby-vips (>= 2.0.17, < 3) - image_size (3.3.0) + image_size (3.4.0) in_threads (1.6.0) - io-console (0.6.0) - irb (1.9.0) + io-console (0.7.2) + irb (1.11.2) rdoc - reline (>= 0.3.8) + reline (>= 0.4.2) jbuilder (2.11.5) actionview (>= 5.0.0) activesupport (>= 5.0.0) @@ -299,13 +303,15 @@ GEM rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) - json (2.6.3) - jwt (2.7.1) + json (2.7.1) + jwt (2.8.0) + base64 kgio (2.11.4) kramdown (2.4.0) rexml language_server-protocol (3.17.0.3) - libxml-ruby (4.1.2) + libv8-node (18.16.0.0) + libxml-ruby (5.0.2) listen (3.8.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) @@ -326,22 +332,28 @@ GEM mini_magick (4.12.0) mini_mime (1.1.5) mini_portile2 (2.8.5) - minitest (5.20.0) + mini_racer (0.8.0) + libv8-node (~> 18.16.0.0) + minitest (5.22.2) + minitest-focus (1.4.0) + minitest (>= 4, < 6) msgpack (1.7.2) multi_json (1.15.0) multi_xml (0.6.0) mutex_m (0.2.0) - net-imap (0.4.5) + net-http (0.4.1) + uri + net-imap (0.4.10) date net-protocol net-pop (0.1.2) net-protocol net-protocol (0.2.2) timeout - net-smtp (0.4.0) + net-smtp (0.4.0.1) net-protocol - nio4r (2.5.9) - nokogiri (1.15.4) + nio4r (2.7.0) + nokogiri (1.16.2) mini_portile2 (~> 2.8.2) racc (~> 1.4) oauth (0.4.7) @@ -374,7 +386,8 @@ GEM omniauth-mediawiki (0.0.4) jwt (~> 2.0) omniauth-oauth (~> 1.0) - omniauth-microsoft_graph (1.2.0) + omniauth-microsoft_graph (2.0.0) + jwt (~> 2.0) omniauth (~> 2.0) omniauth-oauth2 (~> 1.8.0) omniauth-oauth (1.2.0) @@ -390,30 +403,30 @@ GEM actionpack (>= 4.2) omniauth (~> 2.0) openstreetmap-deadlock_retry (1.3.1) - parallel (1.23.0) - parser (3.2.2.4) + parallel (1.24.0) + parser (3.3.0.5) ast (~> 2.4.1) racc - pg (1.5.4) + pg (1.5.5) popper_js (2.11.8) progress (3.6.0) - psych (5.1.1.1) + psych (5.1.2) stringio - public_suffix (5.0.3) - puma (5.6.7) + public_suffix (5.0.4) + puma (5.6.8) nio4r (~> 2.0) quad_tile (1.0.1) - r2 (0.2.8) racc (1.7.3) - rack (2.2.8) + rack (2.2.8.1) rack-cors (2.0.1) rack (>= 2.0.0) rack-openid (1.4.2) rack (>= 1.1.0) ruby-openid (>= 2.1.8) - rack-protection (3.1.0) + rack-protection (3.2.0) + base64 (>= 0.1.0) rack (~> 2.2, >= 2.2.4) - rack-session (1.0.1) + rack-session (1.0.2) rack (< 3) rack-test (2.1.0) rack (>= 1.3) @@ -421,20 +434,20 @@ GEM rackup (1.0.0) rack (< 3) webrick - rails (7.1.2) - actioncable (= 7.1.2) - actionmailbox (= 7.1.2) - actionmailer (= 7.1.2) - actionpack (= 7.1.2) - actiontext (= 7.1.2) - actionview (= 7.1.2) - activejob (= 7.1.2) - activemodel (= 7.1.2) - activerecord (= 7.1.2) - activestorage (= 7.1.2) - activesupport (= 7.1.2) + rails (7.1.3.2) + actioncable (= 7.1.3.2) + actionmailbox (= 7.1.3.2) + actionmailer (= 7.1.3.2) + actionpack (= 7.1.3.2) + actiontext (= 7.1.3.2) + actionview (= 7.1.3.2) + activejob (= 7.1.3.2) + activemodel (= 7.1.3.2) + activerecord (= 7.1.3.2) + activestorage (= 7.1.3.2) + activesupport (= 7.1.3.2) bundler (>= 1.15.0) - railties (= 7.1.2) + railties (= 7.1.3.2) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) actionview (>= 5.0.1.rc1) @@ -449,9 +462,9 @@ GEM rails-i18n (7.0.8) i18n (>= 0.7, < 2) railties (>= 6.0.0, < 8) - railties (7.1.2) - actionpack (= 7.1.2) - activesupport (= 7.1.2) + railties (7.1.3.2) + actionpack (= 7.1.3.2) + activesupport (= 7.1.3.2) irb rackup (>= 1.0.0) rake (>= 12.2) @@ -462,43 +475,47 @@ GEM rb-fsevent (0.11.2) rb-inotify (0.10.1) ffi (~> 1.0) - rdoc (6.6.0) + rdoc (6.6.2) psych (>= 4.0.0) - regexp_parser (2.8.2) - reline (0.4.0) + regexp_parser (2.9.0) + reline (0.4.2) io-console (~> 0.5) - request_store (1.5.1) + request_store (1.6.0) rack (>= 1.4) rexml (3.2.6) rinku (2.0.6) rotp (6.3.0) rouge (4.2.0) - rubocop (1.57.2) + rtlcss (0.2.1) + mini_racer (>= 0.6.3) + rubocop (1.60.2) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) - parser (>= 3.2.2.4) + parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 1.8, < 3.0) rexml (>= 3.2.5, < 4.0) - rubocop-ast (>= 1.28.1, < 2.0) + rubocop-ast (>= 1.30.0, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 3.0) rubocop-ast (1.30.0) parser (>= 3.2.1.0) - rubocop-capybara (2.19.0) + rubocop-capybara (2.20.0) + rubocop (~> 1.41) + rubocop-factory_bot (2.25.1) rubocop (~> 1.41) - rubocop-factory_bot (2.24.0) - rubocop (~> 1.33) - rubocop-minitest (0.33.0) + rubocop-minitest (0.34.5) rubocop (>= 1.39, < 2.0) - rubocop-performance (1.19.1) - rubocop (>= 1.7.0, < 2.0) - rubocop-ast (>= 0.4.0) - rubocop-rails (2.22.1) + rubocop-ast (>= 1.30.0, < 2.0) + rubocop-performance (1.20.2) + rubocop (>= 1.48.1, < 2.0) + rubocop-ast (>= 1.30.0, < 2.0) + rubocop-rails (2.23.1) activesupport (>= 4.2.0) rack (>= 1.1) rubocop (>= 1.33.0, < 2.0) + rubocop-ast (>= 1.30.0, < 2.0) rubocop-rake (0.6.0) rubocop (~> 1.0) ruby-openid (2.9.2) @@ -514,7 +531,8 @@ GEM google-protobuf (~> 3.23) rake (>= 13.0.0) secure_headers (6.5.0) - selenium-webdriver (4.15.0) + selenium-webdriver (4.18.1) + base64 (~> 0.2) rexml (~> 3.2, >= 3.2.5) rubyzip (>= 1.2.2, < 3.0) websocket (~> 1.0) @@ -539,12 +557,12 @@ GEM actionpack (>= 5.2) activesupport (>= 5.2) sprockets (>= 3.0.0) - stringio (3.0.9) - strong_migrations (1.6.4) + stringio (3.1.0) + strong_migrations (1.7.0) activerecord (>= 5.2) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) - terser (1.1.19) + terser (1.2.0) execjs (>= 0.3.0, < 3) thor (1.3.0) tilt (2.3.0) @@ -552,11 +570,12 @@ GEM tzinfo (2.0.6) concurrent-ruby (~> 1.0) unicode-display_width (2.5.0) + uri (0.13.0) validates_email_format_of (1.7.2) i18n vendorer (0.2.0) version_gem (1.1.3) - webmock (3.19.1) + webmock (3.21.2) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) @@ -567,7 +586,7 @@ GEM websocket-extensions (0.1.5) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.6.12) + zeitwerk (2.6.13) PLATFORMS ruby @@ -605,6 +624,7 @@ DEPENDENCIES factory_bot_rails faraday ffi-libarchive + file_exists frozen_record gd2-ffij (>= 0.4.0) htmlentities @@ -625,6 +645,7 @@ DEPENDENCIES marcel maxminddb minitest (~> 5.1) + minitest-focus oauth-plugin (>= 0.5.1) omniauth (~> 2.0.2) omniauth-facebook @@ -638,7 +659,6 @@ DEPENDENCIES pg puma (~> 5.6) quad_tile (~> 1.0.1) - r2 (~> 0.2.7) rack-cors rack-uri_sanitizer rails (~> 7.1.0) @@ -646,6 +666,7 @@ DEPENDENCIES rails-i18n (~> 7.0.0) rinku (>= 2.0.6) rotp + rtlcss rubocop rubocop-capybara rubocop-factory_bot @@ -662,6 +683,7 @@ DEPENDENCIES sprockets-exporters_pack strong_migrations terser + unicode-display_width validates_email_format_of (>= 1.5.1) vendorer webmock diff --git a/INSTALL.md b/INSTALL.md index 59e924b9b..63aad6f1a 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -23,7 +23,7 @@ of packages required before you can get the various gems installed. ## Minimum requirements * Ruby 3.0+ -* PostgreSQL 9.1+ +* PostgreSQL 13+ * Bundler (see note below about [developer Ruby setup](#rbenv)) * Javascript Runtime @@ -226,11 +226,11 @@ After installing this software, you may need to carry out some [configuration st # Ruby development install and versions (optional) -For simplicity, this document explains how to install all the website dependencies as "system" dependencies. While this is simpler, and usually faster, you might want more control over the process or the ability to install multiple different versions of software alongside eachother. For many developers, [`rbenv`](https://github.com/rbenv/rbenv) is the easiest way to manage multiple different Ruby versions on the same computer - with the added advantage that the installs are all in your home directory, so you don't need administrator permissions. +For simplicity, this document explains how to install all the website dependencies as "system" dependencies. While this is simpler, and usually faster, you might want more control over the process or the ability to install multiple different versions of software alongside each other. For many developers, [`rbenv`](https://github.com/rbenv/rbenv) is the easiest way to manage multiple different Ruby versions on the same computer - with the added advantage that the installs are all in your home directory, so you don't need administrator permissions. If you choose to install Ruby and Bundler via `rbenv`, then you do not need to install the system libraries for Ruby: -* For Ubuntu, you do not need to install the following packages: `ruby3.0 libruby3.0 ruby3.0-dev bundler`, +* For Ubuntu, you do not need to install the following packages: `ruby ruby-dev ruby-bundler`, * For Fedora, you do not need to install the following packages: `ruby ruby-devel rubygem-rdoc rubygem-bundler rubygems` * For MacOSX, you do not need to `brew install ruby` - but make sure you've installed a version of Ruby using `rbenv` before running `gem install bundler`! diff --git a/app/abilities/ability.rb b/app/abilities/ability.rb index cdf28bd4f..5e0e835d4 100644 --- a/app/abilities/ability.rb +++ b/app/abilities/ability.rb @@ -6,6 +6,9 @@ class Ability def initialize(user) can [:relation, :relation_history, :way, :way_history, :node, :node_history, :changeset, :query], :browse + can [:show], OldNode + can [:show], OldWay + can [:show], OldRelation can [:show, :new], Note can :search, :direction can [:index, :permalink, :edit, :help, :fixthemap, :offline, :export, :about, :communities, :preview, :copyright, :key, :id], :site @@ -19,18 +22,12 @@ class Ability can [:confirm, :confirm_resend, :confirm_email], :confirmation can [:index, :rss, :show, :comments], DiaryEntry can [:index], Note - can [:lost_password, :reset_password], :password + can [:new, :create, :edit, :update], :password can [:index, :show], Redaction can [:new, :create, :destroy], :session can [:index, :show, :data, :georss, :picture, :icon], Trace can [:terms, :new, :create, :save, :suspended, :show, :auth_success, :auth_failure], User can [:index, :show, :blocks_on, :blocks_by], UserBlock - can [:index, :show], Node - can [:index, :show, :full, :ways_for_node], Way - can [:index, :show, :full, :relations_for_node, :relations_for_way, :relations_for_relation], Relation - can [:history, :version], OldNode - can [:history, :version], OldWay - can [:history, :version], OldRelation end if user&.active? @@ -39,6 +36,7 @@ class Ability can [:show], :deletion if Settings.status != "database_offline" + can [:subscribe, :unsubscribe], Changeset can [:index, :new, :create, :show, :edit, :update, :destroy], ClientApplication can [:index, :new, :create, :show, :edit, :update, :destroy], :oauth2_application can [:index, :destroy], :oauth2_authorized_application @@ -47,20 +45,21 @@ class Ability can [:show], :dashboard can [:new, :create, :edit, :update, :comment, :subscribe, :unsubscribe], DiaryEntry can [:make_friend, :remove_friend], Friendship - can [:new, :create, :reply, :show, :inbox, :outbox, :mark, :destroy], Message + can [:new, :create, :reply, :show, :inbox, :outbox, :muted, :mark, :unmute, :destroy], Message can [:close, :reopen], Note can [:show, :edit, :update], :preference can [:edit, :update], :profile can [:new, :create], Report can [:mine, :new, :create, :edit, :update, :destroy], Trace can [:account, :go_public], User + can [:index, :create, :destroy], UserMute if user.moderator? can [:hide, :unhide, :hidecomment, :unhidecomment], DiaryEntry can [:index, :show, :resolve, :ignore, :reopen], Issue can :create, IssueComment can [:new, :create, :edit, :update, :destroy], Redaction - can [:new, :edit, :create, :update, :revoke], UserBlock + can [:new, :edit, :create, :update, :revoke, :revoke_all], UserBlock end if user.administrator? diff --git a/app/abilities/api_ability.rb b/app/abilities/api_ability.rb index fe39f5eb5..0eae46f82 100644 --- a/app/abilities/api_ability.rb +++ b/app/abilities/api_ability.rb @@ -5,14 +5,13 @@ class ApiAbility def initialize(user) can :show, :capability - can :index, :change can :index, :map can :show, :permission can :show, :version if Settings.status != "database_offline" can [:show, :download, :query], Changeset - can [:index, :create, :comment, :feed, :show, :search], Note + can [:index, :create, :feed, :show, :search], Note can :index, Tracepoint can [:index, :show], User can [:index, :show], Node @@ -22,17 +21,9 @@ class ApiAbility can [:history, :version], OldWay can [:history, :version], OldRelation can [:show], UserBlock - end - - if user&.active? - can :welcome, :site - can [:revoke, :authorize], :oauth - if Settings.status != "database_offline" - can [:index, :new, :create, :show, :edit, :update, :destroy], ClientApplication - can [:new, :create, :reply, :show, :inbox, :outbox, :mark, :destroy], Message - can [:close, :reopen], Note - can [:new, :create], Report + if user&.active? + can [:comment, :close, :reopen], Note can [:create, :show, :update, :destroy, :data], Trace can [:details, :gpx_files], User can [:index, :show, :update, :update_all, :destroy], UserPreference diff --git a/app/abilities/api_capability.rb b/app/abilities/api_capability.rb index 8c52327cf..95d7ab9ab 100644 --- a/app/abilities/api_capability.rb +++ b/app/abilities/api_capability.rb @@ -32,9 +32,9 @@ class ApiCapability can [:destroy, :restore], ChangesetComment if scope?(token, :write_api) can :destroy, Note if scope?(token, :write_notes) if user&.terms_agreed? - can :redact, OldNode if scope?(token, :write_api) - can :redact, OldWay if scope?(token, :write_api) - can :redact, OldRelation if scope?(token, :write_api) + can :redact, OldNode if scope?(token, :write_api) || scope?(token, :write_redactions) + can :redact, OldWay if scope?(token, :write_api) || scope?(token, :write_redactions) + can :redact, OldRelation if scope?(token, :write_api) || scope?(token, :write_redactions) end end end diff --git a/app/assets/images/key/cyclemap/beach.png b/app/assets/images/key/cyclemap/beach.png new file mode 100644 index 000000000..256732b6e Binary files /dev/null and b/app/assets/images/key/cyclemap/beach.png differ diff --git a/app/assets/images/key/cyclemap/bicycle_parking.png b/app/assets/images/key/cyclemap/bicycle_parking.png index c900a4495..e5a781d13 100644 Binary files a/app/assets/images/key/cyclemap/bicycle_parking.png and b/app/assets/images/key/cyclemap/bicycle_parking.png differ diff --git a/app/assets/images/key/cyclemap/bicycle_parking_small.svg b/app/assets/images/key/cyclemap/bicycle_parking_small.svg new file mode 100644 index 000000000..753fab746 --- /dev/null +++ b/app/assets/images/key/cyclemap/bicycle_parking_small.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/images/key/cyclemap/bicycle_rental.png b/app/assets/images/key/cyclemap/bicycle_rental.png new file mode 100644 index 000000000..190e52755 Binary files /dev/null and b/app/assets/images/key/cyclemap/bicycle_rental.png differ diff --git a/app/assets/images/key/cyclemap/bicycle_rental_small.svg b/app/assets/images/key/cyclemap/bicycle_rental_small.svg new file mode 100644 index 000000000..fa0399c16 --- /dev/null +++ b/app/assets/images/key/cyclemap/bicycle_rental_small.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/images/key/cyclemap/common.png b/app/assets/images/key/cyclemap/common.png deleted file mode 100644 index 7c108152a..000000000 Binary files a/app/assets/images/key/cyclemap/common.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/cycleway.png b/app/assets/images/key/cyclemap/cycleway.png deleted file mode 100644 index 13bed4a7d..000000000 Binary files a/app/assets/images/key/cyclemap/cycleway.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/cycleway_local.png b/app/assets/images/key/cyclemap/cycleway_local.png deleted file mode 100644 index 2a2933169..000000000 Binary files a/app/assets/images/key/cyclemap/cycleway_local.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/cycleway_local13.png b/app/assets/images/key/cyclemap/cycleway_local13.png deleted file mode 100644 index 3f2c53587..000000000 Binary files a/app/assets/images/key/cyclemap/cycleway_local13.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/cycleway_national.png b/app/assets/images/key/cyclemap/cycleway_national.png deleted file mode 100644 index 0f5455f71..000000000 Binary files a/app/assets/images/key/cyclemap/cycleway_national.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/cycleway_national13.png b/app/assets/images/key/cyclemap/cycleway_national13.png deleted file mode 100644 index 252b07a30..000000000 Binary files a/app/assets/images/key/cyclemap/cycleway_national13.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/cycleway_regional.png b/app/assets/images/key/cyclemap/cycleway_regional.png deleted file mode 100644 index 92249992e..000000000 Binary files a/app/assets/images/key/cyclemap/cycleway_regional.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/cycleway_regional13.png b/app/assets/images/key/cyclemap/cycleway_regional13.png deleted file mode 100644 index 519570454..000000000 Binary files a/app/assets/images/key/cyclemap/cycleway_regional13.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/footway.png b/app/assets/images/key/cyclemap/footway.png deleted file mode 100644 index c78756f8c..000000000 Binary files a/app/assets/images/key/cyclemap/footway.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/forest.png b/app/assets/images/key/cyclemap/forest.png deleted file mode 100644 index a7ebe8e5d..000000000 Binary files a/app/assets/images/key/cyclemap/forest.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/lake.png b/app/assets/images/key/cyclemap/lake.png deleted file mode 100644 index 918d496ae..000000000 Binary files a/app/assets/images/key/cyclemap/lake.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/motorway.png b/app/assets/images/key/cyclemap/motorway.png deleted file mode 100644 index 296f17677..000000000 Binary files a/app/assets/images/key/cyclemap/motorway.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/motorway12.png b/app/assets/images/key/cyclemap/motorway12.png deleted file mode 100644 index 749493ad6..000000000 Binary files a/app/assets/images/key/cyclemap/motorway12.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/primary.png b/app/assets/images/key/cyclemap/primary.png deleted file mode 100644 index 78ae0e4e5..000000000 Binary files a/app/assets/images/key/cyclemap/primary.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/primary12.png b/app/assets/images/key/cyclemap/primary12.png deleted file mode 100644 index fed37d054..000000000 Binary files a/app/assets/images/key/cyclemap/primary12.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/rail.png b/app/assets/images/key/cyclemap/rail.png deleted file mode 100644 index 0abf0c1df..000000000 Binary files a/app/assets/images/key/cyclemap/rail.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/rail14.png b/app/assets/images/key/cyclemap/rail14.png deleted file mode 100644 index 957f17c85..000000000 Binary files a/app/assets/images/key/cyclemap/rail14.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/secondary.png b/app/assets/images/key/cyclemap/secondary.png deleted file mode 100644 index 7928b182b..000000000 Binary files a/app/assets/images/key/cyclemap/secondary.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/secondary12.png b/app/assets/images/key/cyclemap/secondary12.png deleted file mode 100644 index cde008523..000000000 Binary files a/app/assets/images/key/cyclemap/secondary12.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/track.png b/app/assets/images/key/cyclemap/track.png deleted file mode 100644 index f294edca0..000000000 Binary files a/app/assets/images/key/cyclemap/track.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/trunk.png b/app/assets/images/key/cyclemap/trunk.png deleted file mode 100644 index d312a65cb..000000000 Binary files a/app/assets/images/key/cyclemap/trunk.png and /dev/null differ diff --git a/app/assets/images/key/cyclemap/trunk12.png b/app/assets/images/key/cyclemap/trunk12.png deleted file mode 100644 index 51230a021..000000000 Binary files a/app/assets/images/key/cyclemap/trunk12.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/admin.png b/app/assets/images/key/mapnik/admin.png deleted file mode 100644 index 0cae05889..000000000 Binary files a/app/assets/images/key/mapnik/admin.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/allotments.png b/app/assets/images/key/mapnik/allotments.png deleted file mode 100644 index e39771885..000000000 Binary files a/app/assets/images/key/mapnik/allotments.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/apron.png b/app/assets/images/key/mapnik/apron.png deleted file mode 100644 index bcea5e3fb..000000000 Binary files a/app/assets/images/key/mapnik/apron.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/bridge.png b/app/assets/images/key/mapnik/bridge.png deleted file mode 100644 index d388d7b81..000000000 Binary files a/app/assets/images/key/mapnik/bridge.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/bridleway.png b/app/assets/images/key/mapnik/bridleway.png deleted file mode 100644 index 9aec1ad33..000000000 Binary files a/app/assets/images/key/mapnik/bridleway.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/brownfield.png b/app/assets/images/key/mapnik/brownfield.png deleted file mode 100644 index c0a12794a..000000000 Binary files a/app/assets/images/key/mapnik/brownfield.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/building.png b/app/assets/images/key/mapnik/building.png deleted file mode 100644 index bc074feeb..000000000 Binary files a/app/assets/images/key/mapnik/building.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/capital4.svg b/app/assets/images/key/mapnik/capital4.svg new file mode 100644 index 000000000..712c904d0 --- /dev/null +++ b/app/assets/images/key/mapnik/capital4.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/assets/images/key/mapnik/capital7.svg b/app/assets/images/key/mapnik/capital7.svg new file mode 100644 index 000000000..69011cfa9 --- /dev/null +++ b/app/assets/images/key/mapnik/capital7.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/assets/images/key/mapnik/cemetery.png b/app/assets/images/key/mapnik/cemetery.png deleted file mode 100644 index f88f47de0..000000000 Binary files a/app/assets/images/key/mapnik/cemetery.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/centre.png b/app/assets/images/key/mapnik/centre.png deleted file mode 100644 index a1c4522b7..000000000 Binary files a/app/assets/images/key/mapnik/centre.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/city4.svg b/app/assets/images/key/mapnik/city4.svg new file mode 100644 index 000000000..542236cad --- /dev/null +++ b/app/assets/images/key/mapnik/city4.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/images/key/mapnik/city6.svg b/app/assets/images/key/mapnik/city6.svg new file mode 100644 index 000000000..40fc3aebc --- /dev/null +++ b/app/assets/images/key/mapnik/city6.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/assets/images/key/mapnik/commercial.png b/app/assets/images/key/mapnik/commercial.png deleted file mode 100644 index 7a2ca5e8d..000000000 Binary files a/app/assets/images/key/mapnik/commercial.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/common.png b/app/assets/images/key/mapnik/common.png deleted file mode 100644 index c1422e7be..000000000 Binary files a/app/assets/images/key/mapnik/common.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/cycleway.png b/app/assets/images/key/mapnik/cycleway.png deleted file mode 100644 index a1a16f1ed..000000000 Binary files a/app/assets/images/key/mapnik/cycleway.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/farm.png b/app/assets/images/key/mapnik/farm.png deleted file mode 100644 index e63e571bb..000000000 Binary files a/app/assets/images/key/mapnik/farm.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/footway.png b/app/assets/images/key/mapnik/footway.png deleted file mode 100644 index 4486119ba..000000000 Binary files a/app/assets/images/key/mapnik/footway.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/forest.png b/app/assets/images/key/mapnik/forest.png deleted file mode 100644 index 5b341c61d..000000000 Binary files a/app/assets/images/key/mapnik/forest.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/golf.png b/app/assets/images/key/mapnik/golf.png deleted file mode 100644 index 11a623097..000000000 Binary files a/app/assets/images/key/mapnik/golf.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/heathland.png b/app/assets/images/key/mapnik/heathland.png deleted file mode 100644 index d48f9690f..000000000 Binary files a/app/assets/images/key/mapnik/heathland.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/industrial.png b/app/assets/images/key/mapnik/industrial.png deleted file mode 100644 index c5ac802ac..000000000 Binary files a/app/assets/images/key/mapnik/industrial.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/intermittent_water.svg b/app/assets/images/key/mapnik/intermittent_water.svg new file mode 100644 index 000000000..ab728ce25 --- /dev/null +++ b/app/assets/images/key/mapnik/intermittent_water.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/app/assets/images/key/mapnik/lake.png b/app/assets/images/key/mapnik/lake.png deleted file mode 100644 index 3f16b54d1..000000000 Binary files a/app/assets/images/key/mapnik/lake.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/mainroad.png b/app/assets/images/key/mapnik/mainroad.png deleted file mode 100644 index 269959b65..000000000 Binary files a/app/assets/images/key/mapnik/mainroad.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/mainroad12.png b/app/assets/images/key/mapnik/mainroad12.png deleted file mode 100644 index c289a3f8c..000000000 Binary files a/app/assets/images/key/mapnik/mainroad12.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/mainroad12.svg b/app/assets/images/key/mapnik/mainroad12.svg new file mode 100644 index 000000000..6bf11d915 --- /dev/null +++ b/app/assets/images/key/mapnik/mainroad12.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/assets/images/key/mapnik/mainroad15.svg b/app/assets/images/key/mapnik/mainroad15.svg new file mode 100644 index 000000000..96796b86e --- /dev/null +++ b/app/assets/images/key/mapnik/mainroad15.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/assets/images/key/mapnik/mainroad7.png b/app/assets/images/key/mapnik/mainroad7.png deleted file mode 100644 index 05b4dac85..000000000 Binary files a/app/assets/images/key/mapnik/mainroad7.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/mainroad8.svg b/app/assets/images/key/mapnik/mainroad8.svg new file mode 100644 index 000000000..ab5ab3f64 --- /dev/null +++ b/app/assets/images/key/mapnik/mainroad8.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/assets/images/key/mapnik/mainroad9.png b/app/assets/images/key/mapnik/mainroad9.png deleted file mode 100644 index 334f8fc0d..000000000 Binary files a/app/assets/images/key/mapnik/mainroad9.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/mainroad9.svg b/app/assets/images/key/mapnik/mainroad9.svg new file mode 100644 index 000000000..75195d9fb --- /dev/null +++ b/app/assets/images/key/mapnik/mainroad9.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/app/assets/images/key/mapnik/military.png b/app/assets/images/key/mapnik/military.png deleted file mode 100644 index 73c82d49e..000000000 Binary files a/app/assets/images/key/mapnik/military.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/military.svg b/app/assets/images/key/mapnik/military.svg new file mode 100644 index 000000000..7a6872df8 --- /dev/null +++ b/app/assets/images/key/mapnik/military.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/assets/images/key/mapnik/motorway.png b/app/assets/images/key/mapnik/motorway.png deleted file mode 100644 index 484fc9daa..000000000 Binary files a/app/assets/images/key/mapnik/motorway.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/park.png b/app/assets/images/key/mapnik/park.png deleted file mode 100644 index 149795a87..000000000 Binary files a/app/assets/images/key/mapnik/park.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/pitch.png b/app/assets/images/key/mapnik/pitch.png deleted file mode 100644 index 98177f604..000000000 Binary files a/app/assets/images/key/mapnik/pitch.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/rail.png b/app/assets/images/key/mapnik/rail.png deleted file mode 100644 index 0abf0c1df..000000000 Binary files a/app/assets/images/key/mapnik/rail.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/rail13.png b/app/assets/images/key/mapnik/rail13.png deleted file mode 100644 index 957f17c85..000000000 Binary files a/app/assets/images/key/mapnik/rail13.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/reef.png b/app/assets/images/key/mapnik/reef.png new file mode 100644 index 000000000..713ac868e Binary files /dev/null and b/app/assets/images/key/mapnik/reef.png differ diff --git a/app/assets/images/key/mapnik/reserve.png b/app/assets/images/key/mapnik/reserve.png deleted file mode 100644 index 5e3a79f0d..000000000 Binary files a/app/assets/images/key/mapnik/reserve.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/reserve.svg b/app/assets/images/key/mapnik/reserve.svg new file mode 100644 index 000000000..5a53f0a77 --- /dev/null +++ b/app/assets/images/key/mapnik/reserve.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/assets/images/key/mapnik/resident.png b/app/assets/images/key/mapnik/resident.png deleted file mode 100644 index 6ee3c4d2b..000000000 Binary files a/app/assets/images/key/mapnik/resident.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/retail.png b/app/assets/images/key/mapnik/retail.png deleted file mode 100644 index 216799212..000000000 Binary files a/app/assets/images/key/mapnik/retail.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/runway.png b/app/assets/images/key/mapnik/runway.png deleted file mode 100644 index c65672806..000000000 Binary files a/app/assets/images/key/mapnik/runway.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/runway11.svg b/app/assets/images/key/mapnik/runway11.svg new file mode 100644 index 000000000..088893c51 --- /dev/null +++ b/app/assets/images/key/mapnik/runway11.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/assets/images/key/mapnik/runway12.svg b/app/assets/images/key/mapnik/runway12.svg new file mode 100644 index 000000000..205a18e4a --- /dev/null +++ b/app/assets/images/key/mapnik/runway12.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/assets/images/key/mapnik/runway13.svg b/app/assets/images/key/mapnik/runway13.svg new file mode 100644 index 000000000..e4d712772 --- /dev/null +++ b/app/assets/images/key/mapnik/runway13.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/assets/images/key/mapnik/runway14.svg b/app/assets/images/key/mapnik/runway14.svg new file mode 100644 index 000000000..dc9958d76 --- /dev/null +++ b/app/assets/images/key/mapnik/runway14.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/assets/images/key/mapnik/school.png b/app/assets/images/key/mapnik/school.png deleted file mode 100644 index 50f30a2f3..000000000 Binary files a/app/assets/images/key/mapnik/school.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/school.svg b/app/assets/images/key/mapnik/school.svg new file mode 100644 index 000000000..b7600bf2c --- /dev/null +++ b/app/assets/images/key/mapnik/school.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/images/key/mapnik/station.png b/app/assets/images/key/mapnik/station.png deleted file mode 100644 index 6c36e3c61..000000000 Binary files a/app/assets/images/key/mapnik/station.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/subway.png b/app/assets/images/key/mapnik/subway.png deleted file mode 100644 index cb42ee2dc..000000000 Binary files a/app/assets/images/key/mapnik/subway.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/summit.png b/app/assets/images/key/mapnik/summit.png deleted file mode 100644 index 9dbfcd360..000000000 Binary files a/app/assets/images/key/mapnik/summit.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/summit.svg b/app/assets/images/key/mapnik/summit.svg new file mode 100644 index 000000000..e9c831c7f --- /dev/null +++ b/app/assets/images/key/mapnik/summit.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/images/key/mapnik/track.png b/app/assets/images/key/mapnik/track.png deleted file mode 100644 index f294edca0..000000000 Binary files a/app/assets/images/key/mapnik/track.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/tram.png b/app/assets/images/key/mapnik/tram.png deleted file mode 100644 index 1c64b2877..000000000 Binary files a/app/assets/images/key/mapnik/tram.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/tunnel.png b/app/assets/images/key/mapnik/tunnel.png deleted file mode 100644 index 4c52ff4fe..000000000 Binary files a/app/assets/images/key/mapnik/tunnel.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/unclassified.png b/app/assets/images/key/mapnik/unclassified.png deleted file mode 100644 index 3cdfb2dda..000000000 Binary files a/app/assets/images/key/mapnik/unclassified.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/unclassified13.png b/app/assets/images/key/mapnik/unclassified13.png deleted file mode 100644 index 1a8792462..000000000 Binary files a/app/assets/images/key/mapnik/unclassified13.png and /dev/null differ diff --git a/app/assets/images/key/mapnik/wetland.png b/app/assets/images/key/mapnik/wetland.png new file mode 100644 index 000000000..d13748bc8 Binary files /dev/null and b/app/assets/images/key/mapnik/wetland.png differ diff --git a/app/assets/images/key/mapnik/wood.png b/app/assets/images/key/mapnik/wood.png deleted file mode 100644 index 2413cda6c..000000000 Binary files a/app/assets/images/key/mapnik/wood.png and /dev/null differ diff --git a/app/assets/images/key/opnvkarte/bus_stop13.svg b/app/assets/images/key/opnvkarte/bus_stop13.svg new file mode 100644 index 000000000..ae4ffeeaf --- /dev/null +++ b/app/assets/images/key/opnvkarte/bus_stop13.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/images/key/opnvkarte/bus_stop15.svg b/app/assets/images/key/opnvkarte/bus_stop15.svg new file mode 100644 index 000000000..a25991954 --- /dev/null +++ b/app/assets/images/key/opnvkarte/bus_stop15.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/images/key/opnvkarte/rail17.svg b/app/assets/images/key/opnvkarte/rail17.svg new file mode 100644 index 000000000..8cada29c9 --- /dev/null +++ b/app/assets/images/key/opnvkarte/rail17.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/app/assets/images/key/opnvkarte/stop13.svg b/app/assets/images/key/opnvkarte/stop13.svg new file mode 100644 index 000000000..cfe65b344 --- /dev/null +++ b/app/assets/images/key/opnvkarte/stop13.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/images/key/opnvkarte/stop15.svg b/app/assets/images/key/opnvkarte/stop15.svg new file mode 100644 index 000000000..3ae62672e --- /dev/null +++ b/app/assets/images/key/opnvkarte/stop15.svg @@ -0,0 +1,3 @@ + + + diff --git a/app/assets/images/sprite.png b/app/assets/images/sprite.png deleted file mode 100644 index e25617013..000000000 Binary files a/app/assets/images/sprite.png and /dev/null differ diff --git a/app/assets/images/sprite.svg b/app/assets/images/sprite.svg index 382bc41fd..ae2e03c6b 100644 --- a/app/assets/images/sprite.svg +++ b/app/assets/images/sprite.svg @@ -1,68 +1,62 @@ - - - - - - - - - ? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + ? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index af67244bc..0bfff869e 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -103,6 +103,8 @@ $(document).ready(function () { $("body").removeClass("compact-nav"); + $("header").removeClass("text-nowrap"); + updateHeader(); $(window).resize(updateHeader); diff --git a/app/assets/javascripts/index.js b/app/assets/javascripts/index.js index e45d28321..8ffa05c53 100644 --- a/app/assets/javascripts/index.js +++ b/app/assets/javascripts/index.js @@ -346,10 +346,6 @@ $(document).ready(function () { }); } }); - - $(".colour-preview-box").each(function () { - $(this).css("background-color", $(this).data("colour")); - }); } page.unload = function () { @@ -359,6 +355,16 @@ $(document).ready(function () { return page; }; + OSM.OldBrowse = function () { + var page = {}; + + page.pushstate = page.popstate = function (path) { + OSM.loadSidebarContent(path); + }; + + return page; + }; + var history = OSM.History(map); OSM.router = OSM.Router(map, { @@ -373,8 +379,11 @@ $(document).ready(function () { "/user/:display_name/history": history, "/note/:id": OSM.Note(map), "/node/:id(/history)": OSM.Browse(map, "node"), + "/node/:id/history/:version": OSM.OldBrowse(), "/way/:id(/history)": OSM.Browse(map, "way"), + "/way/:id/history/:version": OSM.OldBrowse(), "/relation/:id(/history)": OSM.Browse(map, "relation"), + "/relation/:id/history/:version": OSM.OldBrowse(), "/changeset/:id": OSM.Changeset(map), "/query": OSM.Query(map) }); diff --git a/app/assets/javascripts/index/changeset.js b/app/assets/javascripts/index/changeset.js index c6e77bc71..75a1f7b4d 100644 --- a/app/assets/javascripts/index/changeset.js +++ b/app/assets/javascripts/index/changeset.js @@ -26,14 +26,14 @@ OSM.Changeset = function (map) { }); } - function updateChangeset(form, method, url, include_data) { + function updateChangeset(method, url, include_data) { var data; - $(form).find("#comment-error").prop("hidden", true); - $(form).find("input[type=submit]").prop("disabled", true); + content.find("#comment-error").prop("hidden", true); + content.find("button[data-method][data-url]").prop("disabled", true); if (include_data) { - data = { text: $(form.text).val() }; + data = { text: content.find("textarea").val() }; } else { data = {}; } @@ -47,24 +47,21 @@ OSM.Changeset = function (map) { OSM.loadSidebarContent(window.location.pathname, page.load); }, error: function (xhr) { - $(form).find("#comment-error").text(xhr.responseText); - $(form).find("#comment-error").prop("hidden", false); - $(form).find("input[type=submit]").prop("disabled", false); + content.find("button[data-method][data-url]").prop("disabled", false); + content.find("#comment-error") + .text(xhr.responseText) + .prop("hidden", false) + .get(0).scrollIntoView({ block: "nearest" }); } }); } function initialize() { - content.find("input[name=comment]").on("click", function (e) { + content.find("button[data-method][data-url]").on("click", function (e) { e.preventDefault(); var data = $(e.target).data(); - updateChangeset(e.target.form, data.method, data.url, true); - }); - - content.find(".action-button").on("click", function (e) { - e.preventDefault(); - var data = $(e.target).data(); - updateChangeset(e.target.form, data.method, data.url); + var include_data = e.target.name === "comment"; + updateChangeset(data.method, data.url, include_data); }); content.find("textarea").on("input", function (e) { diff --git a/app/assets/javascripts/index/directions/fossgis_valhalla.js b/app/assets/javascripts/index/directions/fossgis_valhalla.js index 0bf6a3a8d..d44dbd12b 100644 --- a/app/assets/javascripts/index/directions/fossgis_valhalla.js +++ b/app/assets/javascripts/index/directions/fossgis_valhalla.js @@ -53,7 +53,7 @@ function FOSSGISValhallaEngine(id, costing) { data: { json: JSON.stringify({ locations: points.map(function (p) { - return { lat: p.lat, lon: p.lng }; + return { lat: p.lat, lon: p.lng, radius: 5 }; }), costing: costing, directions_options: { diff --git a/app/assets/javascripts/index/export.js b/app/assets/javascripts/index/export.js index b9050d8a1..a953920f8 100644 --- a/app/assets/javascripts/index/export.js +++ b/app/assets/javascripts/index/export.js @@ -58,7 +58,6 @@ OSM.Export = function (map) { } page.pushstate = page.popstate = function (path) { - $("#export_tab").addClass("current"); OSM.loadSidebarContent(path, page.load); }; @@ -79,8 +78,6 @@ OSM.Export = function (map) { map .removeLayer(locationFilter) .off("moveend", update); - - $("#export_tab").removeClass("current"); }; return page; diff --git a/app/assets/javascripts/index/history.js b/app/assets/javascripts/index/history.js index e8d912685..c6ba0c2ed 100644 --- a/app/assets/javascripts/index/history.js +++ b/app/assets/javascripts/index/history.js @@ -146,7 +146,6 @@ OSM.History = function (map) { } page.pushstate = page.popstate = function (path) { - $("#history_tab").addClass("current"); OSM.loadSidebarContent(path, page.load); }; @@ -165,8 +164,6 @@ OSM.History = function (map) { page.unload = function () { map.removeLayer(group); map.off("moveend", update); - - $("#history_tab").removeClass("current"); }; return page; diff --git a/app/assets/javascripts/index/note.js b/app/assets/javascripts/index/note.js index e7790c904..15fedb1d1 100644 --- a/app/assets/javascripts/index/note.js +++ b/app/assets/javascripts/index/note.js @@ -52,20 +52,18 @@ OSM.Note = function (map) { OSM.loadSidebarContent(path, function () { initialize(path, id, moveToNote); }); + }, + error: function (xhr) { + $(form).find("#comment-error") + .text(xhr.responseText) + .prop("hidden", false); + updateButtons(form); } }); }); content.find("textarea").on("input", function (e) { - var form = e.target.form; - - if ($(e.target).val() === "") { - $(form.close).val($(form.close).data("defaultActionText")); - $(form.comment).prop("disabled", true); - } else { - $(form.close).val($(form.close).data("commentActionText")); - $(form.comment).prop("disabled", false); - } + updateButtons(e.target.form); }); content.find("textarea").val("").trigger("input"); @@ -84,6 +82,17 @@ OSM.Note = function (map) { if (callback) callback(); } + function updateButtons(form) { + $(form).find("input[type=submit]").prop("disabled", false); + if ($(form.text).val() === "") { + $(form.close).val($(form.close).data("defaultActionText")); + $(form.comment).prop("disabled", true); + } else { + $(form.close).val($(form.close).data("commentActionText")); + $(form.comment).prop("disabled", false); + } + } + function moveToNote() { var data = $(".details").data(); if (!data) return; diff --git a/app/assets/javascripts/leaflet.key.js b/app/assets/javascripts/leaflet.key.js index 6a3400d34..088d0f9d3 100644 --- a/app/assets/javascripts/leaflet.key.js +++ b/app/assets/javascripts/leaflet.key.js @@ -24,7 +24,7 @@ L.OSM.key = function (options) { } function updateButton() { - var disabled = ["mapnik", "cyclemap"].indexOf(map.getMapBaseLayerId()) === -1; + var disabled = OSM.LAYERS_WITH_MAP_KEY.indexOf(map.getMapBaseLayerId()) === -1; button .toggleClass("disabled", disabled) .attr("data-bs-original-title", @@ -39,11 +39,11 @@ L.OSM.key = function (options) { $(".mapkey-table-entry").each(function () { var data = $(this).data(); - if (layer === data.layer && zoom >= data.zoomMin && zoom <= data.zoomMax) { - $(this).show(); - } else { - $(this).hide(); - } + $(this).toggle( + layer === data.layer && + (!data.zoomMin || zoom >= data.zoomMin) && + (!data.zoomMax || zoom <= data.zoomMax) + ); }); } }; diff --git a/app/assets/javascripts/leaflet.map.js b/app/assets/javascripts/leaflet.map.js index e1e0e64fd..d221ae208 100644 --- a/app/assets/javascripts/leaflet.map.js +++ b/app/assets/javascripts/leaflet.map.js @@ -58,13 +58,6 @@ L.OSM.Map = L.Map.extend({ }).prop("outerHTML"); var tracestrack = I18n.t("javascripts.map.tracestrack_credit", { tracestrack_link: tracestrack_link }); - var memomaps_link = $("", { - href: "https://memomaps.de/", - target: "_blank", - text: I18n.t("javascripts.map.memomaps") - }).prop("outerHTML"); - var memomaps = I18n.t("javascripts.map.opnvkarte_credit", { memomaps_link: memomaps_link }); - var hotosm_link = $("", { href: "https://www.hotosm.org/", target: "_blank", @@ -116,13 +109,6 @@ L.OSM.Map = L.Map.extend({ })); } - this.baseLayers.push(new L.OSM.OPNVKarte({ - attribution: copyright + ". " + memomaps + ". " + terms, - code: "O", - keyid: "opnvkarte", - name: I18n.t("javascripts.map.base.opnvkarte") - })); - this.baseLayers.push(new L.OSM.HOT({ attribution: copyright + ". " + hotosm + ". " + terms, code: "H", diff --git a/app/assets/javascripts/leaflet.share.js b/app/assets/javascripts/leaflet.share.js index c096a92fc..eb351fa02 100644 --- a/app/assets/javascripts/leaflet.share.js +++ b/app/assets/javascripts/leaflet.share.js @@ -46,10 +46,13 @@ L.OSM.share = function (options) { .text(I18n.t("javascripts.share.short_link"))) .append($("") .attr("for", "embed_html") + .attr("id", "embed_link") + .attr("data-bs-title", I18n.t("javascripts.site.embed_html_disabled")) .attr("href", "#") .text(I18n.t("javascripts.share.embed"))) .on("click", "a", function (e) { e.preventDefault(); + if (!$(this).hasClass("btn-primary")) return; var id = "#" + $(this).attr("for"); $(this).siblings("a") .removeClass("active"); @@ -309,6 +312,7 @@ L.OSM.share = function (options) { } function update() { + var canEmbed = map.getMapBaseLayerId() !== "tracestracktopo"; var bounds = map.getBounds(); $("#link_marker") @@ -334,6 +338,14 @@ L.OSM.share = function (options) { params.marker = latLng.lat + "," + latLng.lng; } + $("#embed_link") + .toggleClass("btn-primary", canEmbed) + .toggleClass("btn-secondary", !canEmbed) + .tooltip(canEmbed ? "disable" : "enable"); + if (!canEmbed && $("#embed_link").hasClass("active")) { + $("#long_link").click(); + } + $("#embed_html").val( "
  • <%= t ".retain_email" %>
  • -<%= link_to t(".delete_account"), account_path, { :method => :delete, :class => "btn btn-danger", :data => { :confirm => t(".confirm_delete") } } %> +<% if current_user.deletion_allowed? %> + <%= link_to t(".delete_account"), account_path, { :method => :delete, :class => "btn btn-danger", :data => { :confirm => t(".confirm_delete") } } %> +<% else %> +
    + <%= t ".recent_editing_html", :time => friendly_date(current_user.deletion_allowed_at) %> +
    + +<% end %> + <%= link_to t(".cancel"), edit_account_path, :class => "btn btn-link" %> diff --git a/app/views/api/changesets/changeset.xml.builder b/app/views/api/changesets/changeset.xml.builder index cedfc81ea..b53061d4c 100644 --- a/app/views/api/changesets/changeset.xml.builder +++ b/app/views/api/changesets/changeset.xml.builder @@ -1,7 +1,5 @@ xml.instruct! :xml, :version => "1.0" -# basic attributes - xml.osm(OSM::API.new.xml_root_attributes) do |osm| osm << render(@changeset) end diff --git a/app/views/api/changesets/changesets.xml.builder b/app/views/api/changesets/changesets.xml.builder index c68a76da3..5ff7e2620 100644 --- a/app/views/api/changesets/changesets.xml.builder +++ b/app/views/api/changesets/changesets.xml.builder @@ -1,7 +1,5 @@ xml.instruct! :xml, :version => "1.0" -# basic attributes - xml.osm(OSM::API.new.xml_root_attributes) do |osm| @changesets.each do |changeset| osm << render(changeset) diff --git a/app/views/application/_settings_menu.html.erb b/app/views/application/_settings_menu.html.erb index 9ce9755a2..8477a11a0 100644 --- a/app/views/application/_settings_menu.html.erb +++ b/app/views/application/_settings_menu.html.erb @@ -14,5 +14,10 @@ + <% if current_user.muted_users.any? %> + + <% end %> <% end %> diff --git a/app/views/browse/_common_details.html.erb b/app/views/browse/_common_details.html.erb index 4726799e7..7d3f8e829 100644 --- a/app/views/browse/_common_details.html.erb +++ b/app/views/browse/_common_details.html.erb @@ -1,6 +1,6 @@

    <%= t "browse.version" %> - #<%= common_details.version %> + #<%= link_to_unless_current common_details.version, :controller => "old_#{@type.pluralize}", :action => :show, :version => common_details.version %>

    @@ -19,7 +19,7 @@

  • <%= t "browse.in_changeset" %> - #<%= link_to common_details.changeset_id, :action => :changeset, :id => common_details.changeset_id %> + #<%= link_to common_details.changeset_id, changeset_path(common_details.changeset) %>
  • <% if @type == "node" and common_details.visible? %> @@ -33,4 +33,4 @@ <% end %> -<%= render :partial => "tag_details", :object => common_details.tags %> +<%= render :partial => "browse/tag_details", :object => common_details.tags %> diff --git a/app/views/browse/_containing_relation.html.erb b/app/views/browse/_containing_relation.html.erb index 06220a97d..2547ff7aa 100644 --- a/app/views/browse/_containing_relation.html.erb +++ b/app/views/browse/_containing_relation.html.erb @@ -1,4 +1,4 @@ -
  • <%= linked_name = link_to printable_name(containing_relation.relation), :action => "relation", :id => containing_relation.relation.id.to_s +
  • <%= linked_name = link_to printable_element_name(containing_relation.relation), :action => "relation", :id => containing_relation.relation.id.to_s if containing_relation.member_role.blank? t ".entry_html", :relation_name => linked_name else diff --git a/app/views/browse/_node.html.erb b/app/views/browse/_node.html.erb index 152223ae7..6c6c1fdf3 100644 --- a/app/views/browse/_node.html.erb +++ b/app/views/browse/_node.html.erb @@ -8,7 +8,7 @@ <% else %>
    - <%= render :partial => "common_details", :object => node %> + <%= render :partial => "browse/common_details", :object => node %> <% unless node.ways.empty? and node.containing_relation_members.empty? %>

    <%= t "browse.part_of" %>

    @@ -17,7 +17,7 @@ <%= t "browse.part_of_ways", :count => node.ways.uniq.count %>
      <% node.ways.uniq.each do |way| %> -
    • <%= link_to printable_name(way), { :action => "way", :id => way.id.to_s }, { :class => link_class("way", way), :title => link_title(way) } %>
    • +
    • <%= element_single_current_link "way", way, way_path(way) %>
    • <% end %>
    @@ -26,7 +26,7 @@
    > <%= t "browse.part_of_relations", :count => node.containing_relation_members.uniq.count %>
      - <%= render :partial => "containing_relation", :collection => node.containing_relation_members.uniq %> + <%= render :partial => "browse/containing_relation", :collection => node.containing_relation_members.uniq %>
    <% end %> diff --git a/app/views/browse/_relation.html.erb b/app/views/browse/_relation.html.erb index 8db40c8c7..c513ea6d1 100644 --- a/app/views/browse/_relation.html.erb +++ b/app/views/browse/_relation.html.erb @@ -8,7 +8,7 @@
    <% else %>
    - <%= render :partial => "common_details", :object => relation %> + <%= render :partial => "browse/common_details", :object => relation %> <% unless relation.containing_relation_members.empty? %>

    <%= t "browse.part_of" %>

    @@ -25,7 +25,7 @@
    > <%= t ".members_count", :count => relation.relation_members.count %>
      - <%= render :partial => "relation_member", :collection => relation.relation_members %> + <%= render :partial => "browse/relation_member", :collection => relation.relation_members %>
    <% end %> diff --git a/app/views/browse/_relation_member.html.erb b/app/views/browse/_relation_member.html.erb index 5c96dadaf..16842f569 100644 --- a/app/views/browse/_relation_member.html.erb +++ b/app/views/browse/_relation_member.html.erb @@ -1,10 +1,9 @@ -<% member_class = link_class(relation_member.member_type.downcase, relation_member.member) - linked_name = link_to printable_name(relation_member.member), { :action => relation_member.member_type.downcase, :id => relation_member.member_id.to_s }, { :title => link_title(relation_member.member), :rel => link_follow(relation_member.member) } +<% linked_name = link_to printable_element_name(relation_member.member), { :controller => :browse, :action => relation_member.member_type.downcase, :id => relation_member.member_id.to_s }, { :rel => link_follow(relation_member.member) } type_str = t ".type.#{relation_member.member_type.downcase}" %> -
  • +<%= element_list_item relation_member.member_type.downcase, relation_member.member do %> <%= if relation_member.member_role.blank? t ".entry_html", :type => type_str, :name => linked_name else t ".entry_role_html", :type => type_str, :name => linked_name, :role => relation_member.member_role end %> -
  • +<% end %> diff --git a/app/views/browse/_tag_details.html.erb b/app/views/browse/_tag_details.html.erb index 9129ddaf5..cc08fe16a 100644 --- a/app/views/browse/_tag_details.html.erb +++ b/app/views/browse/_tag_details.html.erb @@ -2,7 +2,7 @@

    <%= t ".tags" %>

    - <%= render :partial => "tag", :collection => tag_details.sort %> + <%= render :partial => "browse/tag", :collection => tag_details.sort %>
    <% end %> diff --git a/app/views/browse/_way.html.erb b/app/views/browse/_way.html.erb index 4fdcd035e..7197298ac 100644 --- a/app/views/browse/_way.html.erb +++ b/app/views/browse/_way.html.erb @@ -8,7 +8,7 @@ <% else %>
    - <%= render :partial => "common_details", :object => way %> + <%= render :partial => "browse/common_details", :object => way %> <% unless way.containing_relation_members.empty? %>

    <%= t "browse.part_of" %>

    @@ -27,10 +27,12 @@
    <% if @comments.length > 0 %> -
    -
    -
      - <% @comments.each do |comment| %> - <% if comment.visible %> -
    • - - <%= t(".comment_by_html", - :time_ago => friendly_date_ago(comment.created_at), - :user => link_to(comment.author.display_name, user_path(comment.author))) %> - <% if current_user and current_user.moderator? %> - — <%= t("javascripts.changesets.show.hide_comment") %> - <% end %> - -
      - <%= comment.body.to_html %> -
      -
    • - <% elsif current_user and current_user.moderator? %> -
    • - - <%= t(".hidden_comment_by_html", - :time_ago => friendly_date_ago(comment.created_at), - :user => link_to(comment.author.display_name, user_path(comment.author))) %> - — <%= t("javascripts.changesets.show.unhide_comment") %> - -
      - <%= comment.body.to_html %> -
      -
    • +
        + <% @comments.each do |comment| %> + <% next unless comment.visible || current_user&.moderator? %> +
      • + + <%= t comment.visible ? ".comment_by_html" : ".hidden_comment_by_html", + :time_ago => friendly_date_ago(comment.created_at), + :user => link_to(comment.author.display_name, user_path(comment.author)) %> + <% if current_user&.moderator? %> + — + <%= tag.button t("javascripts.changesets.show.#{comment.visible ? 'hide' : 'unhide'}_comment"), + :class => "btn btn-sm small btn-link link-secondary p-0 align-baseline", + :data => { :method => "POST", + :url => comment.visible ? changeset_comment_hide_url(comment) : changeset_comment_unhide_url(comment) } %> <% end %> - <% end %> -
      - -
    + +
    + <%= comment.body.to_html %> +
    + + <% end %> + <% end %> <% unless current_user %> -

    +

    <%= link_to(t(".join_discussion"), login_path(:referer => request.fullpath)) %>

    <% end %> @@ -79,11 +66,11 @@
    - " data-changeset-id="<%= @changeset.id %>" data-method="POST" data-url="<%= changeset_comment_url(@changeset) %>" disabled="1" class="btn btn-sm btn-primary" /> +
    <% else %> -

    +

    <%= t(".still_open") %>

    <% end %> @@ -93,7 +80,11 @@ <%= render :partial => "paging_nav", :locals => { :type => "way", :pages => @way_pages } %> <% end %> @@ -102,7 +93,11 @@ <%= render :partial => "paging_nav", :locals => { :type => "relation", :pages => @relation_pages } %> <% end %> @@ -111,29 +106,39 @@ <%= render :partial => "paging_nav", :locals => { :type => "node", :pages => @node_pages } %> <% end %> +
    + <%= link_to(t(".changesetxml"), :controller => "api/changesets", :action => "show") %> + · + <%= link_to(t(".osmchangexml"), :controller => "api/changesets", :action => "download") %> +
    + <% if @next_by_user || @prev_by_user %>
    <% if @prev_by_user %> - <%= link_to "<< #{@prev_by_user.id}", :id => @prev_by_user.id %> + <%= link_to({ :id => @prev_by_user.id }, :class => "icon-link") do %> + <%= previous_page_svg_tag :height => 11 %> + <%= @prev_by_user.id %> + <% end %> · <% end %> <%= user = (@prev_by_user || @next_by_user).user.display_name link_to tag.bdi(user), :controller => "changesets", :action => "index", :display_name => user %> <% if @next_by_user %> · - <%= link_to "#{@next_by_user.id} >>", :id => @next_by_user.id %> + <%= link_to({ :id => @next_by_user.id }, :class => "icon-link") do %> + <%= @next_by_user.id %> + <%= next_page_svg_tag :height => 11 %> + <% end %> <% end %>
    <% end %> - -
    - <%= link_to(t(".changesetxml"), :controller => "api/changesets", :action => "show") %> - · - <%= link_to(t(".osmchangexml"), :controller => "api/changesets", :action => "download") %> -
    diff --git a/app/views/browse/feature.html.erb b/app/views/browse/feature.html.erb index 86b9020a2..cd333d3bf 100644 --- a/app/views/browse/feature.html.erb +++ b/app/views/browse/feature.html.erb @@ -1,13 +1,28 @@ -<% set_title(t("browse.#{@type}.title_html", :name => printable_name(@feature))) %> +<% set_title(t("browse.#{@type}.title_html", :name => printable_element_name(@feature))) %> -<%= render "sidebar_header", :title => t("browse.#{@type}.title_html", :name => printable_name(@feature)) %> +<%= render "sidebar_header", :title => t("browse.#{@type}.title_html", :name => printable_element_name(@feature)) %> <%= render :partial => @type, :object => @feature %> -
    - <% if @feature.visible? %> +<% if @feature.visible? %> +
    <%= link_to(t("browse.download_xml"), :controller => "api/#{@type.pluralize}", :action => :show) %> +
    +<% end %> +
    + <% if @feature.version > 1 %> + <%= link_to({ :controller => "old_#{@type.pluralize}", :action => :show, :version => 1 }, :class => "icon-link") do %> + <%= previous_page_svg_tag :height => 11, :count => 2 %> + <%= "#{t('browse.version')} #1" %> + <% end %> + · + <% end %> + <%= link_to t("browse.view_history"), :action => "#{@type}_history" %> + <% if @feature.version > 1 %> · + <%= link_to({ :controller => "old_#{@type.pluralize}", :action => :show, :version => @feature.version }, :class => "icon-link") do %> + <%= "#{t('browse.version')} ##{@feature.version}" %> + <%= next_page_svg_tag :height => 11, :count => 2 %> + <% end %> <% end %> - <%= link_to(t("browse.view_history"), :action => "#{@type}_history") %>
    diff --git a/app/views/browse/history.html.erb b/app/views/browse/history.html.erb index ebf8bcb30..bf11e8f1e 100644 --- a/app/views/browse/history.html.erb +++ b/app/views/browse/history.html.erb @@ -1,8 +1,8 @@ -<% set_title(t("browse.#{@type}.history_title_html", :name => printable_name(@feature))) %> +<% set_title(t("browse.#{@type}.history_title_html", :name => printable_element_name(@feature))) %> -<%= render "sidebar_header", :title => t("browse.#{@type}.history_title_html", :name => printable_name(@feature)) %> +<%= render "sidebar_header", :title => t("browse.#{@type}.history_title_html", :name => printable_element_name(@feature)) %> -<%= render :partial => @type, :collection => @feature.send("old_#{@type}s").reverse %> +<%= render :partial => @type, :collection => @feature.send(:"old_#{@type}s").reverse %>
    <%= link_to(t("browse.download_xml"), :controller => "api/old_#{@type.pluralize}", :action => "history") %> diff --git a/app/views/changesets/_heading.html.erb b/app/views/changesets/_heading.html.erb new file mode 100644 index 000000000..33bc71696 --- /dev/null +++ b/app/views/changesets/_heading.html.erb @@ -0,0 +1,15 @@ +<% title = changeset.tags["comment"].to_s.presence || t(".title", :id => changeset.id) -%> +
    +
    +
    + <%= user_thumbnail changeset.user %> +
    +
    +

    <%= link_to title, changeset_path(changeset) %>

    +
    +
    + + + <%= t(".created_by_html", :link_user => link_to(changeset.user.display_name, user_path(changeset.user)), :created => l(changeset.created_at, :format => :blog)) %> + +
    diff --git a/app/views/changesets/index.atom.builder b/app/views/changesets/index.atom.builder index a1af72b91..521dffe5f 100644 --- a/app/views/changesets/index.atom.builder +++ b/app/views/changesets/index.atom.builder @@ -25,9 +25,9 @@ atom_feed(:language => I18n.locale, :schema_date => 2009, :type => "application/osmChange+xml" if !changeset.tags.empty? && changeset.tags.key?("comment") - entry.title t("browse.changeset.feed.title_comment", :id => changeset.id, :comment => changeset.tags["comment"]), :type => "html" + entry.title t(".feed.title_comment", :id => changeset.id, :comment => changeset.tags["comment"]) else - entry.title t("browse.changeset.feed.title", :id => changeset.id) + entry.title t(".feed.title", :id => changeset.id) end if changeset.user.data_public? diff --git a/app/views/changesets/no_such_entry.html.erb b/app/views/changesets/no_such_entry.html.erb new file mode 100644 index 000000000..da7d18524 --- /dev/null +++ b/app/views/changesets/no_such_entry.html.erb @@ -0,0 +1,5 @@ +<% content_for :heading do %> +

    <%= t ".heading", :id => h(params[:id]) %>

    +<% end %> + +

    <%= t ".body", :id => h(params[:id]) %>

    diff --git a/app/views/changesets/subscribe.html.erb b/app/views/changesets/subscribe.html.erb new file mode 100644 index 000000000..6a65e5fec --- /dev/null +++ b/app/views/changesets/subscribe.html.erb @@ -0,0 +1,12 @@ +<% content_for :heading do %> +

    <%= t ".heading" %>

    +<% end %> + +<%= render :partial => "heading", :object => @changeset, :as => "changeset" %> + +<%= bootstrap_form_tag do |f| %> + <% if params[:referer] -%> + <%= f.hidden_field :referer, :value => params[:referer] %> + <% end -%> + <%= f.primary t(".button") %> +<% end %> diff --git a/app/views/changesets/unsubscribe.html.erb b/app/views/changesets/unsubscribe.html.erb new file mode 100644 index 000000000..6a65e5fec --- /dev/null +++ b/app/views/changesets/unsubscribe.html.erb @@ -0,0 +1,12 @@ +<% content_for :heading do %> +

    <%= t ".heading" %>

    +<% end %> + +<%= render :partial => "heading", :object => @changeset, :as => "changeset" %> + +<%= bootstrap_form_tag do |f| %> + <% if params[:referer] -%> + <%= f.hidden_field :referer, :value => params[:referer] %> + <% end -%> + <%= f.primary t(".button") %> +<% end %> diff --git a/app/views/diary_entries/_diary_comment.html.erb b/app/views/diary_entries/_diary_comment.html.erb index 238f4d43c..04e011574 100644 --- a/app/views/diary_entries/_diary_comment.html.erb +++ b/app/views/diary_entries/_diary_comment.html.erb @@ -1,5 +1,5 @@ -
    "> -
    +
    "> +
    <%= user_thumbnail diary_comment.user %>
    diff --git a/app/views/diary_entries/_diary_entry.html.erb b/app/views/diary_entries/_diary_entry.html.erb index f69c7e552..8bd4dc57f 100644 --- a/app/views/diary_entries/_diary_entry.html.erb +++ b/app/views/diary_entries/_diary_entry.html.erb @@ -1,26 +1,5 @@
    -
    - <% if @user %> -

    <%= link_to diary_entry.title, diary_entry_path(diary_entry.user, diary_entry) %>

    - <% else %> -
    -
    - <%= user_thumbnail diary_entry.user %> -
    -
    -

    <%= link_to diary_entry.title, diary_entry_path(diary_entry.user, diary_entry) %>

    -
    -
    - <% end %> - - - <%= t(".posted_by_html", :link_user => (link_to diary_entry.user.display_name, user_path(diary_entry.user)), :created => l(diary_entry.created_at, :format => :blog), :language_link => (link_to diary_entry.language.name, :controller => "diary_entries", :action => "index", :display_name => nil, :language => diary_entry.language_code)) %> - <% if (l(diary_entry.updated_at, :format => :blog) != l(diary_entry.created_at, :format => :blog)) %> - <%= t(".updated_at_html", :updated => l(diary_entry.updated_at, :format => :blog)) %> - <% end %> - - -
    + <%= render :partial => "diary_entry_heading", :object => diary_entry, :as => "diary_entry" %>
    <%= diary_entry.body.to_html %> diff --git a/app/views/diary_entries/_diary_entry_heading.html.erb b/app/views/diary_entries/_diary_entry_heading.html.erb new file mode 100644 index 000000000..ef924ffdd --- /dev/null +++ b/app/views/diary_entries/_diary_entry_heading.html.erb @@ -0,0 +1,21 @@ +
    + <% if @user %> +

    <%= link_to diary_entry.title, diary_entry_path(diary_entry.user, diary_entry) %>

    + <% else %> +
    +
    + <%= user_thumbnail diary_entry.user %> +
    +
    +

    <%= link_to diary_entry.title, diary_entry_path(diary_entry.user, diary_entry) %>

    +
    +
    + <% end %> + + + <%= t("diary_entries.diary_entry.posted_by_html", :link_user => (link_to diary_entry.user.display_name, user_path(diary_entry.user)), :created => l(diary_entry.created_at, :format => :blog), :language_link => (link_to diary_entry.language.name, :controller => "diary_entries", :action => "index", :display_name => nil, :language => diary_entry.language_code)) %> + <% if (l(diary_entry.updated_at, :format => :blog) != l(diary_entry.created_at, :format => :blog)) %> + <%= t("diary_entries.diary_entry.updated_at_html", :updated => l(diary_entry.updated_at, :format => :blog)) %> + <% end %> + +
    diff --git a/app/views/diary_entries/index.html.erb b/app/views/diary_entries/index.html.erb index e464b99b4..78ac0dcf8 100644 --- a/app/views/diary_entries/index.html.erb +++ b/app/views/diary_entries/index.html.erb @@ -14,15 +14,19 @@
      <% unless params[:friends] or params[:nearby] -%>
    • <%= rss_link_to :action => "rss", :language => params[:language] %>
    • - <% end -%> + <% end -%> - <% if @user && @user == current_user || !@user && current_user %> -
    • <%= link_to image_tag("new.png", :class => "small_icon") + t(".new"), new_diary_entry_path, :title => t(".new_title") %>
    • - <% end %> + <% @languages&.each do |language| %> +
    • <%= link_to t(".in_language_title", :language => language.name), :action => "index", :language => language.code %>
    • + <% end %> - <% if !@user && current_user %> -
    • <%= link_to t(".my_diary"), :controller => "diary_entries", :action => "index", :display_name => current_user.display_name %>
    • - <% end %> + <% if !@user && current_user %> +
    • <%= link_to t(".my_diary"), :controller => "diary_entries", :action => "index", :display_name => current_user.display_name %>
    • + <% end %> + + <% if @user && @user == current_user || !@user && current_user %> +
    • <%= link_to image_tag("new.png", :class => "small_icon") + t(".new"), new_diary_entry_path, :title => t(".new_title") %>
    • + <% end %>
    diff --git a/app/views/diary_entries/show.html.erb b/app/views/diary_entries/show.html.erb index 5bfdfa17b..63ab89b8f 100644 --- a/app/views/diary_entries/show.html.erb +++ b/app/views/diary_entries/show.html.erb @@ -12,11 +12,23 @@ <%= render @entry %> -
    -<%= render :partial => "diary_comment", :collection => @comments %> -
    +
    +
    +

    <%= t(".discussion") %>

    -
    + <% if current_user %> +
    + <% if @entry.subscribers.exists?(current_user.id) %> + <%= link_to t("javascripts.changesets.show.unsubscribe"), diary_entry_unsubscribe_path(:display_name => @entry.user.display_name, :id => @entry.id), :method => :post, :class => "btn btn-sm btn-primary" %> + <% else %> + <%= link_to t("javascripts.changesets.show.subscribe"), diary_entry_subscribe_path(:display_name => @entry.user.display_name, :id => @entry.id), :method => :post, :class => "btn btn-sm btn-primary" %> + <% end %> +
    + <% end %> +
    + + <%= render :partial => "diary_comment", :collection => @comments %> +
    <% if current_user %> @@ -25,11 +37,6 @@ <%= bootstrap_form_for @entry.comments.new, :url => { :action => "comment" } do |f| %> <%= f.richtext_field :body, :cols => 80, :rows => 20, :hide_label => true %> <%= f.primary %> - <% if @entry.subscribers.exists?(current_user.id) %> - <%= link_to t("javascripts.changesets.show.unsubscribe"), diary_entry_unsubscribe_path(:display_name => @entry.user.display_name, :id => @entry.id), :method => :post, :class => "btn btn-light" %> - <% else %> - <%= link_to t("javascripts.changesets.show.subscribe"), diary_entry_subscribe_path(:display_name => @entry.user.display_name, :id => @entry.id), :method => :post, :class => "btn btn-light" %> - <% end %> <% end %> <% else %>

    <%= t(".login_to_leave_a_comment_html", :login_link => link_to(t(".login"), login_path(:referer => request.fullpath))) %>

    diff --git a/app/views/diary_entries/subscribe.html.erb b/app/views/diary_entries/subscribe.html.erb new file mode 100644 index 000000000..e18be2b6d --- /dev/null +++ b/app/views/diary_entries/subscribe.html.erb @@ -0,0 +1,12 @@ +<% content_for :heading do %> +

    <%= t ".heading", :user => @diary_entry.user.display_name %>

    +<% end %> + +<%= render :partial => "diary_entry_heading", :object => @diary_entry, :as => "diary_entry" %> + +<%= bootstrap_form_tag do |f| %> + <% if params[:referer] -%> + <%= f.hidden_field :referer, :value => params[:referer] %> + <% end -%> + <%= f.primary t(".button") %> +<% end %> diff --git a/app/views/diary_entries/unsubscribe.html.erb b/app/views/diary_entries/unsubscribe.html.erb new file mode 100644 index 000000000..e18be2b6d --- /dev/null +++ b/app/views/diary_entries/unsubscribe.html.erb @@ -0,0 +1,12 @@ +<% content_for :heading do %> +

    <%= t ".heading", :user => @diary_entry.user.display_name %>

    +<% end %> + +<%= render :partial => "diary_entry_heading", :object => @diary_entry, :as => "diary_entry" %> + +<%= bootstrap_form_tag do |f| %> + <% if params[:referer] -%> + <%= f.hidden_field :referer, :value => params[:referer] %> + <% end -%> + <%= f.primary t(".button") %> +<% end %> diff --git a/app/views/issues/_comments.html.erb b/app/views/issues/_comments.html.erb index 9c5695e0a..7776d9ee3 100644 --- a/app/views/issues/_comments.html.erb +++ b/app/views/issues/_comments.html.erb @@ -7,7 +7,8 @@

    <%= t ".comment_from_html", :user_link => link_to(comment.user.display_name, user_path(comment.user)), - :comment_created_at => l(comment.created_at.to_datetime, :format => :friendly) %> + :comment_created_at => tag.time(l(comment.created_at.to_datetime, :format => :friendly), + :datetime => comment.created_at.xmlschema) %>

    <%= comment.body.to_html %>
    diff --git a/app/views/issues/_reports.html.erb b/app/views/issues/_reports.html.erb index d11bca0a9..9ef28f1c2 100644 --- a/app/views/issues/_reports.html.erb +++ b/app/views/issues/_reports.html.erb @@ -7,7 +7,8 @@

    <%= t ".reported_by_html", :category => report.category, :user => link_to(report.user.display_name, user_path(report.user)), - :updated_at => l(report.updated_at.to_datetime, :format => :friendly) %> + :updated_at => tag.time(l(report.updated_at.to_datetime, :format => :friendly), + :datetime => report.updated_at.xmlschema) %>

    <%= report.details.to_html %>
    diff --git a/app/views/issues/show.html.erb b/app/views/issues/show.html.erb index 62bd501b7..e2099f8e6 100644 --- a/app/views/issues/show.html.erb +++ b/app/views/issues/show.html.erb @@ -9,9 +9,20 @@ <% else %> | <%= t ".no_reports" %> <% end %> - | <%= t ".report_created_at", :datetime => l(@issue.created_at.to_datetime, :format => :friendly) %> - <%= " | #{t('.last_resolved_at', :datetime => l(@issue.resolved_at.to_datetime, :format => :friendly))}" if @issue.resolved_at? %> - <%= " | #{t('.last_updated_at', :datetime => l(@issue.updated_at.to_datetime, :format => :friendly), :displayname => @issue.user_updated.display_name)}" if @issue.user_updated %> + | <%= t ".report_created_at_html", + :datetime => tag.time(l(@issue.created_at.to_datetime, :format => :friendly), + :datetime => @issue.created_at.xmlschema) %> + <% if @issue.resolved_at? %> + | <%= t ".last_resolved_at_html", + :datetime => tag.time(l(@issue.resolved_at.to_datetime, :format => :friendly), + :datetime => @issue.resolved_at.xmlschema) %> + <% end %> + <% if @issue.user_updated %> + | <%= t ".last_updated_at_html", + :datetime => tag.time(l(@issue.updated_at.to_datetime, :format => :friendly), + :datetime => @issue.updated_at.xmlschema), + :displayname => link_to(@issue.user_updated.display_name, user_path(@issue.user_updated)) %> + <% end %>