diff --git a/.circleci/config.yml b/.circleci/config.yml index efdddc876..e0790427d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,7 +5,7 @@ orbs: jobs: checkout_code: docker: - - image: cimg/ruby:2.7 + - image: cimg/ruby:3.2 working_directory: ~/app steps: - restore_cache: @@ -25,7 +25,7 @@ jobs: - app/**/* bundle: docker: - - image: cimg/ruby:2.7-browsers + - image: cimg/ruby:3.2-browsers environment: BUNDLE_PATH: vendor/bundle working_directory: ~/app @@ -35,6 +35,10 @@ jobs: - run: name: Update Debian Packages for ClamAV command: | + # Temporary fix for Google Bundle + wget -O - "https://dl.google.com/linux/linux_signing_key.pub" | sudo gpg --dearmor -o /etc/apt/keyrings/google-chrome.gpg + echo 'c1db534ce40334b793cdbecba6459ddd21ebccbdef24dc603d6b0debcfb8f746 /etc/apt/keyrings/google-chrome.gpg' + echo 'deb [arch=amd64 signed-by=/etc/apt/keyrings/google-chrome.gpg] https://dl.google.com/linux/chrome/deb/ stable main' | sudo tee /etc/apt/sources.list.d/google-chrome.list > /dev/null sudo apt-get update && sudo apt-get install -y software-properties-common build-essential make apt-utils - restore_cache: @@ -59,7 +63,7 @@ jobs: - app/**/* lint: docker: - - image: cimg/ruby:2.7-browsers + - image: cimg/ruby:3.2-browsers environment: BUNDLE_PATH: vendor/bundle working_directory: ~/app @@ -72,11 +76,12 @@ jobs: - run: bundle exec rubocop test: docker: - - image: cimg/ruby:2.7-browsers + - image: cimg/ruby:3.2-browsers environment: BUNDLE_PATH: vendor/bundle CAPYBARA_APP_HOST: http://test:3001 FEDORA_URL: http://localhost:8080/fcrepo/rest + IIIF_SERVER_BASE_URL: http://localhost:8080/iiif HONEYCOMB_DATASET: od2-rails-test HONEYCOMB_DEBUG: "true" HONEYCOMB_WRITEKEY: buzzzzzzzzzzzzzzzz @@ -115,6 +120,10 @@ jobs: - run: name: Update Debian Packages command: | + # Temporary fix for Google Bundle + wget -O - "https://dl.google.com/linux/linux_signing_key.pub" | sudo gpg --dearmor -o /etc/apt/keyrings/google-chrome.gpg + echo 'c1db534ce40334b793cdbecba6459ddd21ebccbdef24dc603d6b0debcfb8f746 /etc/apt/keyrings/google-chrome.gpg' + echo 'deb [arch=amd64 signed-by=/etc/apt/keyrings/google-chrome.gpg] https://dl.google.com/linux/chrome/deb/ stable main' | sudo tee /etc/apt/sources.list.d/google-chrome.list > /dev/null sudo apt-get update -qq sudo apt-get upgrade -qq sudo apt-get install -y -f software-properties-common build-essential nodejs make apt-utils ffmpeg tesseract-ocr poppler-utils @@ -230,28 +239,28 @@ jobs: - docker/check: registry: registry.library.oregonstate.edu - docker/pull: - images: registry.library.oregonstate.edu/od2_web_cache:latest + images: registry.library.oregonstate.edu/od2_web_v4_cache:latest ignore-docker-pull-error: true - docker/build: registry: registry.library.oregonstate.edu - image: od2_web + image: od2_web_v4 tag: $TAG extra_build_args: --build-arg RAILS_ENV=$RAILS_ENV --build-arg FEDORA_URL=$FEDORA_URL --build-arg DEPLOYED_VERSION=$DEPLOYED_VERSION - cache_from: registry.library.oregonstate.edu/od2_web_cache:latest + cache_from: registry.library.oregonstate.edu/od2_web_v4_cache:latest - docker/push: registry: registry.library.oregonstate.edu - image: od2_web + image: od2_web_v4 tag: $TAG - docker/build: registry: registry.library.oregonstate.edu - image: od2_web_cache + image: od2_web_v4_cache tag: "latest" extra_build_args: --target gems - cache_from: registry.library.oregonstate.edu/od2_web_cache:latest + cache_from: registry.library.oregonstate.edu/od2_web_v4_cache:latest step-name: "Rebuild cache image" - docker/push: registry: registry.library.oregonstate.edu - image: od2_web_cache + image: od2_web_v4_cache tag: latest step-name: "Push cache image" workflows: @@ -269,7 +278,9 @@ workflows: - lint filters: branches: - ignore: master + ignore: + - master + - feature/hyrax-4 - build_and_push_beavernetes: name: Build and push application image to Beavernetes image repository requires: @@ -281,5 +292,6 @@ workflows: - master - /infra\/.*/ - /staging\/.*/ - repo: od2_web + - feature/hyrax-4 + repo: od2_web_v4 environment: production diff --git a/.rubocop.yml b/.rubocop.yml index be886c7f5..7e0a7bf5b 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -19,6 +19,8 @@ AllCops: - 'app/parsers/bulkrax/bagit_complex_parser.rb' - 'app/views/bulkrax/**/*' - 'app/parsers/bulkrax/parser_export_record_set.rb' + - 'app/jobs/bulkrax/export_work_job.rb' + - 'spec/controllers/hyrax/homepage_controller_spec.rb' Metrics/BlockLength: ExcludedMethods: ['included'] @@ -43,6 +45,9 @@ Style/CollectionMethods: Style/ClassAndModuleChildren: Enabled: false +Layout/BlockAlignment: + Enabled: false + Style/SingleLineBlockParams: Enabled: false @@ -124,6 +129,9 @@ Lint/StructNewOverride: Style/ExponentialNotation: Enabled: false +RSpec/VerifiedDoubles: + Enabled: false + Style/HashEachMethods: Enabled: false diff --git a/Dockerfile b/Dockerfile index 947bc38d8..048b021e6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,12 @@ -FROM ruby:2.7-alpine3.15 as bundler +FROM ruby:3.2.1-alpine3.16 AS bundler # Necessary for bundler to operate properly ENV LANG C.UTF-8 ENV LC_ALL C.UTF-8 -RUN gem install bundler -v '2.3.26' +RUN gem install bundler -v '2.6.8' -FROM bundler as dependencies +FROM bundler AS dependencies # The alpine way RUN apk --no-cache update && apk --no-cache upgrade && \ @@ -56,9 +56,9 @@ ARG UID=8083 ARG GID=8083 # Create an app user so our program doesn't run as root. -RUN addgroup -g "$GID" app && adduser -h /data -u "$UID" -G app -D -H app +RUN addgroup -g 8083 app && adduser -h /data -u 8083 -G app -D -H app -FROM dependencies as gems +FROM dependencies AS gems # Make sure the new user has complete control over all code, including # bundler's installed assets @@ -76,7 +76,7 @@ COPY --chown=app:app build/install_gems.sh /data/build USER app RUN /data/build/install_gems.sh -FROM gems as code +FROM gems AS code # Add the rest of the code COPY --chown=app:app . /data @@ -92,14 +92,14 @@ FROM code USER root RUN apk --no-cache update && apk del autoconf automake gcc g++ --purge && \ rm -rf /data/docker-compose.override.yml-example /data/README.md \ - /data/.env.example /data/config/nginx /data/config/solr + /data/.env.example /data/config/nginx /data/config/solr USER app ENV DEPLOYED_VERSION=${DEPLOYED_VERSION} RUN if [ "${RAILS_ENV}" = "production" ]; then \ - echo "Precompiling assets with $RAILS_ENV environment"; \ - rm -rf /data/.cache; \ - RAILS_ENV=$RAILS_ENV SECRET_KEY_BASE=temporary bundle exec rails assets:precompile; \ - for f in public/assets/4*.html; do cp $f public/${f:14:3}.html; done; \ + echo "Precompiling assets with $RAILS_ENV environment"; \ + rm -rf /data/.cache; \ + RAILS_ENV=$RAILS_ENV SECRET_KEY_BASE=temporary bundle exec rails assets:precompile; \ + for f in public/assets/4*.html; do cp $f public/${f:14:3}.html; done; \ fi diff --git a/Gemfile b/Gemfile index 50dcb3206..0eff491ae 100644 --- a/Gemfile +++ b/Gemfile @@ -8,7 +8,7 @@ end # TODO: make this a version specification once we get a new release cut # gem 'hydra-derivatives', git: 'https://github.com/samvera/hydra-derivatives.git' -gem "blacklight_range_limit", "~> 6" +gem "blacklight_range_limit", "~> 7.0" gem 'browse-everything' # coffee-rails is a requirement for Hyrax or one of its dependencies but hasn't # been added to either gemspecs @@ -18,38 +18,43 @@ gem 'dalli', '~> 3.2.3' gem 'devise' gem "edtf", "~> 3.0" gem 'hydra-role-management' -gem 'hyrax', '3.6.0' -gem 'hyrax-migrator', github: 'OregonDigital/hyrax-migrator', branch: 'master' +gem 'hyrax', '~> 4.0' +# gem 'hyrax-migrator', github: 'OregonDigital/hyrax-migrator', branch: 'master' gem 'jquery-rails' gem 'sassc-rails' gem 'chosen-rails' gem 'pg' -gem 'puma', '~> 5.6' -gem 'rails', '~> 5.2' -gem 'rsolr', '>= 1.0' -gem 'sass-rails', '~> 5.0' -gem 'sidekiq', '~> 6.4' +gem 'puma', '~> 4.3.8' +gem 'rails', '~> 6.0.6' +gem 'rsolr', '>= 1.0', '< 3' +gem 'sidekiq', '~> 6.0' +gem 'sprockets', '3.7.2' gem 'streamio-ffmpeg' gem 'stemmify' gem 'tzinfo-data' gem 'uglifier', '>= 1.3.0' gem 'ruby-oembed' -gem 'blacklight_advanced_search', '~> 6.4' +gem 'bootstrap', '~> 4.0' +gem 'twitter-typeahead-rails', '0.11.1.pre.corejavascript' +gem 'blacklight_advanced_search' gem 'blacklight-oembed' gem 'blacklight_dynamic_sitemap' gem 'triplestore-adapter', git: 'https://github.com/osulp/triplestore-adapter' -gem 'faraday_middleware', '~> 0.10.0' -gem 'blacklight_iiif_search', '~> 1.0' +gem 'faraday_middleware' +gem 'blacklight_iiif_search', '~> 2.0' gem 'rubyzip', '~> 2' gem 'zip_tricks', '~> 5.3' gem 'bulkrax', github: 'samvera/bulkrax', ref: '62517e67876d96c7a0bedb288370a4f10eb0b4c4' #v8.2.0 -gem 'willow_sword', github: 'notch8/willow_sword' +# gem 'willow_sword', github: 'notch8/willow_sword', branch: 'main' +gem 'jquery-datatables-rails' +gem 'concurrent-ruby', '1.3.4' # Security Audit updates gem 'loofah', '>= 2.2.3' # Login gems -gem 'omniauth-rails_csrf_protection', '~> 0.1' +gem 'omniauth' +gem 'omniauth-rails_csrf_protection', '~> 1.0' gem 'omniauth-cas' gem 'omniauth-saml' @@ -78,23 +83,23 @@ end group :development, :test do gem 'axe-matchers' gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] - gem 'capybara', '~> 2.17' + gem 'capybara', '~> 3.29' gem 'factory_bot_rails' gem 'poltergeist' gem 'pry-byebug' gem 'pry-rails' - gem 'rspec-rails' + gem 'rspec-rails', '~> 5.0' gem 'rubocop', '~> 0.93' gem 'rubocop-rspec' - gem 'selenium-webdriver', '~> 3' + gem 'selenium-webdriver', '~> 4.4' gem 'webmock' + gem 'rails-controller-testing' end group :test do gem 'coveralls', '~> 0.8' gem 'database_cleaner', '~> 1.8' gem 'equivalent-xml' - gem 'rails-controller-testing' gem 'rspec' gem 'rspec-mocks' gem 'rspec-activemodel-mocks' diff --git a/Gemfile.lock b/Gemfile.lock index ccecc0985..2927568e2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,28 +1,3 @@ -GIT - remote: https://github.com/OregonDigital/hyrax-migrator.git - revision: 87173608ae1def27fe9f97bc46e10cd4f72c6a3a - branch: master - specs: - hyrax-migrator (0.1.0) - aasm - actionview (>= 5.2, < 7.0) - aws-sdk-s3 - bagit - haml - rails (~> 5.2) - rdf - rubyzip - sidekiq - -GIT - remote: https://github.com/notch8/willow_sword.git - revision: 74f7684ff9ca96251f341e50a3afc34b5bd312cc - specs: - willow_sword (0.2.0) - bagit (~> 0.4.1) - rails (>= 5.1.6) - rubyzip (>= 1.0.0) - GIT remote: https://github.com/osulp/triplestore-adapter revision: 30081b1ff8beb169c88dd338f71ecb0e1bad8a73 @@ -60,37 +35,48 @@ GIT GEM remote: https://rubygems.org/ specs: - aasm (5.5.0) - concurrent-ruby (~> 1.0) - actioncable (5.2.8.1) - actionpack (= 5.2.8.1) + actioncable (6.0.6.1) + actionpack (= 6.0.6.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) - actionmailer (5.2.8.1) - actionpack (= 5.2.8.1) - actionview (= 5.2.8.1) - activejob (= 5.2.8.1) + actionmailbox (6.0.6.1) + actionpack (= 6.0.6.1) + activejob (= 6.0.6.1) + activerecord (= 6.0.6.1) + activestorage (= 6.0.6.1) + activesupport (= 6.0.6.1) + mail (>= 2.7.1) + actionmailer (6.0.6.1) + actionpack (= 6.0.6.1) + actionview (= 6.0.6.1) + activejob (= 6.0.6.1) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (5.2.8.1) - actionview (= 5.2.8.1) - activesupport (= 5.2.8.1) + actionpack (6.0.6.1) + actionview (= 6.0.6.1) + activesupport (= 6.0.6.1) rack (~> 2.0, >= 2.0.8) rack-test (>= 0.6.3) rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.2.8.1) - activesupport (= 5.2.8.1) + rails-html-sanitizer (~> 1.0, >= 1.2.0) + actiontext (6.0.6.1) + actionpack (= 6.0.6.1) + activerecord (= 6.0.6.1) + activestorage (= 6.0.6.1) + activesupport (= 6.0.6.1) + nokogiri (>= 1.8.5) + actionview (6.0.6.1) + activesupport (= 6.0.6.1) builder (~> 3.1) erubi (~> 1.4) rails-dom-testing (~> 2.0) - rails-html-sanitizer (~> 1.0, >= 1.0.3) - active-fedora (13.3.0) + rails-html-sanitizer (~> 1.1, >= 1.2.0) + active-fedora (14.0.1) active-triples (>= 0.11.0, < 2.0.0) activemodel (>= 5.1) activesupport (>= 5.1) deprecation - faraday (~> 0.12) + faraday (>= 1.0) faraday-encoding (>= 0.0.5) ldp (>= 0.7.0, < 2) rsolr (>= 1.1.2, < 3) @@ -103,57 +89,57 @@ GEM active_encode (0.8.2) rails sprockets (< 4) - activejob (5.2.8.1) - activesupport (= 5.2.8.1) + activejob (6.0.6.1) + activesupport (= 6.0.6.1) globalid (>= 0.3.6) - activemodel (5.2.8.1) - activesupport (= 5.2.8.1) - activemodel-serializers-xml (1.0.2) - activemodel (> 5.x) - activesupport (> 5.x) + activemodel (6.0.6.1) + activesupport (= 6.0.6.1) + activemodel-serializers-xml (1.0.3) + activemodel (>= 5.0.0.a) + activesupport (>= 5.0.0.a) builder (~> 3.1) - activerecord (5.2.8.1) - activemodel (= 5.2.8.1) - activesupport (= 5.2.8.1) - arel (>= 9.0) - activerecord-import (1.5.0) + activerecord (6.0.6.1) + activemodel (= 6.0.6.1) + activesupport (= 6.0.6.1) + activerecord-import (2.0.0) activerecord (>= 4.2) - activestorage (5.2.8.1) - actionpack (= 5.2.8.1) - activerecord (= 5.2.8.1) - marcel (~> 1.0.0) - activesupport (5.2.8.1) + activestorage (6.0.6.1) + actionpack (= 6.0.6.1) + activejob (= 6.0.6.1) + activerecord (= 6.0.6.1) + marcel (~> 1.0) + activesupport (6.0.6.1) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) tzinfo (~> 1.1) - addressable (2.8.5) - public_suffix (>= 2.0.2, < 6.0) + zeitwerk (~> 2.2, >= 2.2.2) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) almond-rails (0.3.0) rails (>= 4.2) - anyway_config (2.5.3) - ruby-next-core (>= 0.14.0) - arel (9.0.0) + anyway_config (2.6.4) + ruby-next-core (~> 1.0) ast (2.4.2) - autoprefixer-rails (10.4.15.0) + autoprefixer-rails (10.4.19.0) execjs (~> 2) - awesome_nested_set (3.5.0) - activerecord (>= 4.0.0, < 7.1) - aws-eventstream (1.2.0) - aws-partitions (1.831.0) - aws-sdk-core (3.185.0) - aws-eventstream (~> 1, >= 1.0.2) - aws-partitions (~> 1, >= 1.651.0) - aws-sigv4 (~> 1.5) + awesome_nested_set (3.8.0) + activerecord (>= 4.0.0, < 8.1) + aws-eventstream (1.3.0) + aws-partitions (1.1042.0) + aws-sdk-core (3.216.1) + aws-eventstream (~> 1, >= 1.3.0) + aws-partitions (~> 1, >= 1.992.0) + aws-sigv4 (~> 1.9) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.72.0) - aws-sdk-core (~> 3, >= 3.184.0) - aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.136.0) - aws-sdk-core (~> 3, >= 3.181.0) + aws-sdk-kms (1.97.0) + aws-sdk-core (~> 3, >= 3.216.0) + aws-sigv4 (~> 1.5) + aws-sdk-s3 (1.178.0) + aws-sdk-core (~> 3, >= 3.216.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.6) - aws-sigv4 (1.6.0) + aws-sigv4 (~> 1.5) + aws-sigv4 (1.11.0) aws-eventstream (~> 1, >= 1.0.2) axe-matchers (2.6.1) dumb_delegator (~> 0.8) @@ -169,84 +155,83 @@ GEM bagit (0.4.6) docopt (~> 0.5.0) validatable (~> 1.6) - bcp47 (0.3.3) - i18n - bcrypt (3.1.19) + base64 (0.2.0) + bcp47_spec (0.2.1) + bcrypt (3.1.20) + bigdecimal (3.1.9) bindex (0.8.1) - blacklight (6.25.0) - bootstrap-sass (~> 3.2) + blacklight (7.38.0) deprecation globalid + hashdiff + i18n (>= 1.7.0) jbuilder (~> 2.7) kaminari (>= 0.15) - nokogiri (~> 1.6) - rails (>= 4.2, < 6) - rsolr (>= 1.0.6, < 3) - twitter-typeahead-rails (= 0.11.1.pre.corejavascript) - blacklight-access_controls (0.6.2) - blacklight (~> 6.0) - cancancan (~> 1.8) + ostruct (>= 0.3.2) + rails (>= 5.1, < 7.3) + view_component (>= 2.66, < 4) + blacklight-access_controls (6.0.1) + blacklight (> 6.0, < 8) + cancancan (>= 1.8) deprecation (~> 1.0) - blacklight-gallery (0.12.0) - blacklight (~> 6.3) - bootstrap-sass (~> 3.0) - openseadragon (>= 0.2.0) - rails - blacklight-oembed (0.3.0) - blacklight (>= 5.0, < 7) - bootstrap-sass (~> 3.0) + blacklight-gallery (4.0.2) + blacklight (~> 7.17) + rails (>= 5.1, < 8) + blacklight-oembed (1.4.2) + blacklight (>= 7.25, < 9) rails ruby-oembed - blacklight_advanced_search (6.4.1) - blacklight (~> 6.0, >= 6.0.1) + blacklight_advanced_search (7.0.0) + blacklight (~> 7.0) parslet - blacklight_dynamic_sitemap (0.6.0) - blacklight (> 6.0) + blacklight_dynamic_sitemap (1.0.0) + blacklight (> 7.0) rails - blacklight_iiif_search (1.0.0) - blacklight (~> 6.0) + blacklight_iiif_search (2.1.0) + blacklight (~> 7.0) + ffi (~> 1.16.3) iiif-presentation - rails (>= 4.2, < 6) - blacklight_oai_provider (6.1.1) - blacklight (~> 6.0) - oai (~> 1.0) - blacklight_range_limit (6.5.0) - blacklight (~> 6.10) - jquery-rails - rails (>= 4.2, < 6) - bootstrap-sass (3.4.1) - autoprefixer-rails (>= 5.2.1) - sassc (>= 2.0.0) - bootstrap_form (5.1.0) - actionpack (>= 5.2) - activemodel (>= 5.2) + rails (>= 6, < 7.3) + blacklight_oai_provider (7.0.2) + blacklight (~> 7.0) + oai (~> 1.2) + rexml + blacklight_range_limit (7.9.1) + blacklight (~> 7.0) + bootstrap (4.6.2.1) + autoprefixer-rails (>= 9.1.0) + popper_js (>= 1.16.1, < 2) + bootstrap_form (5.2.3) + actionpack (>= 6.0) + activemodel (>= 6.0) breadcrumbs_on_rails (3.0.1) - browse-everything (1.2.0) + browse-everything (1.5.0) addressable (~> 2.5) aws-sdk-s3 dropbox_api (>= 0.1.20) google-apis-drive_v3 googleauth (>= 0.6.6, < 2.0) - rails (>= 4.2, < 7.1) + rails (>= 4.2, < 8.1) ruby-box signet (~> 0.8) typhoeus - builder (3.2.4) + builder (3.3.0) byebug (11.1.3) - cancancan (1.17.0) - capybara (2.18.0) + cancancan (3.6.1) + capybara (3.40.0) addressable + matrix mini_mime (>= 0.1.3) - nokogiri (>= 1.3.3) - rack (>= 1.0.0) - rack-test (>= 0.5.4) - xpath (>= 2.0, < 4.0) + nokogiri (~> 1.11) + rack (>= 1.6.0) + rack-test (>= 0.6.3) + regexp_parser (>= 1.5, < 3.0) + xpath (~> 3.2) carrierwave (1.3.4) activemodel (>= 4.0.0) activesupport (>= 4.0.0) mime-types (>= 1.16) ssrf_filter (~> 1.0, < 1.1.0) - childprocess (3.0.0) chosen-rails (1.10.0) coffee-rails (>= 3.2) railties (>= 3.0) @@ -263,8 +248,8 @@ GEM coffee-script-source execjs coffee-script-source (1.12.2) - concurrent-ruby (1.2.2) - connection_pool (2.4.1) + concurrent-ruby (1.3.4) + connection_pool (2.5.0) cookieconsent (0.1.0) coveralls (0.8.23) json (>= 1.8, < 3) @@ -272,39 +257,34 @@ GEM term-ansicolor (~> 1.3) thor (>= 0.19.4, < 2.0) tins (~> 1.6) - crack (0.4.5) + crack (1.0.0) + bigdecimal rexml crass (1.0.6) - dalli (3.2.6) + csv (3.3.2) + dalli (3.2.8) database_cleaner (1.99.0) - date (3.3.4) + date (3.4.1) declarative (0.0.20) - declarative-builder (0.1.0) - declarative-option (< 0.2.0) - declarative-option (0.1.0) denormalize_fields (1.3.0) activerecord (>= 4.1.14, < 8.0.0) deprecation (1.1.0) activesupport descendants_tracker (0.0.4) thread_safe (~> 0.3, >= 0.3.1) - devise (4.9.2) + devise (4.9.4) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 4.1.0) responders warden (~> 1.2.3) - diff-lcs (1.5.0) - disposable (0.4.7) + diff-lcs (1.5.1) + disposable (0.6.3) declarative (>= 0.0.9, < 1.0.0) - declarative-builder (< 0.2.0) - declarative-option (< 0.2.0) - representable (>= 2.4.0, <= 3.1.0) - uber (< 0.2.0) - docile (1.4.0) + representable (>= 3.1.1, < 4) + docile (1.4.1) docopt (0.5.0) - domain_name (0.5.20190701) - unf (>= 0.0.5, < 1.0.0) + domain_name (0.6.20240107) draper (4.0.2) actionpack (>= 5.0) activemodel (>= 5.0) @@ -329,16 +309,15 @@ GEM dry-core (~> 0.4) dry-equalizer (~> 0.2) dry-inflector (0.3.0) - dry-initializer (3.1.1) + dry-initializer (3.2.0) dry-logic (1.3.0) concurrent-ruby (~> 1.0) dry-core (~> 0.9, >= 0.9) zeitwerk (~> 2.6) - dry-matcher (0.9.0) - dry-core (~> 0.4, >= 0.4.8) - dry-monads (1.4.0) + dry-monads (1.5.0) concurrent-ruby (~> 1.0) - dry-core (~> 0.7) + dry-core (~> 0.9, >= 0.9) + zeitwerk (~> 2.6) dry-schema (1.11.3) concurrent-ruby (~> 1.0) dry-configurable (~> 0.16, >= 0.16) @@ -352,11 +331,6 @@ GEM dry-types (~> 1.6) ice_nine (~> 0.11) zeitwerk (~> 2.6) - dry-transaction (0.13.3) - dry-container (>= 0.2.8) - dry-events (>= 0.1.0) - dry-matcher (>= 0.7.0) - dry-monads (>= 0.4.0) dry-types (1.6.1) concurrent-ruby (~> 1.0) dry-container (~> 0.3) @@ -372,178 +346,206 @@ GEM dry-schema (~> 1.11, >= 1.11.0) zeitwerk (~> 2.6) dumb_delegator (0.8.1) - ebnf (2.3.5) + ebnf (2.4.0) htmlentities (~> 4.3) - rdf (~> 3.2) + rdf (~> 3.3) scanf (~> 1.0) - sxp (~> 1.2) + sxp (~> 1.3) unicode-types (~> 1.8) - edtf (3.1.1) - activesupport (>= 3.0, < 8.0) + edtf (3.2.0) + activesupport (>= 3.0, < 9.0) equalizer (0.0.11) equivalent-xml (0.6.0) nokogiri (>= 1.4.3) - erubi (1.12.0) + erubi (1.13.1) ethon (0.16.0) ffi (>= 1.15.0) - excon (0.104.0) - execjs (2.9.1) - factory_bot (6.2.1) + excon (1.2.3) + execjs (2.10.0) + factory_bot (6.5.0) activesupport (>= 5.0.0) - factory_bot_rails (6.2.0) - factory_bot (~> 6.2.0) + factory_bot_rails (6.4.4) + factory_bot (~> 6.5) railties (>= 5.0.0) - faraday (0.17.6) - multipart-post (>= 1.2, < 3) - faraday-encoding (0.0.5) + faraday (1.10.4) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) + faraday-excon (~> 1.1) + faraday-httpclient (~> 1.0) + faraday-multipart (~> 1.0) + faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.0) + faraday-patron (~> 1.0) + faraday-rack (~> 1.0) + faraday-retry (~> 1.0) + ruby2_keywords (>= 0.0.4) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) + faraday-encoding (0.0.6) faraday - faraday_middleware (0.10.1) - faraday (>= 0.7.4, < 1.0) - ffi (1.16.2) - ffi-compiler (1.0.1) - ffi (>= 1.0.0) + faraday-excon (1.1.0) + faraday-follow_redirects (0.3.0) + faraday (>= 1, < 3) + faraday-httpclient (1.0.1) + faraday-multipart (1.1.0) + multipart-post (~> 2.0) + faraday-net_http (1.0.2) + faraday-net_http_persistent (1.2.0) + faraday-patron (1.0.0) + faraday-rack (1.0.0) + faraday-retry (1.0.3) + faraday_middleware (1.2.1) + faraday (~> 1.0) + ffi (1.16.3) + ffi-compiler (1.3.2) + ffi (>= 1.15.5) rake - flipflop (2.7.1) + flipflop (2.8.0) activesupport (>= 4.0) terminal-table (>= 1.8) flot-rails (0.0.7) jquery-rails - font-awesome-rails (4.7.0.8) - railties (>= 3.2, < 8.0) - font-awesome-sass (6.4.2) + font-awesome-rails (4.7.0.9) + railties (>= 3.2, < 9.0) + font-awesome-sass (6.7.2) sassc (~> 2.0) - geocoder (1.8.2) + geocoder (1.8.5) + base64 (>= 0.1.0) + csv (>= 3.0.0) globalid (1.1.0) activesupport (>= 5.0) - google-apis-core (0.11.1) + google-apis-core (0.16.0) addressable (~> 2.5, >= 2.5.1) - googleauth (>= 0.16.2, < 2.a) - httpclient (>= 2.8.1, < 3.a) + googleauth (~> 1.9) + httpclient (>= 2.8.3, < 3.a) mini_mime (~> 1.0) + mutex_m representable (~> 3.0) retriable (>= 2.0, < 4.a) - rexml - webrick - google-apis-drive_v3 (0.44.0) - google-apis-core (>= 0.11.0, < 2.a) - googleauth (1.8.1) - faraday (>= 0.17.3, < 3.a) + google-apis-drive_v3 (0.61.0) + google-apis-core (>= 0.15.0, < 2.a) + google-cloud-env (2.2.1) + faraday (>= 1.0, < 3.a) + google-logging-utils (0.1.0) + googleauth (1.13.0) + faraday (>= 1.0, < 3.a) + google-cloud-env (~> 2.2) + google-logging-utils (~> 0.1) jwt (>= 1.4, < 3.0) multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) - haml (6.2.0) + haml (6.3.0) temple (>= 0.8.2) thor tilt - hashdiff (1.0.1) + hamster (3.0.0) + concurrent-ruby (~> 1.0) + hashdiff (1.1.2) hashie (5.0.0) hiredis (0.6.3) - honeycomb-beeline (3.0.0) - libhoney (>= 1.14.2) + honeycomb-beeline (3.1.0) + libhoney (>= 2.3.0) htmlentities (4.3.4) - http (5.1.1) + http (5.2.0) addressable (~> 2.8) + base64 (~> 0.1) http-cookie (~> 1.0) http-form_data (~> 2.2) - llhttp-ffi (~> 0.4.0) - http-cookie (1.0.5) + llhttp-ffi (~> 0.5.0) + http-cookie (1.0.8) domain_name (~> 0.5) http-form_data (2.3.0) http_logger (0.7.0) httpclient (2.8.3) - hydra-access-controls (11.0.7) + hydra-access-controls (12.1.0) active-fedora (>= 10.0.0) - activesupport (>= 4, < 6) - blacklight (>= 5.16) - blacklight-access_controls (~> 0.6.0) - cancancan (~> 1.8) + activesupport (>= 5.2, < 7.1) + blacklight-access_controls (~> 6.0) + cancancan (>= 1.8, < 4) deprecation (~> 1.0) - hydra-core (11.0.7) - hydra-access-controls (= 11.0.7) - railties (>= 4.0.0, < 6) - hydra-derivatives (3.7.0) - active-fedora (>= 11.5.6, != 13.2.1, != 13.2.0, != 13.1.3, != 13.1.2, != 13.1.1, != 13.1.0, != 13.0.0, != 12.2.1, != 12.2.0, != 12.1.1, != 12.1.0, != 12.0.3, != 12.0.2, != 12.0.1, != 12.0.0) + hydra-core (12.1.0) + hydra-access-controls (= 12.1.0) + railties (>= 5.2, < 7.1) + hydra-derivatives (3.8.0) + active-fedora (>= 14.0) + active-triples (>= 1.2) active_encode (~> 0.1) - activesupport (>= 4.0, < 7) + activesupport (>= 4.0, < 7.1) addressable (~> 2.5) deprecation mime-types (> 2.0, < 4.0) mini_magick (>= 3.2, < 5) - hydra-editor (5.0.5) + hydra-editor (6.3.0) active-fedora (>= 9.0.0) - activerecord (~> 5.0) + activerecord (>= 5.2, < 8.0) almond-rails (~> 0.1) - cancancan (~> 1.8) - rails (>= 5, < 6) - simple_form (>= 4.1.0, < 6.0) - sprockets (~> 3.7) + cancancan + psych (~> 3.3, < 4) + rails (>= 5.2, < 8.0) + simple_form (>= 4.1.0, < 5.2) + sprockets (>= 3.7) sprockets-es6 - hydra-file_characterization (1.1.2) + hydra-file_characterization (1.2.0) activesupport (>= 3.0.0) - hydra-head (11.0.7) - hydra-access-controls (= 11.0.7) - hydra-core (= 11.0.7) - rails (>= 5.2, < 6.1) - hydra-pcdm (1.3.0) - active-fedora (>= 10, < 15) + hydra-head (12.1.0) + hydra-access-controls (= 12.1.0) + hydra-core (= 12.1.0) + rails (>= 5.2, < 7.1) + hydra-pcdm (1.4.0) + active-fedora (>= 10) mime-types (>= 1) rdf-vocab - hydra-role-management (1.1.0) - blacklight + hydra-role-management (1.2.0) + blacklight (< 8) bootstrap_form bundler (>= 1.5) cancancan json (>= 1.8) psych (~> 3.0) - hydra-works (2.1.0) - activesupport (>= 5.2, < 7.1) - hydra-derivatives (~> 3.6) + hydra-works (2.2.0) + activesupport (>= 5.2, < 8.0) + hydra-derivatives (>= 3.6) hydra-file_characterization (~> 1.0) hydra-pcdm (>= 0.9) - hyrax (3.6.0) - active-fedora (~> 13.1, >= 13.1.2) + hyrax (4.0.0) + active-fedora (~> 14.0) almond-rails (~> 0.1) awesome_nested_set (~> 3.1) - blacklight (~> 6.14) - blacklight-gallery (~> 0.7) + blacklight (~> 7.29) + blacklight-gallery (~> 4.0) breadcrumbs_on_rails (~> 3.0) browse-everything (>= 0.16, < 2.0) carrierwave (~> 1.0) clipboard-rails (~> 1.5) + connection_pool (~> 2.4) draper (~> 4.0) dry-equalizer (~> 0.2) dry-events (~> 0.2.0) - dry-monads (< 1.5) + dry-monads (~> 1.5) dry-struct (~> 1.0) - dry-transaction (~> 0.11) dry-validation (~> 1.3) flipflop (~> 2.3) flot-rails (~> 0.0.6) font-awesome-rails (~> 4.2) hydra-derivatives (~> 3.3) - hydra-editor (~> 5.0, >= 5.0.4) - hydra-file_characterization (~> 1.1.2) - hydra-head (~> 11.0, >= 11.0.1) + hydra-editor (~> 6.0) + hydra-file_characterization (~> 1.1) + hydra-head (~> 12.0) hydra-works (>= 0.16) iiif_manifest (>= 0.3, < 2.0) - jquery-datatables-rails (~> 3.4) - jquery-ui-rails (~> 6.0) - json-ld (< 3.2) json-schema - kaminari_route_prefix (~> 0.1.1) legato (~> 0.3) linkeddata mailboxer (~> 0.12) nest (~> 3.1) - noid-rails (~> 3.0.0) + noid-rails (~> 3.0) oauth oauth2 (~> 1.2) + openseadragon posix-spawn - power_converter (~> 0.1, >= 0.1.2) - psych (~> 3.3) qa (~> 5.5, >= 5.5.1) - rails (~> 5.0) + rails (~> 6.0) rails_autolink (~> 1.1) rdf-rdfxml rdf-vocab (~> 3.0) @@ -553,23 +555,24 @@ GEM reform (~> 2.3) reform-rails (~> 0.2.0) retriable (>= 2.9, < 4.0) - samvera-nesting_indexer (~> 2.0) - sass-rails (~> 5.0) + sass-rails (~> 6.0) select2-rails (~> 3.5) signet + sprockets (~> 3.7) tinymce-rails (~> 5.10) - valkyrie (~> 2, >= 2.1.1) - i18n (1.14.1) + valkyrie (~> 3.0.1) + view_component (~> 2.74.1) + i18n (1.14.7) concurrent-ruby (~> 1.0) ice_nine (0.11.2) iiif-presentation (1.1.0) activesupport (>= 3.2.18) faraday (>= 0.9) json - iiif_manifest (1.3.1) + iiif_manifest (1.6.0) activesupport (>= 4) iso8601 (0.9.1) - jbuilder (2.11.5) + jbuilder (2.13.0) actionview (>= 5.0.0) activesupport (>= 5.0.0) jmespath (1.6.2) @@ -582,23 +585,24 @@ GEM rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) - jquery-ui-rails (6.0.1) - railties (>= 3.2.16) - json (2.6.3) - json-canonicalization (0.4.0) - json-ld (3.1.10) + json (2.9.1) + json-canonicalization (1.0.0) + json-ld (3.3.2) htmlentities (~> 4.3) - json-canonicalization (~> 0.2) + json-canonicalization (~> 1.0) link_header (~> 0.0, >= 0.0.8) - multi_json (~> 1.14) - rack (~> 2.0) - rdf (~> 3.1) - json-ld-preloaded (3.1.6) - json-ld (~> 3.1) - rdf (~> 3.1) - json-schema (4.1.1) - addressable (>= 2.8) - jwt (2.7.1) + multi_json (~> 1.15) + rack (>= 2.2, < 4) + rdf (~> 3.3) + rexml (~> 3.2) + json-ld-preloaded (3.3.1) + json-ld (~> 3.3) + rdf (~> 3.3) + json-schema (5.1.1) + addressable (~> 2.8) + bigdecimal (~> 3.1) + jwt (2.10.1) + base64 kaminari (1.2.2) activesupport (>= 4.1.0) kaminari-actionview (= 1.2.2) @@ -611,22 +615,21 @@ GEM activerecord kaminari-core (= 1.2.2) kaminari-core (1.2.2) - kaminari_route_prefix (0.1.1) - kaminari (~> 1.0) language_list (1.2.1) - ld-patch (3.2.2) - ebnf (~> 2.3) - rdf (~> 3.2) - rdf-xsd (~> 3.2) - sparql (~> 3.2) - sxp (~> 1.2) - ldp (1.0.3) + ld-patch (3.3.0) + ebnf (~> 2.4) + rdf (~> 3.3) + rdf-xsd (~> 3.3) + sparql (~> 3.3) + sxp (~> 1.3) + ldp (1.2.1) deprecation - faraday + faraday (>= 1) http_logger - json-ld - rdf (>= 1.1) + json-ld (~> 3.2) + rdf (~> 3.2) rdf-isomorphic + rdf-ldp (>= 2.1) rdf-turtle rdf-vocab (>= 0.8) slop @@ -637,48 +640,48 @@ GEM rdf-vocab (~> 3.0) legato (0.7.0) multi_json - libhoney (2.2.0) + libhoney (2.4.0) addressable (~> 2.0) excon http (>= 2.0, < 6.0) libxml-ruby (3.2.4) link_header (0.0.8) - linkeddata (3.1.6) - equivalent-xml (~> 0.6) - json-ld (~> 3.1, >= 3.1.10) - json-ld-preloaded (~> 3.1, >= 3.1.6) - ld-patch (~> 3.1, >= 3.1.3) - nokogiri (~> 1.12) - rdf (~> 3.1, >= 3.1.15) - rdf-aggregate-repo (~> 3.1) - rdf-isomorphic (~> 3.1, >= 3.1.1) - rdf-json (~> 3.1) - rdf-microdata (~> 3.1, >= 3.1.4) - rdf-n3 (~> 3.1, >= 3.1.2) - rdf-normalize (~> 0.4) - rdf-ordered-repo (~> 3.1, >= 3.1.1) - rdf-rdfa (~> 3.1, >= 3.1.3) - rdf-rdfxml (~> 3.1, >= 3.1.1) - rdf-reasoner (~> 0.7, >= 0.7.2) - rdf-tabular (~> 3.1, >= 3.1.1) - rdf-trig (~> 3.1, >= 3.1.2) - rdf-trix (~> 3.1, >= 3.1.1) - rdf-turtle (~> 3.1, >= 3.1.3) - rdf-vocab (~> 3.1, >= 3.1.14) - rdf-xsd (~> 3.1, >= 3.1.1) - shacl (~> 0.1, >= 0.1.1) - shex (~> 0.6, >= 0.6.4) - sparql (~> 3.1, >= 3.1.8) - sparql-client (~> 3.1, >= 3.1.2) - listen (3.1.5) + linkeddata (3.3.1) + json-ld (~> 3.3) + json-ld-preloaded (~> 3.3) + ld-patch (~> 3.3) + nokogiri (~> 1.15, >= 1.15.4) + rdf (~> 3.2, >= 3.2.1) + rdf-aggregate-repo (~> 3.2) + rdf-hamster-repo (~> 3.3) + rdf-isomorphic (~> 3.3) + rdf-json (~> 3.3) + rdf-microdata (~> 3.3) + rdf-n3 (~> 3.3) + rdf-normalize (~> 0.7) + rdf-ordered-repo (~> 3.3) + rdf-rdfa (~> 3.3) + rdf-rdfxml (~> 3.3) + rdf-reasoner (~> 0.9) + rdf-tabular (~> 3.3) + rdf-trig (~> 3.3) + rdf-trix (~> 3.3) + rdf-turtle (~> 3.3) + rdf-vocab (~> 3.3) + rdf-xsd (~> 3.3) + shacl (~> 0.4) + shex (~> 0.8) + sparql (~> 3.3) + sparql-client (~> 3.3) + yaml-ld (~> 0.0) + listen (3.0.8) rb-fsevent (~> 0.9, >= 0.9.4) rb-inotify (~> 0.9, >= 0.9.7) - ruby_dep (~> 1.2) - llhttp-ffi (0.4.0) + llhttp-ffi (0.5.0) ffi-compiler (~> 1.0) rake (~> 13.0) - logger (1.5.3) - loofah (2.21.3) + logger (1.6.5) + loofah (2.24.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) mail (2.8.1) @@ -689,44 +692,49 @@ GEM mailboxer (0.15.1) carrierwave (>= 0.5.8) rails (>= 5.0.0) - marcel (1.0.2) + marcel (1.0.4) matrix (0.4.2) - method_source (1.0.0) - mime-types (3.5.1) + method_source (1.1.0) + mime-types (3.6.0) + logger mime-types-data (~> 3.2015) - mime-types-data (3.2023.1003) - mini_magick (4.12.0) + mime-types-data (3.2025.0107) + mini_magick (4.13.2) mini_mime (1.1.5) - minitest (5.20.0) + minitest (5.25.4) multi_json (1.15.0) - multi_xml (0.6.0) - multipart-post (2.3.0) + multi_xml (0.7.1) + bigdecimal (~> 3.1) + multipart-post (2.4.1) + mustermann (2.0.2) + ruby2_keywords (~> 0.0.1) + mutex_m (0.3.0) nest (3.2.0) redic - net-http-persistent (4.0.2) + net-http-persistent (4.0.5) connection_pool (~> 2.2) - net-imap (0.3.7) + net-imap (0.5.5) date net-protocol net-pop (0.1.2) net-protocol - net-protocol (0.2.1) + net-protocol (0.2.2) timeout - net-smtp (0.4.0) + net-smtp (0.5.0) net-protocol - nio4r (2.5.9) + nio4r (2.7.4) noid (0.9.0) - noid-rails (3.0.3) - actionpack (>= 5.0.0, < 7) + noid-rails (3.2.0) + actionpack (>= 5.0.0, < 8) noid (~> 0.9) - nokogiri (1.15.4-aarch64-linux) + nokogiri (1.18.2-aarch64-linux-musl) racc (~> 1.4) - nokogiri (1.15.4-x86_64-linux) + nokogiri (1.18.2-x86_64-linux-gnu) racc (~> 1.4) - oai (1.1.0) + oai (1.2.1) builder (>= 3.1.0) - faraday - faraday_middleware + faraday (< 3) + faraday-follow_redirects (>= 0.3.0, < 2) oauth (1.1.0) oauth-tty (~> 1.0, >= 1.0.1) snaky_hash (~> 2.0) @@ -739,73 +747,87 @@ GEM multi_json (~> 1.3) multi_xml (~> 0.5) rack (>= 1.2, < 4) - omniauth (1.9.2) + omniauth (2.1.2) hashie (>= 3.4.6) - rack (>= 1.6.2, < 3) - omniauth-cas (2.0.0) - addressable (~> 2.3) - nokogiri (~> 1.5) - omniauth (~> 1.2) - omniauth-rails_csrf_protection (0.1.2) + rack (>= 2.2.3) + rack-protection + omniauth-cas (3.0.0) + addressable (~> 2.8) + nokogiri (~> 1.12) + omniauth (~> 2.1) + omniauth-rails_csrf_protection (1.0.2) actionpack (>= 4.2) - omniauth (>= 1.3.1) - omniauth-saml (1.10.3) - omniauth (~> 1.3, >= 1.3.2) - ruby-saml (~> 1.9) + omniauth (~> 2.0) + omniauth-saml (2.2.1) + omniauth (~> 2.1) + ruby-saml (~> 1.17) openseadragon (0.6.0) rails (> 3.2.0) orm_adapter (0.5.0) os (1.1.4) - parallel (1.23.0) - parser (3.2.2.3) + ostruct (0.6.1) + parallel (1.26.3) + parser (3.3.7.0) ast (~> 2.4.1) racc parslet (2.0.0) - pg (1.5.4) + pg (1.5.9) poltergeist (1.18.1) capybara (>= 2.1, < 4) cliver (~> 0.3.1) websocket-driver (>= 0.2.0) + popper_js (1.16.1) posix-spawn (0.3.15) - power_converter (0.1.2) - prometheus-client (4.2.1) + prometheus-client (4.2.3) + base64 pry (0.14.2) coderay (~> 1.1) method_source (~> 1.0) pry-byebug (3.10.1) byebug (~> 11.0) pry (>= 0.13, < 0.15) - pry-rails (0.3.9) - pry (>= 0.10.4) + pry-rails (0.3.11) + pry (>= 0.13.0) psych (3.3.4) - public_suffix (5.0.3) - puma (5.6.7) + public_suffix (6.0.1) + puma (4.3.12) nio4r (~> 2.0) - qa (5.10.0) + qa (5.14.0) activerecord-import deprecation faraday (< 3.0, != 2.0.0) geocoder ldpath nokogiri (~> 1.6) - rails (>= 5.0, < 7.1) + rails (>= 5.0, < 8.1) rdf - racc (1.7.1) - rack (2.2.8) - rack-test (2.1.0) + racc (1.8.1) + rack (2.2.10) + rack-linkeddata (3.3.0) + linkeddata (~> 3.3) + rack (>= 2.2, < 4) + rack-rdf (~> 3.3) + rack-protection (2.2.4) + rack + rack-rdf (3.3.0) + rack (>= 2.2, < 4) + rdf (~> 3.3) + rack-test (2.2.0) rack (>= 1.3) - rails (5.2.8.1) - actioncable (= 5.2.8.1) - actionmailer (= 5.2.8.1) - actionpack (= 5.2.8.1) - actionview (= 5.2.8.1) - activejob (= 5.2.8.1) - activemodel (= 5.2.8.1) - activerecord (= 5.2.8.1) - activestorage (= 5.2.8.1) - activesupport (= 5.2.8.1) + rails (6.0.6.1) + actioncable (= 6.0.6.1) + actionmailbox (= 6.0.6.1) + actionmailer (= 6.0.6.1) + actionpack (= 6.0.6.1) + actiontext (= 6.0.6.1) + actionview (= 6.0.6.1) + activejob (= 6.0.6.1) + activemodel (= 6.0.6.1) + activerecord (= 6.0.6.1) + activestorage (= 6.0.6.1) + activesupport (= 6.0.6.1) bundler (>= 1.3.0) - railties (= 5.2.8.1) + railties (= 6.0.6.1) sprockets-rails (>= 2.0.0) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) @@ -815,85 +837,100 @@ GEM activesupport (>= 5.0.0) minitest nokogiri (>= 1.6) - rails-html-sanitizer (1.6.0) + rails-html-sanitizer (1.6.2) loofah (~> 2.21) - nokogiri (~> 1.14) + nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) rails_autolink (1.1.8) actionview (> 3.1) activesupport (> 3.1) railties (> 3.1) - railties (5.2.8.1) - actionpack (= 5.2.8.1) - activesupport (= 5.2.8.1) + railties (6.0.6.1) + actionpack (= 6.0.6.1) + activesupport (= 6.0.6.1) method_source rake (>= 0.8.7) - thor (>= 0.19.0, < 2.0) + thor (>= 0.20.3, < 2.0) rainbow (3.1.1) - rake (13.0.6) + rake (13.2.1) rb-fsevent (0.11.2) - rb-inotify (0.10.1) + rb-inotify (0.11.1) ffi (~> 1.0) - rdf (3.2.11) + rdf (3.3.2) + bcp47_spec (~> 0.2) + bigdecimal (~> 3.1, >= 3.1.5) link_header (~> 0.0, >= 0.0.8) - rdf-aggregate-repo (3.2.1) - rdf (~> 3.2) - rdf-isomorphic (3.2.1) - rdf (~> 3.2) - rdf-json (3.2.0) + rdf-aggregate-repo (3.3.0) + rdf (~> 3.3) + rdf-hamster-repo (3.3.0) + hamster (~> 3.0) + rdf (~> 3.3) + rdf-isomorphic (3.3.0) + rdf (~> 3.3) + rdf-json (3.3.0) + rdf (~> 3.3) + rdf-ldp (2.1.0) + json-ld (~> 3.2) + ld-patch (~> 3.2) + link_header (~> 0.0, >= 0.0.8) + rack (~> 2.2) + rack-linkeddata (~> 3.1) rdf (~> 3.2) - rdf-microdata (3.2.1) + rdf-turtle (~> 3.2) + rdf-vocab (~> 3.2) + sinatra (~> 2.1) + rdf-microdata (3.3.0) htmlentities (~> 4.3) - nokogiri (~> 1.13) - rdf (~> 3.2) - rdf-rdfa (~> 3.2) - rdf-xsd (~> 3.2) - rdf-n3 (3.2.1) - ebnf (~> 2.2) - rdf (~> 3.2) - sparql (~> 3.2) - sxp (~> 1.2) - rdf-normalize (0.6.1) - rdf (~> 3.2) - rdf-ordered-repo (3.2.1) - rdf (~> 3.2, >= 3.2.1) - rdf-rdfa (3.2.3) - haml (>= 5.2, < 7) + nokogiri (~> 1.15, >= 1.15.4) + rdf (~> 3.3) + rdf-rdfa (~> 3.3) + rdf-xsd (~> 3.3) + rdf-n3 (3.3.0) + ebnf (~> 2.4) + rdf (~> 3.3) + sparql (~> 3.3) + sxp (~> 1.3) + rdf-normalize (0.7.0) + rdf (~> 3.3) + rdf-ordered-repo (3.3.0) + rdf (~> 3.3) + rdf-rdfa (3.3.0) + haml (~> 6.1) htmlentities (~> 4.3) - rdf (~> 3.2) - rdf-aggregate-repo (~> 3.2) - rdf-vocab (~> 3.2) - rdf-xsd (~> 3.2) - rdf-rdfxml (3.2.2) - builder (~> 3.2) + rdf (~> 3.3) + rdf-aggregate-repo (~> 3.3) + rdf-vocab (~> 3.3) + rdf-xsd (~> 3.3) + rdf-rdfxml (3.3.0) + builder (~> 3.2, >= 3.2.4) htmlentities (~> 4.3) - rdf (~> 3.2) - rdf-xsd (~> 3.2) - rdf-reasoner (0.8.0) - rdf (~> 3.2) - rdf-xsd (~> 3.2) - rdf-tabular (3.1.1) - addressable (~> 2.3) - bcp47 (~> 0.3, >= 0.3.3) - json-ld (~> 3.1) - rdf (~> 3.1) - rdf-vocab (~> 3.1) - rdf-xsd (~> 3.1) - rdf-trig (3.2.0) - ebnf (~> 2.2) - rdf (~> 3.2) - rdf-turtle (~> 3.2) - rdf-trix (3.2.0) - rdf (~> 3.2) - rdf-xsd (~> 3.2) - rdf-turtle (3.2.1) - ebnf (~> 2.3) - rdf (~> 3.2) - rdf-vocab (3.2.7) - rdf (~> 3.2, >= 3.2.4) - rdf-xsd (3.2.1) - rdf (~> 3.2) + rdf (~> 3.3) + rdf-xsd (~> 3.3) + rdf-reasoner (0.9.0) + rdf (~> 3.3) + rdf-xsd (~> 3.3) + rdf-tabular (3.3.0) + addressable (~> 2.8) + bcp47_spec (~> 0.2) + json-ld (~> 3.3) + rdf (~> 3.3) + rdf-vocab (~> 3.3) + rdf-xsd (~> 3.3) + rdf-trig (3.3.0) + ebnf (~> 2.4) + rdf (~> 3.3) + rdf-turtle (~> 3.3) + rdf-trix (3.3.0) + rdf (~> 3.3) + rdf-xsd (~> 3.3) + rdf-turtle (3.3.0) + ebnf (~> 2.4) + rdf (~> 3.3) + rdf-vocab (3.3.2) + rdf (~> 3.3) + rdf-xsd (3.3.0) + rdf (~> 3.3) rexml (~> 3.2) - recaptcha (5.15.0) + recaptcha (5.19.0) redic (1.5.3) hiredis redis (4.8.1) @@ -901,44 +938,44 @@ GEM redis (>= 4) redlock (1.3.2) redis (>= 3.0.0, < 6.0) - reform (2.5.0) - disposable (>= 0.4.2, < 0.5.0) - representable (>= 2.4.0, < 3.1.0) + reform (2.6.2) + disposable (>= 0.5.0, < 1.0.0) + representable (>= 3.1.1, < 4) uber (< 0.2.0) reform-rails (0.2.6) activemodel (>= 5.0) reform (>= 2.3.1, < 3.0.0) - regexp_parser (2.8.1) - representable (3.0.4) + regexp_parser (2.10.0) + representable (3.2.0) declarative (< 0.1.0) - declarative-option (< 0.2.0) + trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) - request_store (1.5.1) + request_store (1.7.0) rack (>= 1.4) - responders (3.1.0) + responders (3.1.1) actionpack (>= 5.2) railties (>= 5.2) retriable (3.1.2) - rexml (3.2.6) - rsolr (2.5.0) + rexml (3.4.0) + rsolr (2.6.0) builder (>= 2.1.2) faraday (>= 0.9, < 3, != 2.0.0) - rspec (3.12.0) - rspec-core (~> 3.12.0) - rspec-expectations (~> 3.12.0) - rspec-mocks (~> 3.12.0) - rspec-activemodel-mocks (1.1.0) + rspec (3.13.0) + rspec-core (~> 3.13.0) + rspec-expectations (~> 3.13.0) + rspec-mocks (~> 3.13.0) + rspec-activemodel-mocks (1.2.1) activemodel (>= 3.0) activesupport (>= 3.0) rspec-mocks (>= 2.99, < 4.0) - rspec-core (3.12.2) - rspec-support (~> 3.12.0) - rspec-expectations (3.12.3) + rspec-core (3.13.2) + rspec-support (~> 3.13.0) + rspec-expectations (3.13.3) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.12.0) - rspec-mocks (3.12.6) + rspec-support (~> 3.13.0) + rspec-mocks (3.13.2) diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.12.0) + rspec-support (~> 3.13.0) rspec-rails (5.1.2) actionpack (>= 5.2) activesupport (>= 5.2) @@ -947,7 +984,7 @@ GEM rspec-expectations (~> 3.10) rspec-mocks (~> 3.10) rspec-support (~> 3.10) - rspec-support (3.12.1) + rspec-support (3.13.2) rspec_junit_formatter (0.6.0) rspec-core (>= 2, < 4, != 2.12.0) rubocop (0.93.1) @@ -959,8 +996,8 @@ GEM rubocop-ast (>= 0.6.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 1.4.0, < 2.0) - rubocop-ast (1.29.0) - parser (>= 3.2.1.0) + rubocop-ast (1.37.0) + parser (>= 3.3.1.0) rubocop-rspec (1.44.1) rubocop (~> 0.87) rubocop-ast (>= 0.7.1) @@ -969,28 +1006,16 @@ GEM json multipart-post oauth2 - ruby-next-core (0.15.3) - ruby-oembed (0.16.1) + ruby-next-core (1.1.0) + ruby-oembed (0.18.1) ruby-progressbar (1.13.0) - ruby-saml (1.15.0) + ruby-saml (1.17.0) nokogiri (>= 1.13.10) rexml ruby2_keywords (0.0.5) - ruby_dep (1.5.0) - rubyzip (2.3.2) - samvera-nesting_indexer (2.0.0) - dry-equalizer - sass (3.7.4) - sass-listen (~> 4.0.0) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - sass-rails (5.1.0) - railties (>= 5.2.0) - sass (~> 3.1) - sprockets (>= 2.8, < 4.0) - sprockets-rails (>= 2.0, < 4.0) - tilt (>= 1.1, < 3) + rubyzip (2.4.1) + sass-rails (6.0.0) + sassc-rails (~> 2.1, >= 2.1.1) sassc (2.4.0) ffi (~> 1.9) sassc-rails (2.1.2) @@ -1001,35 +1026,38 @@ GEM tilt scanf (1.0.0) select2-rails (3.5.11) - selenium-webdriver (3.142.7) - childprocess (>= 0.5, < 4.0) - rubyzip (>= 1.2.2) - shacl (0.1.1) - json-ld (~> 3.1, >= 3.1.7) - rdf (~> 3.1, >= 3.1.8) - sparql (~> 3.1) - sxp (~> 1.1) - shex (0.6.4) - ebnf (~> 2.1, >= 2.2) + selenium-webdriver (4.28.0) + base64 (~> 0.2) + logger (~> 1.4) + rexml (~> 3.2, >= 3.2.5) + rubyzip (>= 1.2.2, < 3.0) + websocket (~> 1.0) + shacl (0.4.1) + json-ld (~> 3.3) + rdf (~> 3.3) + sparql (~> 3.3) + sxp (~> 1.2) + shex (0.8.0) + ebnf (~> 2.4) htmlentities (~> 4.3) - json-ld (~> 3.1) - json-ld-preloaded (~> 3.1) - rdf (~> 3.1) - rdf-xsd (~> 3.1) - sparql (~> 3.1) - sxp (~> 1.1) + json-ld (~> 3.3) + json-ld-preloaded (~> 3.3) + rdf (~> 3.3) + rdf-xsd (~> 3.3) + sparql (~> 3.3) + sxp (~> 1.3) shoulda-matchers (4.5.1) activesupport (>= 4.2.0) - sidekiq (6.5.10) + sidekiq (6.5.12) connection_pool (>= 2.2.5, < 3) rack (~> 2.0) redis (>= 4.5.0, < 5) - signet (0.18.0) + signet (0.19.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) multi_json (~> 1.10) - simple_form (5.2.0) + simple_form (5.1.0) actionpack (>= 5.2) activemodel (>= 5.2) simplecov (0.16.1) @@ -1037,6 +1065,11 @@ GEM json (>= 1.8, < 3) simplecov-html (~> 0.10.0) simplecov-html (0.10.2) + sinatra (2.2.4) + mustermann (~> 2.0) + rack (~> 2.2) + rack-protection (= 2.2.4) + tilt (~> 2.0) slop (4.10.1) snaky_hash (2.0.1) hashie @@ -1044,18 +1077,18 @@ GEM sniffer (0.5.0) anyway_config (>= 1.0) dry-initializer (~> 3) - sparql (3.2.6) + sparql (3.3.0) builder (~> 3.2, >= 3.2.4) - ebnf (~> 2.3, >= 2.3.5) + ebnf (~> 2.4) logger (~> 1.5) - rdf (~> 3.2, >= 3.2.11) - rdf-aggregate-repo (~> 3.2, >= 3.2.1) - rdf-xsd (~> 3.2) - sparql-client (~> 3.2, >= 3.2.2) - sxp (~> 1.2, >= 1.2.4) - sparql-client (3.2.2) + rdf (~> 3.3) + rdf-aggregate-repo (~> 3.3) + rdf-xsd (~> 3.3) + sparql-client (~> 3.3) + sxp (~> 1.3) + sparql-client (3.3.0) net-http-persistent (~> 4.0, >= 4.0.2) - rdf (~> 3.2, >= 3.2.11) + rdf (~> 3.3) sprockets (3.7.2) concurrent-ruby (~> 1.0) rack (> 1, < 3) @@ -1071,50 +1104,48 @@ GEM stemmify (0.0.2) streamio-ffmpeg (3.0.2) multi_json (~> 1.8) - sxp (1.2.4) + sxp (1.3.0) matrix (~> 0.4) - rdf (~> 3.2) + rdf (~> 3.3) sync (0.5.0) - temple (0.10.2) - term-ansicolor (1.7.1) + temple (0.10.3) + term-ansicolor (1.11.2) tins (~> 1.0) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) - thor (1.2.2) + thor (1.3.2) thread_safe (0.3.6) - tilt (2.3.0) - timeout (0.4.0) - tins (1.32.1) + tilt (2.6.0) + timeout (0.4.3) + tins (1.38.0) + bigdecimal sync - tinymce-rails (5.10.7.1) + tinymce-rails (5.10.9) railties (>= 3.1.1) + trailblazer-option (0.1.2) twitter-typeahead-rails (0.11.1.pre.corejavascript) actionpack (>= 3.1) jquery-rails railties (>= 3.1) - typhoeus (1.4.0) + typhoeus (1.4.1) ethon (>= 0.9.0) tzinfo (1.2.11) thread_safe (~> 0.1) - tzinfo-data (1.2023.3) + tzinfo-data (1.2025.1) tzinfo (>= 1.0.0) uber (0.1.0) - uglifier (4.2.0) + uglifier (4.2.1) execjs (>= 0.3.0, < 3) - unf (0.1.4) - unf_ext - unf_ext (0.0.8.2) unicode-display_width (1.8.0) - unicode-types (1.9.0) + unicode-types (1.10.0) validatable (1.6.7) - valkyrie (2.2.0) + valkyrie (3.0.3) activemodel activesupport - disposable (~> 0.4.5) - draper dry-struct dry-types (~> 1.0) - faraday (< 1.0) + faraday (>= 0.9, < 3, != 2.0.0) + faraday-multipart json json-ld railties @@ -1123,7 +1154,11 @@ GEM reform (~> 2.2) reform-rails vcr (5.1.0) - version_gem (1.1.3) + version_gem (1.1.4) + view_component (2.74.1) + activesupport (>= 5.0.0, < 8.0) + concurrent-ruby (~> 1.0) + method_source (~> 1.0) virtus (1.0.5) axiom-types (~> 0.1) coercible (~> 1.0) @@ -1131,29 +1166,30 @@ GEM equalizer (~> 0.0, >= 0.0.9) warden (1.2.9) rack (>= 2.0.9) - web-console (3.7.0) - actionview (>= 5.0) - activemodel (>= 5.0) + web-console (4.2.1) + actionview (>= 6.0.0) + activemodel (>= 6.0.0) bindex (>= 0.4.0) - railties (>= 5.0) - webmock (3.19.1) + railties (>= 6.0.0) + webmock (3.24.0) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) - webrick (1.8.1) - websocket-driver (0.7.6) + websocket (1.2.11) + websocket-driver (0.7.7) + base64 websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) xpath (3.2.0) nokogiri (~> 1.8) - yabeda (0.12.0) + yabeda (0.13.1) anyway_config (>= 1.0, < 3) concurrent-ruby dry-initializer - yabeda-http_requests (0.2.0) + yabeda-http_requests (0.2.1) sniffer yabeda - yabeda-prometheus (0.9.0) + yabeda-prometheus (0.9.1) prometheus-client (>= 3.0, < 5.0) rack yabeda (~> 0.10) @@ -1166,11 +1202,16 @@ GEM anyway_config (>= 1.3, < 3) railties yabeda (~> 0.8) - yabeda-sidekiq (0.10.0) + yabeda-sidekiq (0.12.0) anyway_config (>= 1.3, < 3) sidekiq yabeda (~> 0.6) - zeitwerk (2.6.12) + yaml-ld (0.0.3) + json-ld (~> 3.3) + psych (>= 3.3) + rdf (~> 3.3) + rdf-xsd (~> 3.3) + zeitwerk (2.7.1) zip_tricks (5.6.0) PLATFORMS @@ -1180,17 +1221,19 @@ PLATFORMS DEPENDENCIES axe-matchers blacklight-oembed - blacklight_advanced_search (~> 6.4) + blacklight_advanced_search blacklight_dynamic_sitemap - blacklight_iiif_search (~> 1.0) + blacklight_iiif_search (~> 2.0) blacklight_oai_provider - blacklight_range_limit (~> 6) + blacklight_range_limit (~> 7.0) + bootstrap (~> 4.0) browse-everything bulkrax! byebug - capybara (~> 2.17) + capybara (~> 3.29) chosen-rails coffee-rails (~> 4.2) + concurrent-ruby (= 1.3.4) cookieconsent coveralls (~> 0.8) dalli (~> 3.2.3) @@ -1199,52 +1242,53 @@ DEPENDENCIES edtf (~> 3.0) equivalent-xml factory_bot_rails - faraday_middleware (~> 0.10.0) + faraday_middleware font-awesome-sass (~> 6.4, >= 6.4.2) honeycomb-beeline (>= 2.10.0) hydra-role-management - hyrax (= 3.6.0) - hyrax-migrator! + hyrax (~> 4.0) + jquery-datatables-rails jquery-rails libhoney (>= 2.1.0) listen (>= 3.0.5, < 3.2) loofah (>= 2.2.3) + omniauth omniauth-cas - omniauth-rails_csrf_protection (~> 0.1) + omniauth-rails_csrf_protection (~> 1.0) omniauth-saml pg poltergeist pry-byebug pry-rails - puma (~> 5.6) - rails (~> 5.2) + puma (~> 4.3.8) + rails (~> 6.0.6) rails-controller-testing recaptcha - rsolr (>= 1.0) + rsolr (>= 1.0, < 3) rspec rspec-activemodel-mocks rspec-mocks - rspec-rails + rspec-rails (~> 5.0) rspec_junit_formatter rubocop (~> 0.93) rubocop-rspec ruby-oembed rubyzip (~> 2) - sass-rails (~> 5.0) sassc-rails - selenium-webdriver (~> 3) + selenium-webdriver (~> 4.4) shoulda-matchers (~> 4) - sidekiq (~> 6.4) + sidekiq (~> 6.0) simplecov (>= 0.9) + sprockets (= 3.7.2) stemmify streamio-ffmpeg triplestore-adapter! + twitter-typeahead-rails (= 0.11.1.pre.corejavascript) tzinfo-data uglifier (>= 1.3.0) vcr (~> 5.1) web-console (>= 3.3.0) webmock - willow_sword! yabeda yabeda-http_requests yabeda-prometheus @@ -1254,4 +1298,4 @@ DEPENDENCIES zip_tricks (~> 5.3) BUNDLED WITH - 2.3.26 + 2.6.8 diff --git a/app/assets/images/blacklight/gallery.svg b/app/assets/images/blacklight/gallery.svg new file mode 100644 index 000000000..3b3e7f742 --- /dev/null +++ b/app/assets/images/blacklight/gallery.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/images/blacklight/list.svg b/app/assets/images/blacklight/list.svg new file mode 100644 index 000000000..df2da7b24 --- /dev/null +++ b/app/assets/images/blacklight/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/images/blacklight/masonry.svg b/app/assets/images/blacklight/masonry.svg new file mode 100644 index 000000000..3b3e7f742 --- /dev/null +++ b/app/assets/images/blacklight/masonry.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/images/blacklight/tables.svg b/app/assets/images/blacklight/tables.svg new file mode 100644 index 000000000..df2da7b24 --- /dev/null +++ b/app/assets/images/blacklight/tables.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 3359e5ce3..b5f962b30 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -12,7 +12,12 @@ // // Required by Blacklight -//= require jquery +//= require rails-ujs +//= require jquery3 +//= require jquery-ui +//= require popper +//= require twitter/typeahead +//= require bootstrap-sprockets //= require chosen-jquery //= require 'blacklight_advanced_search' @@ -20,10 +25,10 @@ //= require jquery.treetable //= require browse_everything/behavior -//= require jquery_ujs -//= require dataTables/jquery.dataTables -//= require dataTables/bootstrap/3/jquery.dataTables.bootstrap +//= require jquery.dataTables +//= require dataTables.bootstrap4 //= require blacklight/blacklight +//= require blacklight_gallery //= require_directory . //= require bulkrax/application @@ -31,8 +36,7 @@ //= require hyrax // Required for Hyrax override in assets/javascripts/hyrax/editor/controlled_vocabulary.es6 -//= require handlebars-v4.0.5 - +//= require handlebars // For blacklight_range_limit built-in JS, if you don't want it you don't need // this: diff --git a/app/assets/javascripts/blacklight/ajax_modal.js b/app/assets/javascripts/blacklight/ajax_modal.js deleted file mode 100644 index 1cc655623..000000000 --- a/app/assets/javascripts/blacklight/ajax_modal.js +++ /dev/null @@ -1,246 +0,0 @@ -//= require blacklight/core - -/* - The ajax_modal plugin can display some interactions inside a Bootstrap - modal window, including some multi-page interactions. - - It supports unobtrusive Javascript, where a link or form that would have caused - a new page load is changed to display it's results inside a modal dialog, - by this plugin. The plugin assumes there is a Bootstrap modal div - on the page with id #ajax-modal to use as the modal -- the standard Blacklight - layout provides this. - - To make a link or form have their results display inside a modal, add - `data-ajax-modal="trigger"` to the link or form. (Note, form itself not submit input) - With Rails link_to helper, you'd do that like: - - link_to something, link, :data => {:ajax_modal => "trigger"} - - The results of the link href or form submit will be displayed inside - a modal -- they should include the proper HTML markup for a bootstrap modal's - contents. Also, you ordinarily won't want the Rails template with wrapping - navigational elements to be used. The Rails controller could suppress - the layout when a JS AJAX request is detected, OR the response - can include a `
` -- only the contents - of the container will be placed inside the modal, the rest of the - page will be ignored. - - If you'd like to have a link or button that closes the modal, - you can just add a `data-dismiss="modal"` to the link, - standard Bootstrap convention. But you can also have - an href on this link for non-JS contexts, we'll make sure - inside the modal it closes the modal and the link is NOT followed. - - Link or forms inside the modal will ordinarily cause page loads - when they are triggered. However, if you'd like their results - to stay within the modal, just add `data-ajax-modal="preserve"` - to the link or form. - - Here's an example of what might be returned, demonstrating most of the devices available: - -
- - - - - - -
- - - One additional feature. If the content returned from the AJAX modal load - has an element with `data-ajax-modal=close`, that will trigger the modal - to be closed. And if this element includes a node with class "flash_messages", - the flash-messages node will be added to the main page inside #main-flahses. - - == Events - - We'll send out an event 'loaded.blacklight.ajax-modal' with the #ajax-modal - dialog as the target, right after content is loaded into the modal but before - it is shown (if not already a shown modal). In an event handler, you can - inspect loaded content by looking inside $(this). If you call event.preventDefault(), - we won't 'show' the dialog (although it may already have been shown, you may want to - $(this).modal("hide") if you want to ensure hidden/closed. - - The data-ajax-modal=close behavior is implemented with this event, see for example. -*/ - -// We keep all our data in Blacklight.ajaxModal object. -// Create lazily if someone else created first. -if (Blacklight.ajaxModal === undefined) { - Blacklight.ajaxModal = {}; -} - - -// a Bootstrap modal div that should be already on the page hidden -Blacklight.ajaxModal.modalSelector = "#ajax-modal"; - -// Trigger selectors identify forms or hyperlinks that should open -// inside a modal dialog. -Blacklight.ajaxModal.triggerLinkSelector = "a[data-ajax-modal~=trigger],button[data-ajax-modal~=trigger], button.lightboxLink,button.more_facets_link,.ajax_modal_launch"; -Blacklight.ajaxModal.triggerFormSelector = "form[data-ajax-modal~=trigger], form.ajax_form"; - -// preserve selectors identify forms or hyperlinks that, if activated already -// inside a modal dialog, should have destinations remain inside the modal -- but -// won't trigger a modal if not already in one. -// -// No need to repeat selectors from trigger selectors, those will already -// be preserved. MUST be manually prefixed with the modal selector, -// so they only apply to things inside a modal. -Blacklight.ajaxModal.preserveLinkSelector = Blacklight.ajaxModal.modalSelector + ' a[data-ajax-modal~=preserve],button[data-ajax-modal~=preserve]'; -Blacklight.ajaxModal.preserveFormSelector = Blacklight.ajaxModal.modalSelector + ' form[data-ajax-modal~=preserve]' - -Blacklight.ajaxModal.containerSelector = "[data-ajax-modal~=container]"; - -Blacklight.ajaxModal.modalCloseSelector = "[data-ajax-modal~=close], span.ajax-close-modal"; - -// Called on fatal failure of ajax load, function returns content -// to show to user in modal. Right now called only for extreme -// network errors. -Blacklight.ajaxModal.onFailure = function() { - var contents = ""; - $(Blacklight.ajaxModal.modalSelector).find('.modal-content').html(contents); - $(Blacklight.ajaxModal.modalSelector).modal('show', this.relatedObject); - // Blacklight.ajaxModal.clickTarget = clickTarget; -}; - -Blacklight.ajaxModal.receiveAjax = function (contents) { - // does it have a data- selector for container? - // important we don't execute script tags, we shouldn't. - // code modelled off of JQuery ajax.load. https://github.com/jquery/jquery/blob/master/src/ajax/load.js?source=c#L62 - var container = $("
"). - append( jQuery.parseHTML(contents) ).find( Blacklight.ajaxModal.containerSelector ).first(); - if (container.length !== 0) { - contents = container.html(); - } - - $(Blacklight.ajaxModal.modalSelector).find('.modal-content').html(contents); - $(Blacklight.ajaxModal.modalSelector).attr('aria-labelledby', 'modal-title'); - - // send custom event with the modal dialog div as the target - var e = $.Event('loaded.blacklight.ajax-modal'); - $(Blacklight.ajaxModal.modalSelector).trigger(e); - // if they did preventDefault, don't show the dialog - if (e.isDefaultPrevented()) return; - - $(Blacklight.ajaxModal.modalSelector).modal('show', this.relatedObject); -}; - - -Blacklight.ajaxModal.modalAjaxLinkClick = function(e) { - e.preventDefault(); - - $.ajax({ - url: $(this).attr('data-href'), - relatedObject: this, - }) - .fail(Blacklight.ajaxModal.onFailure) - .done(Blacklight.ajaxModal.receiveAjax) -}; - -Blacklight.ajaxModal.modalAjaxFormSubmit = function(e) { - e.preventDefault(); - - $.ajax({ - url: $(this).attr('action'), - data: $(this).serialize(), - type: $(this).attr('method') // POST - }) - .fail(Blacklight.ajaxModal.onFailure) - .done(Blacklight.ajaxModal.receiveAjax) -} - - - -Blacklight.ajaxModal.setup_modal = function() { - // Event indicating blacklight is setting up a modal link, - // you can catch it and call e.preventDefault() to abort - // setup. - var e = $.Event('setup.blacklight.ajax-modal'); - $("body").trigger(e); - if (e.isDefaultPrevented()) return; - - // Register both trigger and preserve selectors in ONE event handler, combining - // into one selector with a comma, so if something matches BOTH selectors, it - // still only gets the event handler called once. - $("body").on("click", Blacklight.ajaxModal.triggerLinkSelector + ", " + Blacklight.ajaxModal.preserveLinkSelector, - Blacklight.ajaxModal.modalAjaxLinkClick); - $("body").on("submit", Blacklight.ajaxModal.triggerFormSelector + ", " + Blacklight.ajaxModal.preserveFormSelector, - Blacklight.ajaxModal.modalAjaxFormSubmit); - - // Catch our own custom loaded event to implement data-ajax-modal=closed - $("body").on("loaded.blacklight.ajax-modal", Blacklight.ajaxModal.check_close_ajax_modal); - - // we support doing data-dismiss=modal on a with a href for non-ajax - // use, we need to suppress following the a's href that's there for - // non-JS contexts. - $("body ").on("click", Blacklight.ajaxModal.modalSelector + " a[data-dismiss~=modal]", function (e) { - e.preventDefault(); - }); -}; - -// A function used as an event handler on loaded.blacklight.ajax-modal -// to catch contained data-ajax-modal=closed directions -Blacklight.ajaxModal.check_close_ajax_modal = function(event) { - if ($(event.target).find(Blacklight.ajaxModal.modalCloseSelector).length) { - modal_flashes = $(this).find('.flash_messages'); - - $(event.target).modal("hide"); - event.preventDefault(); - - main_flashes = $('#main-flashes'); - main_flashes.append(modal_flashes); - modal_flashes.fadeIn(500); - } -} - -Blacklight.onLoad(function() { - Blacklight.ajaxModal.setup_modal(); -}); - -// Reset focus to element that opened the modal -$(document).ready(function() { - $('body').on('show.bs.modal', function(e) { - if (!$(e.relatedTarget).parents('.modal').length) { - Blacklight.ajaxModal.clickTarget = $(e.relatedTarget); - } - }); - // Find first and last focusable elements in the modal - // and making tabing off the modal wrap around instead - $('body').on('shown.bs.modal', function(e) { - // Find the focusable elements and save them - var focusable = $(e.target).find('button:visible, [href]:visible, input:visible, select:visible, textarea:visible, [tabindex]:visible:not([tabindex="-1"])'); - Blacklight.ajaxModal.firstFocusable = $(focusable[0]) - Blacklight.ajaxModal.lastFocusable = $(focusable[focusable.length - 1]); - Blacklight.ajaxModal.firstFocusable.focus(); - // On the first focusable, if we shift+tab off, jump to last focusable - Blacklight.ajaxModal.firstFocusable.on('keydown', function(e) { - if(e.keyCode == 9 && e.shiftKey) { - e.preventDefault(); - Blacklight.ajaxModal.lastFocusable.focus(); - } - }); - // On the last focusable, if we tab (but not shift+tab) off, jump to the first focusable - Blacklight.ajaxModal.lastFocusable.on('keydown', function(e) { - if(e.keyCode == 9 && !e.shiftKey) { - e.preventDefault(); - Blacklight.ajaxModal.firstFocusable.focus(); - } - }); - }); - $('body').on('hide.bs.modal', function(e) { - if (Blacklight.ajaxModal.clickTarget) { - Blacklight.ajaxModal.clickTarget.focus(); - } - }); -}); diff --git a/app/assets/javascripts/hyrax/save_work/uploaded_files.es6 b/app/assets/javascripts/hyrax/save_work/uploaded_files.es6 index fca2977b3..09de13eae 100644 --- a/app/assets/javascripts/hyrax/save_work/uploaded_files.es6 +++ b/app/assets/javascripts/hyrax/save_work/uploaded_files.es6 @@ -14,7 +14,8 @@ export class UploadedFiles { } get inProgress() { - return this.element.fileupload('active') > 0 + // OVERRIDE FROM HYRAX: increase allowed number of active file uploads to 1 because the fileuploadcompleted event fires before... file is completed uploading + return this.element.fileupload('active') > 1 } get hasFiles() { diff --git a/app/assets/javascripts/oregon_digital/content_mask_warning.js b/app/assets/javascripts/oregon_digital/content_mask_warning.js new file mode 100644 index 000000000..98e6d2a29 --- /dev/null +++ b/app/assets/javascripts/oregon_digital/content_mask_warning.js @@ -0,0 +1,46 @@ +// GLOBAL: Declare it globally for checking radio button +var radioButtonChecked = false; + +// ON LOAD: When page refresh, it checks on the spot if radio/checkbox button being selected +$(function() { + // LOAD: On page load filter out the JS + $('input[name*="[mask_content][]"]').each(function() { + var workName = $(this).attr('name'); + checkMaskContent(workName); + }); + + // CHECK: Check if any checkbox in the ':mask_content' group is checked + $('input[name*="[mask_content][]"]').on('click', function() { + var workName = $(this).attr('name'); + checkMaskContent(workName); + }); +}); + +// METHOD: Create a method to disabled field from being selected if :mask_content is not selected +function toggleDisable(disable_val) { + $('#content_alert_default').prop('disabled', disable_val); + $('#content_alert_custom').prop('disabled', disable_val); + $('#content_alert_box').prop('disabled', disable_val); + + if (disable_val) { + $('#content_alert_text').addClass('disabled-text'); + } else { + $('#content_alert_text').removeClass('disabled-text'); + } +} + +// METHOD: Check for mask content to disable or not for for :content_alert +function checkMaskContent(workName) { + var field = 'input[name="' + workName + '"]:checked' + if ($(field).length > 0 && !radioButtonChecked) { + toggleDisable(false); // Enable elements or perform actions when checked + $('#content_alert_default').prop('checked', true); + radioButtonChecked = true; + } else if ($(field).length === 0) { + toggleDisable(true); // Disable elements or perform actions when unchecked + $('#content_alert_default').prop('checked', false); + $('#content_alert_custom').prop('checked', false); + $('#content_alert_box').val(''); + radioButtonChecked = false; + } +} diff --git a/app/assets/javascripts/oregon_digital/facets_button.js b/app/assets/javascripts/oregon_digital/facets_button.js new file mode 100644 index 000000000..03ff082cb --- /dev/null +++ b/app/assets/javascripts/oregon_digital/facets_button.js @@ -0,0 +1,13 @@ +// ON LOAD: When page refresh, it will switch on click for the label on facets display button +$(function() { + // CHANGE: On click, change the button label between 'More' and 'Less' + $('.secondary-facets, .secondary-advanced-facets').on('click', function() { + // DECLARE: Get the modify text + const moreText = $(this).data('more-text'); + const lessText = $(this).data('less-text'); + + // CHECK: Get the current text and check the value to switch on display when click + const currentText = $.trim($(this).text()); + $(this).text(currentText === moreText ? lessText : moreText); + }); +}); \ No newline at end of file diff --git a/app/assets/javascripts/oregon_digital/bootstrap-fixes.js b/app/assets/javascripts/oregon_digital/fixes/bootstrap-fixes.js similarity index 100% rename from app/assets/javascripts/oregon_digital/bootstrap-fixes.js rename to app/assets/javascripts/oregon_digital/fixes/bootstrap-fixes.js diff --git a/app/assets/javascripts/oregon_digital/fixes/bulkrax_fixes.js b/app/assets/javascripts/oregon_digital/fixes/bulkrax_fixes.js new file mode 100644 index 000000000..f62f718dc --- /dev/null +++ b/app/assets/javascripts/oregon_digital/fixes/bulkrax_fixes.js @@ -0,0 +1,2 @@ +// Bulkrax is using $().on('ready') syntax which was deprecated when they wrote it and removed in jQuery v3 +$(document).ready(prepBulkrax); diff --git a/app/assets/stylesheets/_variables.scss b/app/assets/stylesheets/_variables.scss index f3cce8cc3..72a92273b 100644 --- a/app/assets/stylesheets/_variables.scss +++ b/app/assets/stylesheets/_variables.scss @@ -13,14 +13,27 @@ $medium-grey: #999999; $light-grey: #CCCCCC; $very-light-grey: #ECECEC; -$brand-primary: $navy-blue; -// $brand-primary: $apple-green; +$primary: $navy-blue; + +$theme-colors: ( + primary: $primary +); + +// Bootstrap color variables +$secondary: #fff; // Change bootstrap grid breakpoints $grid-gutter-width: 30px; -$container-tablet: (720px + $grid-gutter-width); -$container-desktop: (1140px + $grid-gutter-width); -$container-large-desktop: (1520px + $grid-gutter-width); +$container-max-widths: ( + md: 720px + $grid-gutter-width, + lg: 1140px + $grid-gutter-width, + xl: 1520px + $grid-gutter-width +); -$screen-lg: 1580px; -$screen-md: 1200px; +$grid-breakpoints: ( + xs: 0, + sm: 1px, + md: 768px, + lg: 1200px, + xl: 1580px +) diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index 390a09862..8304a7927 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -11,7 +11,7 @@ * It is generally better to create a new file per style scope. * *= require openseadragon/openseadragon - *= require dataTables/bootstrap/3/jquery.dataTables.bootstrap + *= require dataTables.bootstrap4 *= require jquery-ui *= require select2 *= require bulkrax/application @@ -21,6 +21,8 @@ *= require cookieconsent */ +@import "_variables"; +@import "bootstrap"; @import "*"; @import "blacklight/**/*"; @import "oregon_digital/**/*"; \ No newline at end of file diff --git a/app/assets/stylesheets/blacklight/facet_overrides.scss b/app/assets/stylesheets/blacklight/facet_overrides.scss index 4a380dc38..2dd335faa 100644 --- a/app/assets/stylesheets/blacklight/facet_overrides.scss +++ b/app/assets/stylesheets/blacklight/facet_overrides.scss @@ -1,6 +1,6 @@ -.panel-heading.collapse-toggle .panel-title.collapsed:after { +.panel-heading.collapse-toggle .panel-title:after { /* symbol for "collapsed" panels */ - content: "\e080"; + color: grey; /* adjust as needed, taken from bootstrap.css */ } .collapse-toggle.panel-heading { @@ -8,6 +8,11 @@ padding: 0; } +.facet-field-heading button { + font-size: 16px; + font-weight: 600; +} + .panel-header { margin: 0; button { @@ -17,3 +22,8 @@ white-space: normal; } } + +// CUSTOM: Add in custom margin for the new dropdown collapse button +.secondary-facets { + margin: 5px 0px 5px 0px; +} diff --git a/app/assets/stylesheets/browse_everything.scss b/app/assets/stylesheets/browse_everything.scss index d9d4bc1a5..fdd0db40c 100644 --- a/app/assets/stylesheets/browse_everything.scss +++ b/app/assets/stylesheets/browse_everything.scss @@ -1,6 +1,5 @@ -@import 'bootstrap-sprockets'; @import 'bootstrap'; @import "font-awesome"; -@import "browse_everything/browse_everything_bootstrap3"; +@import "browse_everything/browse_everything_bootstrap4"; diff --git a/app/assets/stylesheets/hyrax.scss b/app/assets/stylesheets/hyrax.scss index 0e9cadd8e..33f25ec38 100644 --- a/app/assets/stylesheets/hyrax.scss +++ b/app/assets/stylesheets/hyrax.scss @@ -1,11 +1,10 @@ -@import "bootstrap-sprockets"; -@import 'bootstrap'; @import 'blacklight/blacklight'; @import "font-awesome"; @import "blacklight_gallery/gallery"; @import "blacklight_gallery/masonry"; @import "blacklight_gallery/slideshow"; @import "blacklight_gallery/osd_viewer"; +@import "hyrax/blacklight_gallery"; @import 'hyrax/hyrax'; diff --git a/app/assets/stylesheets/oregon_digital/_advanced.scss b/app/assets/stylesheets/oregon_digital/_advanced.scss index 89fe17861..08f1f00cb 100644 --- a/app/assets/stylesheets/oregon_digital/_advanced.scss +++ b/app/assets/stylesheets/oregon_digital/_advanced.scss @@ -80,7 +80,7 @@ } select { - border: 3px solid $brand-primary; + border: 3px solid $primary; padding: .25em; padding-right: .75em; diff --git a/app/assets/stylesheets/oregon_digital/_breadcrumbs.scss b/app/assets/stylesheets/oregon_digital/_breadcrumbs.scss index dd47919d0..8d5126031 100644 --- a/app/assets/stylesheets/oregon_digital/_breadcrumbs.scss +++ b/app/assets/stylesheets/oregon_digital/_breadcrumbs.scss @@ -12,8 +12,10 @@ .breadcrumb { background: none; border: none; + margin-top: 0; margin-bottom: 0; - padding: 1em 0; + padding-bottom: 1em; + padding-top: 1.5em; } // Dashboard nav needs to act like main content diff --git a/app/assets/stylesheets/oregon_digital/_buttons.scss b/app/assets/stylesheets/oregon_digital/_buttons.scss index 689c24fb5..152f8fb7a 100644 --- a/app/assets/stylesheets/oregon_digital/_buttons.scss +++ b/app/assets/stylesheets/oregon_digital/_buttons.scss @@ -41,8 +41,8 @@ input.link { &.btn-outline { background: unset; border-radius: 0 !important; - border: 3px solid $brand-primary; - color: $brand-primary; + border: 3px solid $primary; + color: $primary; margin: 0 5px; &:hover, &:focus { @@ -51,6 +51,15 @@ input.link { color: $black; } } + + &.btn-secondary { + &:hover { + border-color: #adadad; + } + } +} +.btn-sm { + font-size: 14px; } .btn-lg { padding: 16px 24px; @@ -63,9 +72,9 @@ input.link { font-size: 14px; } -.btn-default { - color: $brand-primary; - border: 3px solid $brand-primary; +.btn-default, .btn-secondary { + color: $primary; + border: 3px solid $primary; } /* increase checkbox size */ diff --git a/app/assets/stylesheets/oregon_digital/_files-sets.scss b/app/assets/stylesheets/oregon_digital/_files-sets.scss index 576d714c9..90f129c5a 100644 --- a/app/assets/stylesheets/oregon_digital/_files-sets.scss +++ b/app/assets/stylesheets/oregon_digital/_files-sets.scss @@ -17,8 +17,13 @@ .copy-input-fileset { width: 215px; + @media (min-width: breakpoint-min(xl)) { + width: 285px; + } } .centered-socials { + @media (min-width: breakpoint-min(xl)) { margin-top: -5px; + } } \ No newline at end of file diff --git a/app/assets/stylesheets/oregon_digital/_footer.scss b/app/assets/stylesheets/oregon_digital/_footer.scss index dcb6ec6c1..65c41ae18 100644 --- a/app/assets/stylesheets/oregon_digital/_footer.scss +++ b/app/assets/stylesheets/oregon_digital/_footer.scss @@ -17,7 +17,7 @@ margin-left: 10px; } -@media (max-width: $screen-md-min) { +@media (max-width: breakpoint-min(lg)) { .osu-logo, .uo-logo { @@ -33,6 +33,24 @@ width: 100%; height: 100%; background-color: $dark-grey; + + p { + margin: 0 0 10px; + } + + @media (max-width: breakpoint-min(lg)) { + .row { + display: block; + } + + .col-md-1, + .col-md-2, + .horizontal-sm, + .col-md-4 { + max-width: 100%; + flex: max-content; + } + } } .homepage-info-text { @@ -81,8 +99,9 @@ a.toc-link { .left-border { border-left: $lime-green 2px solid; + height: fit-content; - @media (max-width: $screen-md-min) { + @media (max-width: breakpoint-min(lg)) { & { text-align: center; border: none; @@ -90,7 +109,7 @@ a.toc-link { } } -@media (max-width: $screen-md-min) { +@media (max-width: breakpoint-min(lg)) { .horizontal-sm { width: 4em; border-bottom: $lime-green 2px solid; @@ -101,7 +120,7 @@ a.toc-link { .right-align { text-align: right; - @media (max-width: $screen-md-min) { + @media (max-width: breakpoint-min(lg)) { & { text-align: center; } diff --git a/app/assets/stylesheets/oregon_digital/_form.scss b/app/assets/stylesheets/oregon_digital/_form.scss new file mode 100644 index 000000000..1795ff918 --- /dev/null +++ b/app/assets/stylesheets/oregon_digital/_form.scss @@ -0,0 +1,6 @@ +// CSS: Create a custom CSS for the edit form on OD2 +.disabled-text { + cursor: default; + user-select: none; /* Prevents text selection */ + color: #ccc; /* Make color looks like disable */ +} \ No newline at end of file diff --git a/app/assets/stylesheets/oregon_digital/_header.scss b/app/assets/stylesheets/oregon_digital/_header.scss index 79cf07b5b..b139dc090 100644 --- a/app/assets/stylesheets/oregon_digital/_header.scss +++ b/app/assets/stylesheets/oregon_digital/_header.scss @@ -7,17 +7,22 @@ header { // Move searchbar back down margin-top: 0; } - .navbar-toggle { + .navbar-toggler#main-nav-toggler { + border-color: transparent; + &:focus { outline: revert; } - .icon-bar { - background-color: $navy-blue; + .navbar-toggler-icon { + display: inline-block; } } .navbar-header { - display: grid; - grid-template-columns: 1fr auto; + display: flex; + flex-grow: 1; + justify-content: space-between; + margin-right: -15px; + margin-left: -15px; } .navbar-header:before { display: unset; @@ -68,11 +73,28 @@ header { } } + .navbar-nav > li > a { + padding-top:15px; + padding-bottom:15px; + + &:hover { + text-decoration: none; + background-color: #eee; + } + } + + #user_utility_links { + @media (min-width: breakpoint-min(lg)) { + margin-right: -15px; + } + } + ul.nav { a.explore-collections { + padding: 10px 15px; padding-bottom: 2px; font-weight: 700; - @media (max-width: $screen-xs-max) { + @media (max-width: breakpoint-max(sm)) { display: inline-block; font-size: 20px; margin-bottom: 2em; @@ -82,7 +104,7 @@ header { padding: 0 2em; } form { - @media (max-width: $screen-xs-max) { + @media (max-width: breakpoint-max(sm)) { padding-bottom: 2em; } @@ -91,18 +113,18 @@ header { font-weight: 700; padding: 0; - @media (min-width: $screen-sm-min) { + @media (min-width: breakpoint-min(md)) { & { float: right; } } - @media (max-width: $screen-xs-max) { + @media (max-width: breakpoint-max(sm)) { font-size: 1.25em; } } .input-group { margin: auto; - @media (max-width: $screen-sm-max) { + @media (max-width: breakpoint-min(lg)) { width: 75%; } @@ -133,16 +155,26 @@ header { box-shadow: 0 0 10px $dark-grey; border-width: 0 0 5px 0; padding: 1em 2em; - @media (max-width: $screen-sm-min) { + @media (max-width: breakpoint-min(md)) { & { padding: .5em; } } + + .container-fluid { + flex-wrap: wrap; + padding-left: 15px; + padding-right: 15px; + } } #top-navbar-collapse { letter-spacing: 2px; + @media (max-width: breakpoint-max(lg)) { + justify-content: flex-start !important; + } + .divider { height: 1px; overflow: hidden; @@ -150,12 +182,26 @@ header { } #user-dropdown { - @media (max-width: $screen-xs-max) { + @media (max-width: breakpoint-max(sm)) { display: none; } } #user-util-links { - @media (max-width: $screen-xs-max) { + margin-top: -0.6em; + + li { + font-size: 14px; + + a { + color: #333; + } + + & > a:hover{ + text-decoration: none; + } + } + + @media (max-width: breakpoint-max(sm)) { position: static; float: none; width: auto; @@ -168,17 +214,12 @@ header { li { font-size: 16px; } + .my-account-option { margin: .25em 0; } } } - - .navbar-left-sm { - @media (max-width: $screen-sm-max) and (min-width: $screen-sm-min) { - float: left !important; - } - } } } diff --git a/app/assets/stylesheets/oregon_digital/_home-page.scss b/app/assets/stylesheets/oregon_digital/_home-page.scss index faf17c15b..839363d3f 100644 --- a/app/assets/stylesheets/oregon_digital/_home-page.scss +++ b/app/assets/stylesheets/oregon_digital/_home-page.scss @@ -142,33 +142,19 @@ body { } -ul.nav.homepage-nav { - text-transform: unset; - width: 100%; - - #masthead-search-field-header { - width: 100%; - } - #masthead-search-form-header { - .advanced-link { - text-transform: unset; - } +#masthead-search-form-header { + .advanced-link { + text-transform: unset; + float: right; + font-size: 10px; + font-weight: 700; + letter-spacing: 1.5px; + padding: 0; + top: -.75em; + color: $white; } - li { - background: none; - width: 100%; - } - form { - width: 100%; - a.advanced-link { - position: relative; - float: right; - font-size: 10px; - font-weight: 700; - letter-spacing: 1.5px; - padding: 0; - top: -.75em; - } + + .form-group { .input-group { width: 100%; button { @@ -179,7 +165,6 @@ ul.nav.homepage-nav { border: unset; width: 3.25em; height: calc(100% - 1.25em); - margin-top: 10px; margin-bottom: 10px; border-right: 1.5px solid $very-light-grey; i { @@ -217,10 +202,6 @@ ul.nav.homepage-nav { -ms-transform: translateX(-50%); -o-transform: translateX(-50%); transform: translateX(-50%); - - @media (min-width: $screen-lg-min) { - width: 100%; - } } } @@ -235,7 +216,7 @@ ul.nav.homepage-nav { .home-content #showcase { h2 { - @media (max-width: $screen-md-min) { + @media (max-width: breakpoint-min(lg)) { & { text-align: center; font-size: 32px; @@ -243,7 +224,7 @@ ul.nav.homepage-nav { } } } - .visible-sm.visible-xs { + .d-lg-none.d-block { a.btn { margin-bottom: 3.5em; } @@ -265,7 +246,7 @@ ul.nav.homepage-nav { font-size: 20px; font-weight: bold; line-height: 30px; - @media (max-width: $screen-md-min) { + @media (max-width: breakpoint-min(lg)) { & { font-size: 28px; } @@ -279,7 +260,7 @@ ul.nav.homepage-nav { } .collection-items { - @media (max-width: $screen-md-min) { + @media (max-width: breakpoint-min(lg)) { & { font-size: 22px; } @@ -290,10 +271,16 @@ ul.nav.homepage-nav { .featured-collection-item { padding: 0 .25em; flex-basis: 16.67%; - &:last-of-type { - flex-basis: 50%; - margin-left: 1em; - } + + // Add in the thumbnail as the first order + order: 1; +} + +/* Move title to the end of the block */ +.featured-collection-title { + order: 2; + flex-basis: 50%; + margin-left: 1em; } .feature-collection-divider { @@ -312,7 +299,7 @@ ul.nav.homepage-nav { .about-oregondigital-container { img { - @media (max-width: $screen-md-min) { + @media (max-width: breakpoint-min(lg)) { padding-bottom: 1em; } } @@ -330,8 +317,12 @@ ul.nav.homepage-nav { .chevron-align { height: 1%; - @media (max-width: $screen-md-min) { + @media (max-width: breakpoint-min(lg)) { margin-top: 13px; } margin-right: 5px; } + +.test-color { + color: black; +} \ No newline at end of file diff --git a/app/assets/stylesheets/oregon_digital/_search.scss b/app/assets/stylesheets/oregon_digital/_search.scss index ea2d7e8bb..66d6f9c64 100644 --- a/app/assets/stylesheets/oregon_digital/_search.scss +++ b/app/assets/stylesheets/oregon_digital/_search.scss @@ -10,14 +10,14 @@ background-color: $very-light-grey; height: 0.75em; - @media (min-width: $screen-sm-min) { + @media (min-width: breakpoint-min(md)) { & { margin-top: 1em; } } } -@media (max-width: $screen-sm-min) { +@media (max-width: breakpoint-min(md)) { #appliedParams.explore-collection, #appliedParamsConstraint.explore-collection { position: absolute; @@ -45,16 +45,17 @@ position: relative; } -.view-type .btn-default { +.view-type .btn-outline-secondary { background-color: $very-light-grey; border-radius: 5px !important; border: none; box-shadow: none; - padding: .1em .25em; + padding: .2em .25em; + padding-top: 0; font-size: 18pt; + color: $navy-blue !important; &.active { - color: $navy-blue; - background-color: $contrast-orange; + background-color: $contrast-orange !important; } &.view-type-gallery, &.view-type-masonry { @@ -73,7 +74,7 @@ padding-right: 1em; } - @media (max-width: $screen-sm-min) { + @media (max-width: breakpoint-min(md)) { margin-bottom: 1em; } } @@ -82,13 +83,14 @@ margin-top: 2em; + .flex-container { - @media (max-width: $screen-sm-min) { + @media (max-width: breakpoint-min(md)) { flex-direction: column; } } } #sortAndPerPage { border: none; + flex-grow: 1; .search-widgets { margin-bottom: .75em; @@ -96,10 +98,18 @@ .btn { background-color: $very-light-grey; } + + .dropdown-menu { + li > .dropdown-item { + padding: 3px 20px; + font-size: 14px; + } + } + } - .save-widgets { + .save-widgets button { color: $navy-blue; - font-size: 14pt; + font-size: 14px; } #sort-dropdown, @@ -114,23 +124,28 @@ } } #sort-dropdown { - margin-right: 1.5em; + margin-right: 1.5em !important; } - @media (max-width: $screen-md-min) { + @media (max-width: breakpoint-min(lg)) { .search-widgets { text-align: right; } } - @media (max-width: $screen-sm-min) { + @media (max-width: breakpoint-min(md)) { #sort-dropdown { - margin-right: 0; + margin-right: 0 !important; } #search-sort-button, button.submits-batches.submits-batches-add { min-width: 13em; text-align: left !important; + + &::after { + float: right; + margin-top: 0.5em; + } } } } @@ -141,21 +156,23 @@ font-style: italic; height: 54px; - @media (max-width: $screen-md-min) { + @media (max-width: breakpoint-min(lg)) { text-align: center; } } .panel.facet_limit { - background: none; + background: $very-light-grey; border: 2px solid $navy-blue; border-radius: 0; + margin-top: 5px; .panel-heading { - background: none;; + background: none; } .panel-body { background-color: white; + padding: 15px; } } @@ -167,7 +184,20 @@ padding: 1em; } - @media (max-width: $screen-sm-min) { + .facets-toggle { + display: none; + } + + .top-panel-heading { + background: none; + border-bottom: 0; + } + + .more_facets_link { + font-size: 12px; + } + + @media (max-width: breakpoint-min(md)) { background: none; #facet-panel-collapse { display: block; @@ -181,9 +211,6 @@ border: 0; border-top: 2px solid $light-grey; } - .facets-toggle { - display: none; - } } .facets-heading { @@ -207,8 +234,9 @@ form { .input-group { margin: 1em; - margin-bottom: 6em; + margin-bottom: 2.25em; display: block; + width: inherit; button { position: absolute; @@ -220,7 +248,6 @@ height: calc(100% - 16px); margin-top: 8px; margin-bottom: 8px; - border-right: 1px solid $light-grey; } input { background-color: white; @@ -236,6 +263,8 @@ .search-result-wrapper { border-bottom: 0px solid $very-light-grey !important; + margin-bottom: 30px; + overflow: hidden; &:first-child { border-top: 2px solid $very-light-grey; @@ -264,6 +293,10 @@ } span { vertical-align: top; + + span { + margin-left: 2px; + } } i, .children { @@ -271,14 +304,20 @@ } } - .search-results-title-row .search-result-title { - display: inline-block; - margin: 0; - } - .search-results-title-row .label { - margin-left: 15px; + .search-results-title-row { + padding: 0 0 15px; + + .search-result-title { + display: inline-block; + margin: 0; + } + + .badge { + margin-left: 15px; + } } + dl dd ul { padding-left: 0; } @@ -339,38 +378,47 @@ em { div.pagination { display: flex; justify-content: center; + margin: 20px 0; } -ul.pagination li { - &.active span { - background-color: $contrast-orange; - border: none; - color: $navy-blue; - } - &.next span, - &.next a, - &.previous span, - &.previous a { - background: none; - } - &.disabled { - span, - span:hover, - span:focus, - a, - a:hover, - a:focus { - color: $dark-grey; +ol.pagination { + display: flex; + flex-wrap: wrap; + margin-top: 1em; +} +ul.pagination { + align-items: center; + li { + &.active span.page-link { + background-color: $contrast-orange; + border: none; + color: $navy-blue; + } + &.next span, + &.next a, + &.previous span, + &.previous a { + background: none; + } + &.disabled { + span, + span:hover, + span:focus, + a, + a:hover, + a:focus { + color: $dark-grey; + } } - } - a, - span { - background-color: $very-light-grey; - border: none; - margin: 0 .25em; + a, + span { + background-color: $very-light-grey; + border: none; + margin: 0 .25em; + padding: 6px 12px; + } } } - /* Gallery specific */ #content { flex-direction: column; @@ -403,7 +451,7 @@ ul.pagination li { background: none; padding-top: 1em; a { - text-align: left; + text-align: center; img { width: 100%; @@ -514,7 +562,7 @@ ul.pagination li { } } - @media (max-width: $screen-sm-min) { + @media (max-width: breakpoint-min(md)) { h3 { margin: 1em 0; } diff --git a/app/assets/stylesheets/oregon_digital/_sign_up.scss b/app/assets/stylesheets/oregon_digital/_sign_up.scss index 07e48b12c..becc797b5 100644 --- a/app/assets/stylesheets/oregon_digital/_sign_up.scss +++ b/app/assets/stylesheets/oregon_digital/_sign_up.scss @@ -1,5 +1,5 @@ .devise-container { - max-width: $container-tablet; + max-width: map-get($container-max-widths, "md");; margin: auto; .login-footer, @@ -27,7 +27,7 @@ .login-select, .devise-form { - @media (max-width: $screen-xs-max) { + @media (max-width: breakpoint-max(xs)) { ul, .flex-item.action, diff --git a/app/assets/stylesheets/oregon_digital/_work-show.scss b/app/assets/stylesheets/oregon_digital/_work-show.scss index fee11bc5e..c77c594bd 100644 --- a/app/assets/stylesheets/oregon_digital/_work-show.scss +++ b/app/assets/stylesheets/oregon_digital/_work-show.scss @@ -6,20 +6,29 @@ } } -table.table-scrollable { - @media (max-width: $screen-sm-min) { - display: block; - overflow-x: auto; - white-space: nowrap; - height: 100% +caption { + caption-side: unset; +} +table { + .table-scrollable { + @media (max-width: breakpoint-min(sm)) { + display: block; + overflow-x: auto; + white-space: nowrap; + height: 100% + } + } + + &.table thead tr th { + border-top: none; } } .panel-workflow { - .panel-heading { + .card-header { background-color: $contrast-orange; - a { + h2 { color: $navy-blue; } } @@ -33,11 +42,6 @@ table.table-scrollable { margin-top: 25px; } -.delete-button-show-page { - margin-left: 30px; - background-color: #E88F2A; -} - .show-actions { display: flex; justify-content: flex-end; @@ -71,7 +75,7 @@ dl.work-show { column-gap: 1em; overflow-wrap: anywhere; - @media (max-width: $screen-sm-min) { + @media (max-width: breakpoint-min(sm)) { grid-template: auto / max-content auto; } @@ -99,7 +103,7 @@ dl.work-show { column-gap: 2em; margin-bottom: 20px; - @media (max-width: $screen-sm-min) { + @media (max-width: breakpoint-min(sm)) { & { display: block; column-count: 1; @@ -115,18 +119,25 @@ dl.work-show { padding: 14px 0; input { - border-top-right-radius: 0; - border-bottom-right-radius: 0; - // border: ; - border-radius: 5px; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - border-right: 0; height: 38px; + border-radius: 5px; + @media (min-width: breakpoint-min(lg)) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-right: 0; + } + @media (max-width: breakpoint-min(md)) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + border-right: 0; + } } button { - margin-top: -4px; + margin-top: -5px; + @media (max-width: breakpoint-min(lg)) and (min-width: breakpoint-min(md)) { + margin-top: 5px; + } } } @@ -144,7 +155,7 @@ dl.work-show { margin-bottom: 15px; li { - &.active a { + a.active { color: #555555; cursor: default; background-color: #fff; @@ -180,6 +191,7 @@ dl.work-show { margin-right: 2px; line-height: 1.428571429; border: 1px solid transparent; + border-radius: 0; position: relative; display: block; @@ -195,7 +207,7 @@ dl.work-show { } } - @media (max-width: $screen-sm-min) { + @media (max-width: breakpoint-min(sm)) { float: none; display: flex; @@ -255,26 +267,15 @@ dl.work-show { } #work-show-tablist { - @media (max-width: $screen-sm-min) { + @media (max-width: breakpoint-min(sm)) { display: flex; flex-basis: 50%; flex-wrap: wrap; } } -.align-button { - width: 134%; - margin-left: -3px; -} - -.add-to-align { - width: 109%; - margin-left: 7px; +.action-buttons .btn { + min-width: 9em; } - -.print-button { - margin-right: -7px; -} - .no-left-padding { padding-left: 0px; } @@ -310,7 +311,7 @@ dl.work-show { .workflow-actions-button { width: 100%; - background-color:#E88F2A; + background-color:$contrast-orange; } /* Add the blur effect */ @@ -354,6 +355,6 @@ dl.work-show { // CSS for the custom message text box to fit the div .content_alert_box { - width: 100%; + width: 100%; height: 100%; } \ No newline at end of file diff --git a/app/assets/stylesheets/oregon_digital/bootstrap/_modals.scss b/app/assets/stylesheets/oregon_digital/bootstrap/_modals.scss index fd5f2090c..6caf57d1e 100644 --- a/app/assets/stylesheets/oregon_digital/bootstrap/_modals.scss +++ b/app/assets/stylesheets/oregon_digital/bootstrap/_modals.scss @@ -57,8 +57,4 @@ div.collection-list { margin: 2.5em 0 1.5em 0; padding: .5em 2.5em; } - - .login-radio { - margin: 0.25em 0; - } } \ No newline at end of file diff --git a/app/assets/stylesheets/oregon_digital/collections/show.scss b/app/assets/stylesheets/oregon_digital/collections/show.scss index 4fdd4e11f..c8d85dd85 100644 --- a/app/assets/stylesheets/oregon_digital/collections/show.scss +++ b/app/assets/stylesheets/oregon_digital/collections/show.scss @@ -13,7 +13,7 @@ dd { font-size: 16px; margin-left: 5em; - @media (max-width: $screen-sm-min) { + @media (max-width: breakpoint-min(sm)) { grid-column: 1; margin: 0; } @@ -32,7 +32,7 @@ align-items: baseline; justify-content: flex-start; margin-bottom: 1em; - @media (max-width: $screen-sm-min) { + @media (max-width: breakpoint-min(sm)) { display: block; padding-top: 1em; @@ -67,14 +67,14 @@ margin-left: 1em; } .institution-header { - @media (max-width: $screen-md-min) { + @media (max-width: breakpoint-min(md)) { padding-top: 1em; } } .social-media { padding: 0; - @media (max-width: $screen-sm-min) { + @media (max-width: breakpoint-min(sm)) { padding-bottom: 1em; } } @@ -89,7 +89,7 @@ } } - @media (max-width: $screen-sm-min) { + @media (max-width: breakpoint-min(sm)) { display: block; } } @@ -103,7 +103,7 @@ padding: 1em 0; } } - @media (max-width: $screen-sm-min) { + @media (max-width: breakpoint-min(sm)) { margin-top: 1em; .flex-container { @@ -152,7 +152,7 @@ #masonry-sizer { padding: 0; width: 23%; - @media (max-width: $screen-sm-min) { + @media (max-width: breakpoint-min(sm)) { & { width: 48%; } diff --git a/app/assets/stylesheets/oregon_digital/dashboard/_dashboard.scss b/app/assets/stylesheets/oregon_digital/dashboard/_dashboard.scss new file mode 100644 index 000000000..affda7683 --- /dev/null +++ b/app/assets/stylesheets/oregon_digital/dashboard/_dashboard.scss @@ -0,0 +1,6 @@ +// CUSTOM: A custom SCSS file to modify any changes towards the admin dashboard + +// MODIFY: Tell the CSS to not display this button in filter works +#suppressed_bsi { + display: none; +} diff --git a/app/assets/stylesheets/oregon_digital/explore_collections/_actions_list.scss b/app/assets/stylesheets/oregon_digital/explore_collections/_actions_list.scss index d37aa5ed9..e140fe501 100644 --- a/app/assets/stylesheets/oregon_digital/explore_collections/_actions_list.scss +++ b/app/assets/stylesheets/oregon_digital/explore_collections/_actions_list.scss @@ -11,7 +11,7 @@ justify-content: space-between; margin: 0; padding: 0; - @media (max-width: $screen-sm-max) { + @media (max-width: breakpoint-max(sm)) { & { background: $very-light-grey; border-radius: .25em; @@ -28,13 +28,13 @@ input { vertical-align: middle; } - @media (max-width: $screen-sm-max) { + @media (max-width: breakpoint-max(sm)) { & { border-right: 3px solid $light-grey; text-align: center; } } - @media (min-width: $screen-sm-max) { + @media (min-width: breakpoint-max(sm)) { & { max-width: 75px; width: 5%; @@ -52,7 +52,7 @@ height: 1.5em; } - @media (max-width: $screen-sm-max) { + @media (max-width: breakpoint-max(sm)) { & { flex-basis: 100%; flex-wrap: wrap; @@ -84,7 +84,7 @@ min-width: unset; text-align: center; width: 33%; - @media (min-width: $screen-xs-max) and (max-width: $screen-sm-max) { + @media (min-width: breakpoint-max(xs)) and (max-width: breakpoint-max(sm)) { width: unset; } } diff --git a/app/assets/stylesheets/oregon_digital/explore_collections/_buttons.scss b/app/assets/stylesheets/oregon_digital/explore_collections/_buttons.scss index 1915f9b3c..2b79f5bd0 100644 --- a/app/assets/stylesheets/oregon_digital/explore_collections/_buttons.scss +++ b/app/assets/stylesheets/oregon_digital/explore_collections/_buttons.scss @@ -64,7 +64,7 @@ $triangle-size: $block-border-size*4; width:$triangle-size*2; height:$triangle-size*2; overflow:hidden; - position:absolute; + position:relative; visibility: hidden; } .notch::before, @@ -89,12 +89,11 @@ $triangle-size: $block-border-size*4; /* Notch on Bottom Middle */ .notch-xMiddle-yBottom { - bottom:-$triangle-size*2; left:50%; transform:rotate(90deg) translateY(50%); } -@media (min-width: $screen-sm-min) { +@media (min-width: breakpoint-min(md)) { $block-border-size: 5px; $triangle-size: $block-border-size*4; .notch { @@ -113,12 +112,6 @@ $triangle-size: $block-border-size*4; left:-($triangle-size + $block-border-size*2); } - /* Notch on Bottom Middle */ - .notch-xMiddle-yBottom { - bottom:-$triangle-size*2; - // left:50%; - // transform:rotate(90deg) translateY(50%); - } #explore-tabs a { height: 55px; width: 150px; diff --git a/app/assets/stylesheets/oregon_digital/explore_collections/_masonry_view.scss b/app/assets/stylesheets/oregon_digital/explore_collections/_masonry_view.scss index be0e4b1b0..8a1800b39 100644 --- a/app/assets/stylesheets/oregon_digital/explore_collections/_masonry_view.scss +++ b/app/assets/stylesheets/oregon_digital/explore_collections/_masonry_view.scss @@ -6,13 +6,13 @@ border-top: $very-light-grey 2px solid; width: calc(16.666% - 20px); - @media (max-width: $screen-md-min) { + @media (max-width: breakpoint-min(xl)) { & { width: calc(25% - 30px); } } - @media (max-width: $screen-sm-min) { + @media (max-width: breakpoint-min(md)) { & { width: calc(50% - 20px); } @@ -26,13 +26,13 @@ #masonry-gutter-sizer { width: 20px; - @media (max-width: $screen-md-min) { + @media (max-width: breakpoint-min(xl)) { & { width: 30px; } } - @media (max-width: $screen-sm-min) { + @media (max-width: breakpoint-min(md)) { & { width: 40px; } diff --git a/app/assets/stylesheets/oregon_digital/explore_collections/_showcase.scss b/app/assets/stylesheets/oregon_digital/explore_collections/_showcase.scss index bd9a7a1ee..641118753 100644 --- a/app/assets/stylesheets/oregon_digital/explore_collections/_showcase.scss +++ b/app/assets/stylesheets/oregon_digital/explore_collections/_showcase.scss @@ -31,7 +31,7 @@ form#explore-collection-search { #sortAndPerPage.explore-collections-per-page { padding: 2em 0 1em 0; - @media (max-width: $screen-xs-max) { + @media (max-width: breakpoint-max(sm)) { & { padding-left: 2em; padding-right: 2em; @@ -44,7 +44,7 @@ form#explore-collection-search { font-weight: bold; padding-bottom: 2em; - @media (max-width: $screen-sm-max) { + @media (max-width: breakpoint-max(md)) { & { display: block; } @@ -52,27 +52,58 @@ form#explore-collection-search { } .explore-collections-search-widgets { - @media (max-width: $screen-sm-max) { + @media (max-width: breakpoint-max(md)) { & { + display: flex; + flex-direction: column; float: left !important; } } - @media (min-width: $screen-sm-max) { + @media (min-width: breakpoint-max(md)) { transform: 0 15%; } .search-widgets { display: inline-block; + text-align: left; #per_page-dropdown { - margin-right: 1.5em; + margin-right: 1.5em !important; margin-top: 0; } + + .btn-group .dropdown-toggle:focus { + outline: 2px auto Highlight; + outline: 5px auto -webkit-focus-ring-color; + outline: -2px; + } + + .dropdown-item { + font-size: 14px; + } } } } +.view-type .btn-default { + background-color: $very-light-grey; + border-radius: 5px !important; + border: none; + box-shadow: none; + padding: .2em .25em; + padding-top: 0; + font-size: 18pt; + color: $navy-blue !important; + &.active { + background-color: $contrast-orange !important; + } + &.view-type-gallery, + &.view-type-masonry { + margin-left: .5em; + } +} + .very-light-grey-hr { border: 1px solid $very-light-grey; color: $very-light-grey; diff --git a/app/assets/stylesheets/oregon_digital/explore_collections/_table_view.scss b/app/assets/stylesheets/oregon_digital/explore_collections/_table_view.scss index be8eaa46a..79402ee77 100644 --- a/app/assets/stylesheets/oregon_digital/explore_collections/_table_view.scss +++ b/app/assets/stylesheets/oregon_digital/explore_collections/_table_view.scss @@ -2,7 +2,7 @@ table#documents-table { width: 100%; thead th { padding: 2em 0; - @media (max-width: $screen-sm-max) { + @media (max-width: breakpoint-max(md)) { & { position: absolute; width: 1px; @@ -21,7 +21,10 @@ table#documents-table { td { padding: 0.25em 0; } - @media (max-width: $screen-sm-max) { + b { + font-weight: bold; + } + @media (max-width: breakpoint-max(md)) { &, th, td { display: block; } @@ -33,6 +36,7 @@ table#documents-table { margin-top: 1.5em; } th { + max-width: 100%; font-size: 30px; padding: 0; } diff --git a/app/assets/stylesheets/oregon_digital/fonts.scss b/app/assets/stylesheets/oregon_digital/fonts.scss index 84a5fdb7c..f8e5aaa02 100644 --- a/app/assets/stylesheets/oregon_digital/fonts.scss +++ b/app/assets/stylesheets/oregon_digital/fonts.scss @@ -152,6 +152,9 @@ table { .white { color: $white; } +.black { + color: $black; +} .uppercase { text-transform: uppercase; diff --git a/app/assets/stylesheets/oregon_digital/forms.scss b/app/assets/stylesheets/oregon_digital/forms.scss index 9b22516fa..f789fdc49 100644 --- a/app/assets/stylesheets/oregon_digital/forms.scss +++ b/app/assets/stylesheets/oregon_digital/forms.scss @@ -24,4 +24,9 @@ input#file_set_oembed_url { width: 100%; } +} + +.form-group > label { + text-align: unset; + font-weight: bold; } \ No newline at end of file diff --git a/app/assets/stylesheets/oregon_digital/utils.scss b/app/assets/stylesheets/oregon_digital/utils.scss index f3ff757d4..da2cd640a 100644 --- a/app/assets/stylesheets/oregon_digital/utils.scss +++ b/app/assets/stylesheets/oregon_digital/utils.scss @@ -12,7 +12,7 @@ left: 50% !important; transform: translateX(-50%); - @media (max-width: $screen-sm-min) { + @media (max-width: breakpoint-min(sm)) { & { position: relative !important; } diff --git a/app/authorities/qa/authorities/collections.rb b/app/authorities/qa/authorities/collections.rb index 80bacb682..969b0b1c5 100644 --- a/app/authorities/qa/authorities/collections.rb +++ b/app/authorities/qa/authorities/collections.rb @@ -36,7 +36,7 @@ def search_response(controller) access = controller.params[:access] || 'read' search_service(controller).search_results do |builder| - builder.where("#{controller.params[:q]}*") + builder.with(q: "#{controller.params[:q]}*") .with_access(access) .rows(100) end diff --git a/app/builders/hyrax/bootstrap_breadcrumbs_builder.rb b/app/builders/hyrax/bootstrap_breadcrumbs_builder.rb index bcf1b1976..291015bf4 100644 --- a/app/builders/hyrax/bootstrap_breadcrumbs_builder.rb +++ b/app/builders/hyrax/bootstrap_breadcrumbs_builder.rb @@ -16,8 +16,8 @@ class Hyrax::BootstrapBreadcrumbsBuilder < BreadcrumbsOnRails::Breadcrumbs::Buil def render return '' if @elements.blank? - @context.tag.nav(breadcrumbs_options) do - @context.tag.ol do + @context.content_tag(:nav, breadcrumbs_options) do + @context.content_tag(:ol) do safe_join(@elements.uniq.collect { |e| render_element(e) }) end end @@ -27,7 +27,7 @@ def render_element(element) html_class = 'active' if @context.current_page?(compute_path(element)) || element.options['aria-current'] == 'page' element.options['aria-current'] = 'page' if html_class - @context.tag.li(class: html_class) do + @context.content_tag(:li, class: html_class) do @context.link_to(@context.truncate(compute_name(element), length: 30, separator: ' '), compute_path(element), element.options) end end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index ef4867307..42d3331a2 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -14,9 +14,6 @@ class ApplicationController < ActionController::Base with_themed_layout '1_column' - # Hyrax 2.1 migration - skip_after_action :discard_flash_if_xhr - protect_from_forgery with: :exception # Send user to 401/403 page rather than forward with flash message diff --git a/app/controllers/catalog_controller.rb b/app/controllers/catalog_controller.rb index 0f4b347a6..7339a693e 100644 --- a/app/controllers/catalog_controller.rb +++ b/app/controllers/catalog_controller.rb @@ -17,7 +17,6 @@ class CatalogController < ApplicationController # Combine our search queries as they come in def index create_full_size_download_facet - params[:q] = params[:q].join(' AND ') if params[:q].respond_to?('join') super end @@ -94,4 +93,15 @@ def create_full_size_download_facet # rubocop:enable Metrics/MethodLength # rubocop:enable Metrics/CyclomaticComplexity # rubocop:enable Metrics/PerceivedComplexity + + private + + # OVERRIDE FROM BLACKLIGHT: Allow and account for multiple q: query params + # This must be on every controller that uses the layout, because it is used in + # the header to draw Blacklight::SearchNavbarComponent (via the shared/header_navbar template) + # @return [Blacklight::SearchState] a memoized instance of the parameter state. + def search_state + params[:q] = params[:q].join(' AND ') if params[:q].respond_to?('join') + @search_state ||= search_state_class.new(params, blacklight_config, self) + end end diff --git a/app/controllers/concerns/hyrax/dashboard_authorization.rb b/app/controllers/concerns/hyrax/dashboard_authorization.rb index 40c371690..0ce065428 100644 --- a/app/controllers/concerns/hyrax/dashboard_authorization.rb +++ b/app/controllers/concerns/hyrax/dashboard_authorization.rb @@ -24,7 +24,7 @@ def admin def operating_on_user_collection curation_concern ||= params['id'] ? ::SolrDocument.find(params['id']) : nil - (params[:collection_type_gid] || curation_concern&.collection_type_gid) == Hyrax::CollectionType.find_by(machine_id: :user_collection)&.gid&.to_s + (params[:collection_type_gid] || curation_concern&.collection_type_gid) == Hyrax::CollectionType.find_by(machine_id: :user_collection)&.to_global_id&.to_s end end end diff --git a/app/controllers/concerns/oregon_digital/aspace_digital_object_export_behavior.rb b/app/controllers/concerns/oregon_digital/aspace_digital_object_export_behavior.rb index 2e8275096..ac64a5687 100644 --- a/app/controllers/concerns/oregon_digital/aspace_digital_object_export_behavior.rb +++ b/app/controllers/concerns/oregon_digital/aspace_digital_object_export_behavior.rb @@ -5,7 +5,7 @@ module OregonDigital module AspaceDigitalObjectExportBehavior def show_do_export @importer = Bulkrax::Importer.find(params[:importer_id]) - render plain: export + render json: export end def export @@ -27,8 +27,7 @@ def process_entries end def build(pid) - work = Hyrax.query_service.find_by_alternate_identifier(alternate_identifier: pid) - ado = OregonDigital::AspaceDigitalObject.new(work) + ado = OregonDigital::AspaceDigitalObject.new(pid) ado.build_record ado end @@ -43,7 +42,7 @@ def push(ado) def format_result result[:errors] = errors - JSON.generate(@result) + JSON.dump(result) end def errors diff --git a/app/controllers/concerns/oregon_digital/blacklight_config_behavior.rb b/app/controllers/concerns/oregon_digital/blacklight_config_behavior.rb index 1992dfab1..8dc690164 100644 --- a/app/controllers/concerns/oregon_digital/blacklight_config_behavior.rb +++ b/app/controllers/concerns/oregon_digital/blacklight_config_behavior.rb @@ -37,13 +37,12 @@ def self.modified_field config.advanced_search[:url_key] ||= 'advanced' config.advanced_search[:query_parser] ||= 'dismax' config.advanced_search[:form_solr_parameters] ||= { - 'facet.field' => %w[non_user_collections_ssim copyright_combined_label_sim date_combined_year_label_ssim institution_label_sim language_label_sim] + 'facet.field' => %w[non_user_collections_label_ssim non_user_collections_ssim copyright_combined_label_sim date_combined_year_label_ssim institution_label_sim language_label_sim] } config.advanced_search[:form_facet_partial] = 'advanced_search_facets_as_select' config.view.list.partials = %i[thumbnail index_header index] config.view.gallery.partials = %i[metadata] - config.view.gallery.icon_class = 'fa fa-trello fa-lg' config.view.gallery.if = true config.view.slideshow.partials = %i[index] config.view.slideshow.if = false @@ -54,6 +53,9 @@ def self.modified_field config.http_method = :post config.per_page = [20, 60, 100] + config.add_results_collection_tool(:sort_widget) + config.add_results_collection_tool(:per_page_widget) + ## Default parameters to send to solr for all search-like requests. See also SolrHelper#solr_search_params config.default_solr_params = { qt: 'search', @@ -67,7 +69,7 @@ def self.modified_field config.index.thumbnail_field = 'thumbnail_path_ss' # Remove the view type selector (masonry, grid, list, etc) from the sort/show section so we can add it somewhere else - config.index.collection_actions.delete_field 'view_type_group' + # config.index.collection_actions.delete_field 'view_type_group' # The generic_type isn't displayed on the facet list # It's used to give a label to the filter that comes from the user profile @@ -201,6 +203,7 @@ def self.modified_field http\://creativecommons.org/publicdomain/zero/1.0/ OR http\://creativecommons.org/publicdomain/mark/1.0/)' } } + config.add_facet_field 'copyright_combined_label_sim', label: I18n.translate('simple_form.labels.defaults.copyright_combined'), index_range: 'A'..'Z', limit: 5 config.add_facet_field 'file_format_sim', label: I18n.translate('simple_form.labels.defaults.file_format'), index_range: 'A'..'Z', limit: 5 config.add_facet_field 'resource_type_label_sim', label: I18n.translate('simple_form.labels.defaults.resource_type_label'), index_range: 'A'..'Z', limit: 5 @@ -212,12 +215,12 @@ def self.modified_field config.add_facet_field 'location_combined_label_sim', label: I18n.translate('simple_form.labels.defaults.location_combined'), index_range: 'A'..'Z', limit: 5 config.add_facet_field 'workType_label_sim', label: I18n.translate('simple_form.labels.defaults.workType'), index_range: 'A'..'Z', limit: 5 config.add_facet_field 'language_label_sim', label: I18n.translate('simple_form.labels.defaults.language'), index_range: 'A'..'Z', limit: 5 - config.add_facet_field 'non_user_collections_ssim', limit: 5, label: 'Collection', helper_method: 'collection_title_from_id', index_range: 'A'..'Z' + config.add_facet_field 'non_user_collections_label_ssim', label: 'Collection', helper_method: 'collection_title_modify', index_range: 'A'..'Z', limit: 5 config.add_facet_field 'local_collection_name_label_sim', label: I18n.translate('simple_form.labels.defaults.local_collection'), index_range: 'A'..'Z', limit: 5 - config.add_facet_field 'institution_label_sim', limit: 5, label: 'Institution', index_range: 'A'..'Z' + config.add_facet_field 'institution_label_sim', label: 'Institution', index_range: 'A'..'Z', limit: 5 + config.add_facet_field 'cultural_context_label_sim', label: I18n.translate('simple_form.labels.defaults.cultural_context_label'), index_range: 'A'..'Z', limit: 5 config.add_facet_field 'local_contexts_label_sim', label: I18n.translate('simple_form.labels.defaults.local_contexts'), index_range: 'A'..'Z', limit: 5 - config.add_facet_field 'former_owner_sim', label: I18n.translate('simple_form.labels.defaults.former_owner'), index_range: 'A'..'Z', limit: 5 config.add_facet_field 'mode_of_issuance_sim', label: I18n.translate('simple_form.labels.defaults.mode_of_issuance'), index_range: 'A'..'Z', limit: 5 config.add_facet_field 'box_number_sim', label: I18n.translate('simple_form.labels.defaults.box_number'), index_range: 'A'..'Z', limit: 5 @@ -229,6 +232,9 @@ def self.modified_field config.add_facet_field 'series_number_sim', label: I18n.translate('simple_form.labels.defaults.series_number'), index_range: 'A'..'Z', limit: 5 config.add_facet_field 'exhibit_sim', label: I18n.translate('simple_form.labels.defaults.exhibit'), index_range: 'A'..'Z', limit: 5 + config.add_facet_field 'non_user_collections_ssim', label: 'Collection', show: false + config.add_facet_field 'user_collections_ssim', label: 'User Collection', show: false + # Iterate all metadata and facet the properties that are configured for facets and not facetable yet # Do not show these facets, they're for collection configurable facets (Generic::ORDERED_PROPERTIES + Generic::UNORDERED_PROPERTIES).each do |prop| diff --git a/app/controllers/concerns/oregon_digital/importer_controller_behavior.rb b/app/controllers/concerns/oregon_digital/importer_controller_behavior.rb index 34e16bbe2..b3629be32 100644 --- a/app/controllers/concerns/oregon_digital/importer_controller_behavior.rb +++ b/app/controllers/concerns/oregon_digital/importer_controller_behavior.rb @@ -3,21 +3,6 @@ module OregonDigital # adds custom behavior to bulkrax importer module ImporterControllerBehavior - def show_errors - @importer = Bulkrax::Importer.find(params[:importer_id]) - @errors = compile_errors - render 'oregon_digital/importer/show_errors' - end - - def verify - @importer = Bulkrax::Importer.find(params[:importer_id]) - bvs = OregonDigital::BatchVerificationService.new(work_ids.map { |x| x[:work_id] }.reject(&:nil?)) - bvs.verify - redirect_to importer_path(@importer.id), notice: 'Verification jobs are enqueued. Jobs may be delayed depending on number/type of jobs already enqueued; please wait 5-10 minutes before checking results.' - end - - # returns an array of hashes, eg { work_id: 'abcde1234', entry_identifier: '80-101' } - # if solr returns an empty array, the work_id will be nil def work_ids ids = [] @importer.entries.pluck(:identifier).each do |i| @@ -27,24 +12,27 @@ def work_ids ids end - def compile_errors - errors = {} - work_ids.each do |item| - if item[:work_id].nil? - errors[item[:entry_identifier]] = { solr: ['Unable to load work for this entry.'] } - else - errors[item[:work_id]] = retrieve_errors(item[:work_id]) - end - end - errors + # show_errors?importer_id=9&time=202504011111 + def show_errors + render file: report_path, layout: false, content_type: 'application/json' + end + + def report_path + File.join(OD2::Application.config.local_path, "verify/batch_#{params[:importer_id]}_report_#{params[:time]}.json") end - def retrieve_errors(id) - work = Hyrax.query_service.find_by_alternate_identifier(alternate_identifier: id) - work.all_errors - rescue Valkyrie::Persistence::ObjectNotFoundError - { valkyrie: ['Unable to load work.'] } + # rubocop:disable Metrics/AbcSize + def verify + @importer = Bulkrax::Importer.find(params[:importer_id]) + Redis.current.del("verify_count:#{@importer.id}") + ids = work_ids.map { |x| x[:work_id] }.reject(&:nil?) + redirect_to(importer_path(@importer.id), notice: 'Unable to find any items to verify.') and return if ids.empty? + + bvs = OregonDigital::BatchVerificationService.new(ids, { batch_id: @importer.id, user_mail: current_user.email, size: ids.size, reporter: 'OregonDigital::ImporterVerificationReporter' }) + bvs.verify + redirect_to importer_path(@importer.id), notice: 'Verification jobs are enqueued. Jobs may be delayed depending on number/type of jobs already enqueued; an email will be sent to you when the report is complete.' end + # rubocop:enable Metrics/AbcSize def importers_list render 'oregon_digital/importer/importers_list' diff --git a/app/controllers/concerns/oregon_digital/work_relation_pagination_behavior.rb b/app/controllers/concerns/oregon_digital/work_relation_pagination_behavior.rb index ce6c4e6f0..4bfc87ad2 100644 --- a/app/controllers/concerns/oregon_digital/work_relation_pagination_behavior.rb +++ b/app/controllers/concerns/oregon_digital/work_relation_pagination_behavior.rb @@ -3,6 +3,7 @@ module OregonDigital # Behavior for displaying relationships with pagination module WorkRelationPaginationBehavior + COUNT = 4 # Include 'catalog' in the search path for views, while prefering # our local paths. Thus we are unable to just override `self.local_prefixes` def _prefixes @@ -13,39 +14,79 @@ def _prefixes # Finds a solr document matching the id and sets @presenter # @raise CanCan::AccessDenied if the document is not found or the user doesn't have access to it. def show - blacklight_config.per_page = [4] + blacklight_config.per_page = [COUNT] parent_results sibling_results child_results + ordered_child_results @search_builder_class = Hyrax::WorkSearchBuilder super end # Pass work to relationship search builders def search_builder - work ||= ::SolrDocument.find(params['id']) search_builder_class == Hyrax::WorkSearchBuilder ? search_builder_class.new(self) : search_builder_class.new(self, work: work) end + def work + @work ||= begin + doc = ::SolrDocument.find(params['id']) + Hyrax::SolrDocument::OrderedMembers.decorate(doc) + end + end + # Get all parent documents def parent_results @search_builder_class = OregonDigital::ParentsOfWorkSearchBuilder - params[:page] = params[:parent_page] - (@parent_response, @parent_doc_list) = search_results(params) + (@parent_response, @parent_doc_list) = search_service.search_results do + search_builder.page(params[:parent_page] || 1) + end end # Get all sibling documents def sibling_results @search_builder_class = OregonDigital::SiblingsOfWorkSearchBuilder params[:page] = params[:sibling_page] - (@sibling_response, @sibling_doc_list) = search_results(params) + (@sibling_response, @sibling_doc_list) = search_service.search_results do + search_builder.page(params[:sibling_page] || 1) + end end - # get all child documents + # get all child works for response def child_results @search_builder_class = OregonDigital::ChildrenOfWorkSearchBuilder - params[:page] = params[:child_page] - (@child_response, @child_doc_list) = search_results(params) + (@child_response,) = search_service.search_results do + search_builder.page(params[:child_page] || 1) + end + # handle pagination if some assets will be restricted for some reason + @child_response['response']['numFound'] = work.ordered_member_ids.count + @child_response['response']['start'] = start(params[:child_page]) + end + + # hacky method for getting one page of child docs in order + def ordered_child_results + @child_doc_list = [] + return unless @child_response['response']['numFound'].positive? + + @search_builder_class = OregonDigital::OrderedChildrenOfWorkSearchBuilder + (_, @child_doc_list) = search_service.search_results do + search_builder + end + @child_doc_list = sort_by_ordered(@child_doc_list, start(params[:child_page])) + end + + def sort_by_ordered(doc_list, start_ind) + ordered_docs = [] + work.ordered_member_ids.slice(start_ind, COUNT).each do |id| + ordered_docs << doc_list.find { |x| x['id'] == id } + end + ordered_docs.compact + end + + def start(page) + return 0 if page.nil? + + (page.to_i - 1) * COUNT end end end diff --git a/app/controllers/concerns/oregon_digital/works_controller_behavior.rb b/app/controllers/concerns/oregon_digital/works_controller_behavior.rb index 03779698f..6ba01c9cb 100644 --- a/app/controllers/concerns/oregon_digital/works_controller_behavior.rb +++ b/app/controllers/concerns/oregon_digital/works_controller_behavior.rb @@ -27,12 +27,14 @@ def create # This helps failed form submissions to return to the form and display errors params[hash_key_for_curation_concern][:member_of_collection_ids] = nil if params[hash_key_for_curation_concern][:member_of_collection_ids].empty? set_permissions_to_work + set_content_alert super end # MODIFY: Add in a special method to help on updating the permissions def update set_permissions_to_work + set_content_alert super end @@ -55,6 +57,11 @@ def set_permissions_to_work end # rubocop:enable Metrics/AbcSize + # METHOD: Check for mask_content not being check + def set_content_alert + curation_concern.content_alert = nil if params[hash_key_for_curation_concern][:mask_content]&.all?(&:blank?) + end + def after_update_response OregonDigital::PermissionChangeEventJob.perform_later(curation_concern, current_user) if permissions_changed? super diff --git a/app/controllers/hyrax/homepage_controller.rb b/app/controllers/hyrax/homepage_controller.rb index fbea95d27..68ca0a9a4 100644 --- a/app/controllers/hyrax/homepage_controller.rb +++ b/app/controllers/hyrax/homepage_controller.rb @@ -4,15 +4,8 @@ class Hyrax::HomepageController < ApplicationController # Adds Hydra behaviors into the application controller include Blacklight::SearchContext - include Blacklight::SearchHelper include Blacklight::AccessControls::Catalog - # The search builder for finding recent documents - # Override of Blacklight::RequestBuilders - def search_builder_class - Hyrax::HomepageSearchBuilder - end - class_attribute :presenter_class self.presenter_class = Hyrax::HomepagePresenter layout 'homepage' @@ -33,11 +26,11 @@ def index # Return 8 collections def collections(rows: 8) # TODO: set CollectionSearchBuilder to retrieve collections from a curated list, instead of newest collections - builder = OregonDigital::NonUserCollectionsSearchBuilder.new(self) - .rows(rows) - .merge(sort: sort_field) - response = repository.search(builder) - response.documents + Hyrax::CollectionsService.list_search_builder_class = OregonDigital::NonUserCollectionsSearchBuilder + Hyrax::CollectionsService.new(self).search_results do |builder| + builder.rows(rows) + builder.merge(sort: sort_field) + end rescue Blacklight::Exceptions::ECONNREFUSED, Blacklight::Exceptions::InvalidRequest [] end @@ -45,11 +38,18 @@ def collections(rows: 8) def recent # OVERRIDE FROM HYRAX to increase number of recent document rows # grab any recent documents - (_, @recent_documents) = search_results(q: '', sort: sort_field, rows: 6) + (_, @recent_documents) = search_service.search_results do |builder| + builder.rows(6) + builder.merge(sort: sort_field) + end rescue Blacklight::Exceptions::ECONNREFUSED, Blacklight::Exceptions::InvalidRequest @recent_documents = [] end + def search_service + Hyrax::SearchService.new(config: blacklight_config, user_params: { q: '' }, scope: self, search_builder_class: Hyrax::HomepageSearchBuilder) + end + def sort_field 'system_create_dtsi desc' end diff --git a/app/controllers/hyrax/my/works_controller.rb b/app/controllers/hyrax/my/works_controller.rb new file mode 100644 index 000000000..d73053473 --- /dev/null +++ b/app/controllers/hyrax/my/works_controller.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +module Hyrax + module My + # OVERRIDE: Override the default Works Controller to modify the works filter layout + class WorksController < MyController + # Define collection specific filter facets. + def self.configure_facets + configure_blacklight do |config| + config.search_builder_class = Hyrax::My::WorksSearchBuilder + config.add_facet_field 'admin_set_sim', limit: 5 + config.add_facet_field 'member_of_collections_ssim', limit: 5 + + # ADD: Add in a new field 'Workflow State' to the works filter list + config.add_facet_field 'workflow_state_name_ssim', label: I18n.translate('blacklight.search.fields.facet.workflow_state_name_ssim'), helper_method: :workflow_state_display + end + end + configure_facets + + class_attribute :create_work_presenter_class + self.create_work_presenter_class = Hyrax::SelectTypeListPresenter + + # rubocop:disable Metrics/AbcSize + def index + # The user's collections for the "add to collection" form + @user_collections = collections_service.search_results(:deposit) + + add_breadcrumb t(:'hyrax.controls.home'), root_path + add_breadcrumb t(:'hyrax.dashboard.breadcrumbs.admin'), hyrax.dashboard_path + add_breadcrumb t(:'hyrax.admin.sidebar.works'), hyrax.my_works_path + managed_works_count + @create_work_presenter = create_work_presenter_class.new(current_user) + super + end + # rubocop:enable Metrics/AbcSize + + private + + def collections_service + Hyrax::CollectionsService.new(self) + end + + def search_action_url(*args) + hyrax.my_works_url(*args) + end + + # The url of the "more" link for additional facet values + def search_facet_path(args = {}) + hyrax.my_dashboard_works_facet_path(args[:id]) + end + + def managed_works_count + @managed_works_count = Hyrax::Works::ManagedWorksService.managed_works_count(scope: self) + end + end + end +end diff --git a/app/controllers/oregon_digital/explore_collections_controller.rb b/app/controllers/oregon_digital/explore_collections_controller.rb index 00a69bd0d..67dee8ab7 100644 --- a/app/controllers/oregon_digital/explore_collections_controller.rb +++ b/app/controllers/oregon_digital/explore_collections_controller.rb @@ -26,10 +26,10 @@ def page_title configure_blacklight do |config| config.view.gallery.if = false config.view.list.if = false - config.view.table.partials = %i[index] - config.view.table.icon_class = 'glyphicon-th-list' + config.view.tables.partials = %i[metadata index table] + config.view.tables.template = 'document_tables' + config.view.masonry(document_component: Blacklight::Gallery::DocumentComponent) config.view.masonry.partials = %i[metadata] - config.view.masonry.icon_class = 'fa fa-trello fa-lg' config.sort_fields.except! 'score desc, system_create_dtsi desc', 'date_dtsi desc', 'date_dtsi asc', 'system_create_dtsi desc' config.sort_fields['title_ssort desc'][:label] = 'Z-A' @@ -40,7 +40,7 @@ def page_title def all @tab = TABS[:all] blacklight_config.search_builder_class = OregonDigital::NonUserCollectionsSearchBuilder - (@response, @document_list) = search_results(params) + (@response, @document_list) = search_service.search_results build_breadcrumbs render :index end @@ -48,7 +48,7 @@ def all def osu @tab = TABS[:osu] blacklight_config.search_builder_class = OregonDigital::OsuCollectionsSearchBuilder - (@response, @document_list) = search_results(params) + (@response, @document_list) = search_service.search_results build_breadcrumbs render :index end @@ -56,7 +56,7 @@ def osu def uo @tab = TABS[:uo] blacklight_config.search_builder_class = OregonDigital::UoCollectionsSearchBuilder - (@response, @document_list) = search_results(params) + (@response, @document_list) = search_service.search_results build_breadcrumbs render :index end @@ -64,7 +64,7 @@ def uo def my @tab = TABS[:my] blacklight_config.search_builder_class = OregonDigital::MyCollectionsSearchBuilder - (@response, @document_list) = search_results(params) + (@response, @document_list) = search_service.search_results build_breadcrumbs render :index end @@ -106,7 +106,11 @@ def build_breadcrumbs all: 'all', osu: 'osu', uo: 'uo', - my: 'my collections' + my: 'my' }.freeze + + def search_service + Hyrax::SearchService.new(config: blacklight_config, user_params: params, scope: self, search_builder_class: blacklight_config.search_builder_class) + end end end diff --git a/app/controllers/oregon_digital/oembeds_controller.rb b/app/controllers/oregon_digital/oembeds_controller.rb index eeb3cd967..eb4871854 100644 --- a/app/controllers/oregon_digital/oembeds_controller.rb +++ b/app/controllers/oregon_digital/oembeds_controller.rb @@ -16,15 +16,19 @@ def index @errors = OembedError.all end + # rubocop:disable Metrics/AbcSize def edit load_curation_concern - authorize! :edit, @curation_concern + return unless can? :edit, @curation_concern + + # authorize! :edit, @curation_concern add_breadcrumb t(:'hyrax.controls.home'), root_path add_breadcrumb t(:'hyrax.dashboard.breadcrumbs.admin'), hyrax.dashboard_path add_breadcrumb t(:'oregon_digital.oembeds.index.manage_oembeds'), Rails.application.routes.url_helpers.oembeds_path add_breadcrumb t(:'oregon_digital.oembeds.edit.oembed_update'), '#' end + # rubocop:enable Metrics/AbcSize def load_curation_concern @curation_concern = Hyrax.query_service.find_by_alternate_identifier(alternate_identifier: params[:id]) diff --git a/app/controllers/saved_searches_controller.rb b/app/controllers/saved_searches_controller.rb deleted file mode 100644 index 80d29eb53..000000000 --- a/app/controllers/saved_searches_controller.rb +++ /dev/null @@ -1,8 +0,0 @@ -# frozen_string_literal: true - -# Controller for saved searches provided by blacklight_advanced_search -class SavedSearchesController < ApplicationController - include Blacklight::SavedSearches - - helper BlacklightAdvancedSearch::RenderConstraintsOverride -end diff --git a/app/helpers/oregon_digital/hyrax_helper_behavior.rb b/app/helpers/oregon_digital/hyrax_helper_behavior.rb index cb73db60d..b848ce820 100644 --- a/app/helpers/oregon_digital/hyrax_helper_behavior.rb +++ b/app/helpers/oregon_digital/hyrax_helper_behavior.rb @@ -22,8 +22,9 @@ def iconify_auto_link_with_highlight(field, show_link = true) sanitize combine_hits_with_links(html_content, show_link) end - def collection_title_from_id(field, _show_link = true) - SolrDocument.find(field).title_or_label + # METHOD: Modify the string of collection title so it can display correctly + def collection_title_modify(field, _show_link = true) + field.match?(/^\[.*\]$/) ? field.gsub(/^\[|\]$/, '') : field end # @return [String] the appropriate action url for our search form (depending on our current page) diff --git a/app/helpers/oregon_digital/my/dashboard_works_helper.rb b/app/helpers/oregon_digital/my/dashboard_works_helper.rb new file mode 100644 index 000000000..1bdba75ef --- /dev/null +++ b/app/helpers/oregon_digital/my/dashboard_works_helper.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module OregonDigital + module My + # MODULE: A custom works dashboard helper for display filter works + module DashboardWorksHelper + # METHOD: Create a method to change the display value for the workflow state + def workflow_state_display(value) + { + 'deposited' => 'Published', + 'pending_review' => 'Under Review', + 'tombstoned' => 'Tombstoned' + }[value] || value.titleize # Fallback to titleized value + end + end + end +end diff --git a/app/indexers/generic_indexer.rb b/app/indexers/generic_indexer.rb index 4d9b08d80..444ffbc83 100644 --- a/app/indexers/generic_indexer.rb +++ b/app/indexers/generic_indexer.rb @@ -9,11 +9,23 @@ class GenericIndexer < Hyrax::WorkIndexer include OregonDigital::StripsStopwords include OregonDigital::ParsableLabelBehavior + # Valkyrie compatibility hack to allow Hyrax.indexing_adapter to see AF based indexers + def initialize(obj) + obj = obj[:resource] if obj.is_a?(Hash) && obj.key?(:resource) + super(obj) + end + + # Valkyrie compatibility hack to allow Hyrax.indexing_adapter to see AF based indexers + def to_solr + generate_solr_document + end + # ABC Size is hard to avoid here because there are many types of fields we need to index. # Pulling them out of #generate_solr_document and creating their own methods causes this issue to # propogate downwards. # rubocop:disable Metrics/AbcSize # rubocop:disable Metrics/MethodLength + # rubocop:disable Metrics/BlockLength def generate_solr_document super.tap do |solr_doc| index_rights_statement_label(solr_doc, object) @@ -25,6 +37,7 @@ def generate_solr_document index_local_contexts_label(solr_doc, object) index_sort_options(solr_doc) label_fetch_properties_solr_doc(object, solr_doc) + solr_doc['non_user_collections_label_ssim'] = [] solr_doc['non_user_collections_ssim'] = [] solr_doc['user_collections_ssim'] = [] solr_doc['oai_collections_ssim'] = [] @@ -32,6 +45,7 @@ def generate_solr_document collection_index_key = collection_indexing_key(collection.collection_type.machine_id) solr_doc[collection_index_key] << collection.id solr_doc[collection_index_key.gsub('_ssim', '_tesim')] = collection.title + solr_doc['non_user_collections_label_ssim'] << collection.title if collection_index_key == 'non_user_collections_ssim' end # removing index_topic_combined_label(solr_doc, object.keyword) # will be handled when indexing fetched labels @@ -47,6 +61,7 @@ def generate_solr_document end # rubocop:enable Metrics/AbcSize # rubocop:enable Metrics/MethodLength + # rubocop:enable Metrics/BlockLength def collection_indexing_key(machine_id) case machine_id diff --git a/app/jobs/bulkrax/export_work_job.rb b/app/jobs/bulkrax/export_work_job.rb new file mode 100644 index 000000000..ec87aa93c --- /dev/null +++ b/app/jobs/bulkrax/export_work_job.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +module Bulkrax + class ExportWorkJob < ApplicationJob + queue_as :export + + def perform(*args) + entry = Entry.find(args[0]) + exporter_run = ExporterRun.find(args[1]) + begin + entry.build + entry.save + rescue StandardError + # rubocop:disable Rails/SkipsModelValidations + ExporterRun.increment_counter(:failed_records, args[1]) + ExporterRun.decrement_counter(:enqueued_records, args[1]) unless exporter_run.reload.enqueued_records <= 0 + raise + else + if entry.failed? + ExporterRun.increment_counter(:failed_records, args[1]) + ExporterRun.decrement_counter(:enqueued_records, args[1]) unless exporter_run.reload.enqueued_records <= 0 + raise entry.reload.current_status.error_class.constantize + else + ExporterRun.increment_counter(:processed_records, args[1]) + ExporterRun.decrement_counter(:enqueued_records, args[1]) unless exporter_run.reload.enqueued_records <= 0 + end + # rubocop:enable Rails/SkipsModelValidations + end + return entry if exporter_run.reload.enqueued_records.positive? + + if exporter_run.failed_records.positive? + exporter_run.exporter.set_status_info('Complete (with failures)') + else + exporter_run.exporter.set_status_info('Complete') + end + + return entry + end + end +end diff --git a/app/jobs/oregon_digital/verify_work_job.rb b/app/jobs/oregon_digital/verify_work_job.rb index 49c2604b3..aad5f408d 100644 --- a/app/jobs/oregon_digital/verify_work_job.rb +++ b/app/jobs/oregon_digital/verify_work_job.rb @@ -6,9 +6,29 @@ module OregonDigital class VerifyWorkJob < ApplicationJob queue_as :verify + # rubocop:disable Style/GuardClause + after_perform do |job| + args = job.arguments.first + count = Redis.current.incr("verify_count:#{args[:batch_id]}") + if count >= args[:size] + follow_up(args) + Redis.current.expire("verify_count:#{args[:batch_id]}", 5) + end + end + def perform(args) service = OregonDigital::VerifyWorkService.new(args) service.run end + + def follow_up(args) + unless args[:reporter].nil? + datetime_today = Time.zone.now.strftime('%Y%m%d%H%M') # '201710211259' + reporter = args[:reporter].constantize.new(args[:batch_id], datetime_today) + reporter.write_report + reporter.notify_user(args[:user_mail]) + end + end + # rubocop:enable Style/GuardClause end end diff --git a/app/mailers/oregon_digital/failed_fetch_mailer.rb b/app/mailers/oregon_digital/failed_fetch_mailer.rb new file mode 100644 index 000000000..6c900efff --- /dev/null +++ b/app/mailers/oregon_digital/failed_fetch_mailer.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module OregonDigital + # MAILER: Email user/metadata team for failed fetch cv + class FailedFetchMailer < ApplicationMailer + # METHOD: Create an email and send a report to the user + # rubocop:disable Metrics/AbcSize + def failed_fetch_email + if params[:to] == 'kevin.jones@oregonstate.edu' + file_path = "#{Rails.root.join('tmp')}/#{params[:filename]}" + attachments[params[:filename]] = File.read(file_path) if File.exist?(file_path) + else + file_text = "#{Rails.root.join('tmp', 'failed_fetch')}/#{params[:filename]}" + attachments[params[:filename]] = File.read(file_text) if File.exist?(file_text) + end + + mail(to: params[:to], subject: 'Oregon Digital: Failed Fetch Notice') + end + # rubocop:enable Metrics/AbcSize + end +end diff --git a/app/mailers/oregon_digital/notification_mailer.rb b/app/mailers/oregon_digital/notification_mailer.rb index 8d61c7257..bbcb669f6 100644 --- a/app/mailers/oregon_digital/notification_mailer.rb +++ b/app/mailers/oregon_digital/notification_mailer.rb @@ -3,11 +3,11 @@ module OregonDigital # Emails users that have reviews to do class NotificationMailer < ApplicationMailer + default from: 'noreply@oregondigital.org' def notification_email - @user = params[:user] - @need_keyword = params[:need_keyword] - @url = 'http://oregondigital.org/notifications' - mail(to: @user.email, subject: "Required #{@need_keyword} in Oregon Digital") + @email = params[:email] + @message = params[:message] + mail(to: @email, subject: 'Required Actions in Oregon Digital') end end end diff --git a/app/models/collection_representative.rb b/app/models/collection_representative.rb index b06d9f327..2acd0c915 100644 --- a/app/models/collection_representative.rb +++ b/app/models/collection_representative.rb @@ -4,5 +4,7 @@ class CollectionRepresentative < ApplicationRecord def fs_title fileset_id.empty? ? '' : Hyrax.query_service.find_by_alternate_identifier(alternate_identifier: fileset_id, use_valkyrie: false).title.first + rescue Ldp::Gone + '' end end diff --git a/app/models/concerns/oregon_digital/uri_methods.rb b/app/models/concerns/oregon_digital/uri_methods.rb index 3385a32de..ede5273e8 100644 --- a/app/models/concerns/oregon_digital/uri_methods.rb +++ b/app/models/concerns/oregon_digital/uri_methods.rb @@ -1,10 +1,11 @@ # frozen_string_literal: true +require 'uri' module OregonDigital # create urls needed to point to asset show pages and representative images module UriMethods def iiif_url(pid) - "https://iiif.oregondigital.org/iiif/#{bucket_path(pid)}-jp2.jp2/full/430,/0/default.jpg" + URI.join(iiif_server, bucket_path(pid) + '-jp2.jp2/full/430,/0/default.jpg').to_s end def bucket_path(pid) @@ -12,43 +13,48 @@ def bucket_path(pid) end def iiif_doc_url(pid) - "https://iiif.oregondigital.org/iiif/#{bucket_path(pid)}-jp2-0000.jp2/full/430,/0/default.jpg" + URI.join(iiif_server, bucket_path(pid) + '-jp2-0000.jp2/full/430,/0/default.jpg').to_s end def show_url(klass, pid) - "https://oregondigital.org/concern/#{klass}/#{pid}" + URI.join(app_base_url, "concern/#{klass}/#{pid}").to_s end def video_thumb(pid) doc = Hyrax::SolrService.query("id:#{pid}", rows: 1).first - "https://oregondigital.org#{doc['thumbnail_path_ss']}" + URI.join(app_base_url, doc['thumbnail_path_ss']).to_s end - # rubocop:disable Metrics/AbcSize - def assign_uris(item) - @asset_show_uri = show_url(item.class.to_s.downcase + 's', item.id.to_s) - return image_uri(item) unless item.class.to_s == 'Generic' + # requires solr document to be decorated, i.e. + # Hyrax::SolrDocument::OrderedMembers.decorate(doc) + def assign_uris(doc) + @asset_show_uri = show_url(doc['has_model_ssim'].first.downcase + 's', doc['id']) + return image_uri(doc) unless doc['has_model_ssim'].first == 'Generic' - return if item.member_ids.blank? + return if doc.ordered_member_ids.blank? - image_uri(query(item.member_ids.first.to_s)) + chdoc = SolrDocument.find(doc.ordered_member_ids.first) + image_uri(chdoc) end - # rubocop:enable Metrics/AbcSize - def query(pid) - Hyrax.query_service.find_by_alternate_identifier(alternate_identifier: pid) + def iiif_server + ENV.fetch('IIIF_SERVER_BASE_URL') end - def image_uri(item) - return if item.member_ids.blank? + def app_base_url + Rails.application.routes.url_helpers.root_url + end + + def image_uri(doc) + return if doc['member_ids_ssim'].blank? - case item.class.to_s + case doc['has_model_ssim'].first when 'Image' - @asset_image_uri = iiif_url(item.member_ids.first.to_s) + @asset_image_uri = iiif_url(doc['member_ids_ssim'].first) when 'Document' - @asset_image_uri = iiif_doc_url(item.member_ids.first.to_s) + @asset_image_uri = iiif_doc_url(doc['member_ids_ssim'].first) when 'Video' - @asset_image_uri = video_thumb(item.member_ids.first.to_s) + @asset_image_uri = video_thumb(doc['member_ids_ssim'].first) end end end diff --git a/app/models/oai_set.rb b/app/models/oai_set.rb index e1ddf1f42..0bd1799fc 100644 --- a/app/models/oai_set.rb +++ b/app/models/oai_set.rb @@ -46,7 +46,7 @@ def initialize(spec, opts = {}) def name_from_spec collection = Collection.find @spec - return nil if collection.collection_type.gid != Hyrax::CollectionType.find_by(machine_id: :oai_set).gid.to_s + return nil if collection.collection_type.to_global_id.to_s != Hyrax::CollectionType.find_by(machine_id: :oai_set).to_global_id.to_s ActiveFedora::SolrService.query("id:#{@spec}", rows: 1).first['title_tesim'].first end diff --git a/app/models/oregon_digital/aspace_digital_object.rb b/app/models/oregon_digital/aspace_digital_object.rb index cc8913073..671e8b621 100644 --- a/app/models/oregon_digital/aspace_digital_object.rb +++ b/app/models/oregon_digital/aspace_digital_object.rb @@ -11,37 +11,40 @@ class AspaceDigitalObject # jsonmodel_type, extents, lang_materials, dates, is_slug_auto, # file_versions, restrictions, title, digital_object_id # image_uri is the iiif path, show_uri is the show page - attr_accessor :asset_image_uri, :asset_show_uri, :work, :errors - def initialize(work) - @work = work + attr_accessor :asset_image_uri, :asset_show_uri, :doc, :errors + def initialize(pid) + @doc = Hyrax::SolrDocument::OrderedMembers.decorate(SolrDocument.find(pid)) @errors = [] end def json - JSON.generate(record) + JSON.dump(record) end # rubocop:disable Metrics/AbcSize def build_record record['dates'] = [add_date] - record['title'] = work.title.first + record['title'] = doc['title_tesim'].first record['lang_materials'] = [lang] record['file_versions'] = file_versions record['digital_object_type'] = do_type record['linked_instances'] = [linked_instance] - record['digital_object_id'] = work.identifier.first + record['digital_object_id'] = doc['identifier_tesim'].first add_visibility end # rubocop:enable Metrics/AbcSize def linked_instance - if work.archival_object_id.blank? - errors << "#{work.id} has no archival_object_id" + if doc['archival_object_id_tesim'].blank? + errors << "#{doc['id']} has no archival_object_id" return {} end - ao_id = work.archival_object_id.first.split('/').last - { 'ref' => "/repositories/2/archival_objects/#{ao_id}" } + val = doc['archival_object_id_tesim'].first.split('/').last + id_match = /[0-9]+/.match val + return {} if id_match.nil? + + { 'ref' => "/repositories/2/archival_objects/#{id_match}" } end def record @@ -53,7 +56,7 @@ def record end def add_visibility - restrict = (work.visibility != 'open' || !work.access_restrictions.blank?) + restrict = (doc['visibility_ssi'] != 'open' || !doc['access_restrictions_tesim'].blank?) record['publish'] = true record['restrictions'] = restrict record['suppressed'] = false @@ -67,13 +70,20 @@ def date_hash } end - # rubocop:disable Metrics/AbcSize + def date_present + return doc['date_tesim'].first unless doc['date_tesim'].blank? + + return doc['date_created_tesim'].first unless doc['date_created_tesim'].blank? + end + # rubocop:disable Metrics/MethodLength def add_date - return {} if work.date.blank? + d = date_present + return {} if d.nil? + + return {} unless EDTF.parse(d).present? date_hash.tap do |t| - d = work.date.first t['expression'] = d arr = d.split('/') t['begin'] = arr[0] @@ -83,7 +93,6 @@ def add_date end end end - # rubocop:enable Metrics/AbcSize # rubocop:enable Metrics/MethodLength def file_version_keys @@ -99,9 +108,9 @@ def file_version_show end def file_versions - assign_uris(work) + assign_uris(doc) [].tap do |a| - a << build_file_version(file_version_embed, @asset_image_uri) if work.visibility == 'open' + a << build_file_version(file_version_embed, @asset_image_uri) if doc['visibility_ssi'] == 'open' a << build_file_version(file_version_show, @asset_show_uri) end end @@ -116,12 +125,12 @@ def build_file_version(arr, uri) end def lang - return {} if work.language.blank? + return {} if doc['language_tesim'].blank? { 'jsonmodel_type' => 'lang_material', 'language_and_script' => { - 'language' => work.language.first.split('/').last, + 'language' => doc['language_tesim'].first.split('/').last, 'jsonmodel_type' => 'language_and_script' } } @@ -129,7 +138,7 @@ def lang # rubocop:disable Metrics/MethodLength def do_type - case work.class.to_s + case doc['has_model_ssim'].first when 'Document' return 'Text' when 'Image' diff --git a/app/models/solr_document.rb b/app/models/solr_document.rb index 46efba6c8..b1192be52 100644 --- a/app/models/solr_document.rb +++ b/app/models/solr_document.rb @@ -28,9 +28,7 @@ def self.find(ids) return super(ids) unless ids.is_a? Array return [] if ids.blank? - solr_query = Hyrax::SolrQueryBuilderService.construct_query_for_ids(ids) - path = repository.blacklight_config.document_solr_path || repository.blacklight_config.solr_path - docs = repository.send_and_receive path, { fq: solr_query, rows: ids.count } + docs = repository.find(ids) docs.documents end @@ -73,10 +71,9 @@ def rights_statement_to_fa_class(rights_statement) # Find and return parent works def parents - config = ::CatalogController.new - repository = config.repository - search_builder = OregonDigital::ParentsSearchBuilder.new(id: self['id']) - @parents ||= repository.search(search_builder).docs + @parents ||= Hyrax::SolrService.get("{!field f=member_ids_ssim}#{id}")['response']['docs'].map do |doc| + SolrDocument.new(doc) + end end def parents? @@ -100,7 +97,7 @@ def sort_members end def process_chunk(chunk) - SolrDocument.find(chunk).map do |document| + SolrDocument.find(chunk.reject(&:blank?)).map do |document| if document['has_model_ssim'].first.include?('FileSet') @file_sets << document else diff --git a/app/models/user.rb b/app/models/user.rb index d9272cabb..04b5bf29c 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -8,13 +8,13 @@ class User < ApplicationRecord include Hyrax::UserUsageStats include Blacklight::User - attr_accessible :email, :password, :password_confirmation if Blacklight::Utils.needs_attr_accessible? before_create :role_from_devise # DISABLE RUBOCOP BECAUSE DEVISE REQUIRES A PARTICULAR FORMAT # rubocop:disable Style/SymbolArray # Include default devise modules. Others available are: - devise :database_authenticatable, :registerable, :recoverable, :confirmable, + # TODO: ADD BACK IN CONFIRMABLE + devise :database_authenticatable, :registerable, :recoverable, :omniauthable, :validatable, omniauth_providers: [:cas, :saml] # rubocop:enable Style/SymbolArray @@ -68,7 +68,7 @@ def self.from_omniauth(access_token) User.where(email: email).first_or_create do |u| u.email = email u.roles << role unless role.nil? - u.skip_confirmation! + # u.skip_confirmation! end end diff --git a/app/parsers/bulkrax/bagit_complex_parser.rb b/app/parsers/bulkrax/bagit_complex_parser.rb index 48101398c..080712b42 100644 --- a/app/parsers/bulkrax/bagit_complex_parser.rb +++ b/app/parsers/bulkrax/bagit_complex_parser.rb @@ -33,7 +33,7 @@ def create_collections title: lookup_collection(collection), work_identifier => [collection], visibility: 'open', - collection_type_gid: Hyrax::CollectionType.find_or_create_default_collection_type.gid + collection_type_gid: Hyrax::CollectionType.find_or_create_default_collection_type.to_global_id } new_entry = find_or_create_entry(collection_entry_class, collection, 'Bulkrax::Importer', metadata) ImportWorkCollectionJob.perform_now(new_entry.id, current_importer_run.id) @@ -154,7 +154,7 @@ def write_files file_name = filename(fs) next if file_name.blank? - io = open(fs.original_file.uri) + io = URI.open(fs.original_file.uri) file = Tempfile.new([file_name, File.extname(file_name)], binmode: true) file.write(io.read) file.close diff --git a/app/presenters/hyrax/collapsable_section_presenter.rb b/app/presenters/hyrax/collapsable_section_presenter.rb index 71ce7b54a..f2db3168a 100644 --- a/app/presenters/hyrax/collapsable_section_presenter.rb +++ b/app/presenters/hyrax/collapsable_section_presenter.rb @@ -2,13 +2,14 @@ module Hyrax # Draws a collapsable list widget using the Bootstrap 3 / Collapse.js plugin class CollapsableSectionPresenter - def initialize(view_context:, text:, id:, icon_class:, open:) - @view_context = view_context - @text = text - @id = id - @icon_class = icon_class - @open = open - end + def initialize(view_context:, text:, id:, icon_class:, open:, title: nil) + @view_context = view_context + @text = text + @id = id + @icon_class = icon_class + @open = open + @title = title + end attr_reader :view_context, :text, :id, :icon_class, :open delegate :content_tag, :safe_join, :tag, to: :view_context diff --git a/app/presenters/oregon_digital/mp3_presenter.rb b/app/presenters/oregon_digital/mp3_presenter.rb index 4c15777ac..3627a45a5 100644 --- a/app/presenters/oregon_digital/mp3_presenter.rb +++ b/app/presenters/oregon_digital/mp3_presenter.rb @@ -38,10 +38,17 @@ def to_s private + # rubocop:disable Metrics/AbcSize def duration - dur = @file_set.duration.first&.split(':')&.map(&:to_i) || [0, 0, -1] - (dur.first * 3600) + (dur.second * 60) + dur.third + 1 + dur_array = @file_set.duration.first&.split(':')&.map(&:to_i) || [0, 0, -1] + + if dur_array.count > 1 + (dur_array.first * 3600) + (dur_array.second * 60) + dur_array.third + 1 + else + (dur_array.first / 1000).ceil + end end + # rubocop:enable Metrics/AbcSize # The path to the derivative download def default_content_path diff --git a/app/presenters/oregon_digital/permission_badge.rb b/app/presenters/oregon_digital/permission_badge.rb index 19113f70d..8ca17e7df 100644 --- a/app/presenters/oregon_digital/permission_badge.rb +++ b/app/presenters/oregon_digital/permission_badge.rb @@ -6,13 +6,13 @@ class PermissionBadge < Hyrax::PermissionBadge include ActionView::Helpers::TagHelper VISIBILITY_LABEL_CLASS = { - authenticated: 'label-info', - embargo: 'label-warning', - osu: 'label-warning', - uo: 'label-warning', - lease: 'label-warning', - open: 'label-success', - restricted: 'label-danger' + authenticated: 'badge-info', + embargo: 'badge-warning', + osu: 'badge-warning', + uo: 'badge-warning', + lease: 'badge-warning', + open: 'badge-success', + restricted: 'badge-danger' }.freeze private diff --git a/app/search_builders/oregon_digital/in_review_search_builder.rb b/app/search_builders/oregon_digital/in_review_search_builder.rb index 2153aa57a..ebefa96d0 100644 --- a/app/search_builders/oregon_digital/in_review_search_builder.rb +++ b/app/search_builders/oregon_digital/in_review_search_builder.rb @@ -31,7 +31,7 @@ def roles_for_user # @param workflow [Sipity::Workflow] # @return [ActiveRecord::Relation] def workflow_roles_for_user_and_workflow(workflow) - Hyrax::Workflow::PermissionQuery.scope_processing_workflow_roles_for_user_and_workflow(user: current_user, workflow: workflow) + Hyrax::Workflow::PermissionQuery.scope_processing_workflow_roles_for_user_and_workflow(user: current_ability.current_user, workflow: workflow) end end end diff --git a/app/search_builders/oregon_digital/my_collections_search_builder.rb b/app/search_builders/oregon_digital/my_collections_search_builder.rb index c1347bcc4..bbaacb6da 100644 --- a/app/search_builders/oregon_digital/my_collections_search_builder.rb +++ b/app/search_builders/oregon_digital/my_collections_search_builder.rb @@ -4,6 +4,7 @@ class OregonDigital::MyCollectionsSearchBuilder < Hyrax::My::CollectionsSearchBuilder include OregonDigital::FilterTombstone self.default_processor_chain += [:non_tombstoned_works] + # This overrides the models in Hyrax::My::CollectionsSearchBuilder # @return [Array] a list of classes to include def models diff --git a/app/search_builders/oregon_digital/only_non_user_collections_behavior.rb b/app/search_builders/oregon_digital/only_non_user_collections_behavior.rb index 29d8254de..a902277c5 100644 --- a/app/search_builders/oregon_digital/only_non_user_collections_behavior.rb +++ b/app/search_builders/oregon_digital/only_non_user_collections_behavior.rb @@ -8,8 +8,8 @@ module OnlyNonUserCollectionsBehavior included do def show_only_collections_not_created_users(solr_parameters) clauses = [ - ActiveFedora::SolrQueryBuilder.construct_query_for_rel(collection_type_gid: Hyrax::CollectionType.find_by(machine_id: :user_collection).gid), - ActiveFedora::SolrQueryBuilder.construct_query_for_rel(collection_type_gid: Hyrax::CollectionType.find_by(machine_id: :oai_set).gid) + ActiveFedora::SolrQueryBuilder.construct_query_for_rel(collection_type_gid: Hyrax::CollectionType.find_by(machine_id: :user_collection)&.to_global_id.to_s), + ActiveFedora::SolrQueryBuilder.construct_query_for_rel(collection_type_gid: Hyrax::CollectionType.find_by(machine_id: :oai_set)&.to_global_id.to_s) ] solr_parameters[:fq] ||= [] solr_parameters[:fq] += ["!(#{clauses.join(' OR ')})"] diff --git a/app/search_builders/oregon_digital/ordered_children_of_work_search_builder.rb b/app/search_builders/oregon_digital/ordered_children_of_work_search_builder.rb new file mode 100644 index 000000000..312cf465d --- /dev/null +++ b/app/search_builders/oregon_digital/ordered_children_of_work_search_builder.rb @@ -0,0 +1,34 @@ +# frozen_string_literal:true + +module OregonDigital + # Finds subset of ordered child works, i.e. for a given page + class OrderedChildrenOfWorkSearchBuilder < Hyrax::SearchBuilder + self.default_processor_chain += [:ordered_child_works] + + attr_reader :work + + def initialize(*options, work:) + @work = work + super(options.first) + @child_page = options.first.params['child_page'] + # page must be set to 1, otherwise search builder assumes + # that all docs have already been returned on the previous page + options.first.params['page'] = '1' + @count = blacklight_config.per_page.first + end + + def ordered_child_works(solr_params) + ids = @work.ordered_member_ids || ['""'] + ids = ids.slice(find_start(@child_page), @count) + solr_params[:fq] ||= [] + solr_params[:fq] << "id:(#{ids.join(' OR ')})" + solr_params[:fq] << '-has_model_ssim:*FileSet' + end + + def find_start(page) + return 0 if page.nil? + + return (page.to_i - 1) * @count + end + end +end diff --git a/app/search_builders/oregon_digital/parents_search_builder.rb b/app/search_builders/oregon_digital/parents_search_builder.rb index 95386cbbf..d6458c853 100644 --- a/app/search_builders/oregon_digital/parents_search_builder.rb +++ b/app/search_builders/oregon_digital/parents_search_builder.rb @@ -2,14 +2,14 @@ module OregonDigital # Finds parent works - class ParentsSearchBuilder < Blacklight::SearchBuilder + class ParentsSearchBuilder < Hyrax::SearchBuilder self.default_processor_chain += [:parent_works] attr_reader :work - def initialize(id:) + def initialize(*options, id:) @id = id - super + super(options.first) end def parent_works(solr_params) diff --git a/app/views/_controls.html.erb b/app/views/_controls.html.erb index e33886dfb..6d7084c2d 100644 --- a/app/views/_controls.html.erb +++ b/app/views/_controls.html.erb @@ -1,32 +1,28 @@ - +
\ No newline at end of file diff --git a/app/views/_logo.html.erb b/app/views/_logo.html.erb index 8ced8c4bf..114577e1e 100644 --- a/app/views/_logo.html.erb +++ b/app/views/_logo.html.erb @@ -1,6 +1,6 @@ diff --git a/app/views/_masthead.html.erb b/app/views/_masthead.html.erb index 783db514f..35d75b71f 100644 --- a/app/views/_masthead.html.erb +++ b/app/views/_masthead.html.erb @@ -1,19 +1,16 @@
-