diff --git a/.github/workflows/ruby.yml b/.github/workflows/ruby.yml index abafd58e2..7e849439e 100644 --- a/.github/workflows/ruby.yml +++ b/.github/workflows/ruby.yml @@ -36,7 +36,7 @@ jobs: uses: ruby/setup-ruby@v1 # uses: ruby/setup-ruby@b12138f02d7d0c4d36f463e0885dc47ec25a52fe with: - ruby-version: 3.3.8 + ruby-version: 3.4.5 - name: Install dependencies run: | bundle install @@ -57,7 +57,7 @@ jobs: uses: ruby/setup-ruby@v1 # uses: ruby/setup-ruby@b12138f02d7d0c4d36f463e0885dc47ec25a52fe with: - ruby-version: 3.3.8 + ruby-version: 3.4.5 - name: Install dependencies run: | . $HOME/.nvm/nvm.sh @@ -91,7 +91,7 @@ jobs: uses: ruby/setup-ruby@v1 # uses: ruby/setup-ruby@b12138f02d7d0c4d36f463e0885dc47ec25a52fe with: - ruby-version: 3.3.8 + ruby-version: 3.4.5 - name: Install dependencies run: | . $HOME/.nvm/nvm.sh @@ -134,7 +134,7 @@ jobs: uses: ruby/setup-ruby@v1 # uses: ruby/setup-ruby@b12138f02d7d0c4d36f463e0885dc47ec25a52fe with: - ruby-version: 3.3.8 + ruby-version: 3.4.5 - name: Install dependencies run: | . $HOME/.nvm/nvm.sh @@ -150,14 +150,14 @@ jobs: timeout_minutes: 30 max_attempts: 2 retry_on: error - command: bundle exec cucumber features/products/ features/program_tests/ features/records/ features/users/ features/vendors/; + command: bundle exec cucumber features/products/ features/program_tests/ features/users/ features/vendors/; - name: Upload code coverage to codecov.io uses: codecov/codecov-action@v3 with: directory: coverage name: codecov-cucumber-2 - unit-test: + cucumber-3: strategy: fail-fast: false @@ -177,7 +177,7 @@ jobs: uses: ruby/setup-ruby@v1 # uses: ruby/setup-ruby@b12138f02d7d0c4d36f463e0885dc47ec25a52fe with: - ruby-version: 3.3.8 + ruby-version: 3.4.5 - name: Install dependencies run: | . $HOME/.nvm/nvm.sh @@ -187,15 +187,125 @@ jobs: git clone -b cypress_v7 https://github.com/projecttacoma/cqm-execution-service.git /tmp/cqm-execution-service-56 yarn --cwd /tmp/cqm-execution-service-56 install --only=production yarn --cwd /tmp/cqm-execution-service-56 start & - - name: Run Rake test + - name: Run cucumber + uses: nick-fields/retry@v2 + with: + timeout_minutes: 30 + max_attempts: 2 + retry_on: error + command: bundle exec cucumber features/records/; + - name: Upload code coverage to codecov.io + uses: codecov/codecov-action@v3 + with: + directory: coverage + name: codecov-cucumber-3 + + unit-test-1: + strategy: + fail-fast: false + + runs-on: ubuntu-22.04 + + services: + mongodb: + image: mongo:7.0.6 + ports: + - 27017:27017 + + steps: + - uses: actions/checkout@v2 + - name: Set up Ruby + # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby, + # change this to (see https://github.com/ruby/setup-ruby#versioning): + uses: ruby/setup-ruby@v1 + # uses: ruby/setup-ruby@b12138f02d7d0c4d36f463e0885dc47ec25a52fe + with: + ruby-version: 3.4.5 + - name: Install dependencies + run: | + . $HOME/.nvm/nvm.sh + nvm install 22.16 + nvm use stable + bundle install + git clone -b cypress_v7 https://github.com/projecttacoma/cqm-execution-service.git /tmp/cqm-execution-service-56 + yarn --cwd /tmp/cqm-execution-service-56 install --only=production + yarn --cwd /tmp/cqm-execution-service-56 start & + - name: Run Rake test units + run: | + RUBYOPT="-W0" + bin/rails test test/unit/*.rb; + - name: Upload code coverage to codecov.io + uses: codecov/codecov-action@v3 + with: + directory: coverage + name: codecov-unit-1 + + unit-test-2: + strategy: + fail-fast: false + + runs-on: ubuntu-22.04 + + services: + mongodb: + image: mongo:7.0.6 + ports: + - 27017:27017 + + steps: + - uses: actions/checkout@v2 + - name: Set up Ruby + # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby, + # change this to (see https://github.com/ruby/setup-ruby#versioning): + uses: ruby/setup-ruby@v1 + # uses: ruby/setup-ruby@b12138f02d7d0c4d36f463e0885dc47ec25a52fe + with: + ruby-version: 3.4.5 + - name: Install dependencies + run: | + . $HOME/.nvm/nvm.sh + nvm install 22.16 + nvm use stable + bundle install + git clone -b cypress_v7 https://github.com/projecttacoma/cqm-execution-service.git /tmp/cqm-execution-service-56 + yarn --cwd /tmp/cqm-execution-service-56 install --only=production + yarn --cwd /tmp/cqm-execution-service-56 start & + - name: Run Rake test units lib + run: | + RUBYOPT="-W0" + bin/rails test test/unit/lib/*.rb; + - name: Upload code coverage to codecov.io + uses: codecov/codecov-action@v3 + with: + directory: coverage + name: codecov-unit-2-lib + - name: Run Rake test units lib cypress + run: | + RUBYOPT="-W0" + bin/rails test test/unit/lib/cypress/*.rb; + - name: Upload code coverage to codecov.io + uses: codecov/codecov-action@v3 + with: + directory: coverage + name: codecov-unit-2-lib-cypress + - name: Run Rake test units lib validators + run: | + RUBYOPT="-W0" + bin/rails test test/unit/lib/validators/*.rb; + - name: Upload code coverage to codecov.io + uses: codecov/codecov-action@v3 + with: + directory: coverage + name: codecov-unit-2-validators + - name: Run Rake test models run: | RUBYOPT="-W0" - bundle exec rake test:units; + bin/rails test test/models; - name: Upload code coverage to codecov.io uses: codecov/codecov-action@v3 with: directory: coverage - name: codecov-unit + name: codecov-unit-2-models controllers-jobs-helpers-test: strategy: @@ -217,7 +327,7 @@ jobs: uses: ruby/setup-ruby@v1 # uses: ruby/setup-ruby@b12138f02d7d0c4d36f463e0885dc47ec25a52fe with: - ruby-version: 3.3.8 + ruby-version: 3.4.5 - name: Install dependencies run: | . $HOME/.nvm/nvm.sh @@ -275,7 +385,7 @@ jobs: uses: ruby/setup-ruby@v1 # uses: ruby/setup-ruby@b12138f02d7d0c4d36f463e0885dc47ec25a52fe with: - ruby-version: 3.3.8 + ruby-version: 3.4.5 - name: Install dependencies run: | . $HOME/.nvm/nvm.sh diff --git a/.overcommit.yml b/.overcommit.yml index de7005880..d0912e509 100644 --- a/.overcommit.yml +++ b/.overcommit.yml @@ -27,7 +27,8 @@ PreCommit: enabled: true exclude: ['vendor/assets/javascripts/**/*', 'test/fixtures/**/*'] ScssLint: - enabled: true + # disable scss_lint check, incompatible with upgraded sass dependencies + enabled: false exclude: ['vendor/assets/stylesheets/**/*'] HardTabs: enabled: true diff --git a/.pkgr.yml b/.pkgr.yml index 50dfd9441..925249d21 100644 --- a/.pkgr.yml +++ b/.pkgr.yml @@ -1,5 +1,6 @@ env: - DISABLE_DB=true + - SECRET_KEY_BASE_DUMMY=1 dependencies: - libcurl4 before: diff --git a/.ruby-version b/.ruby-version index 7cb75caa9..3ec370e15 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.3.8 \ No newline at end of file +3.4.5 \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index e6da33eb6..fb4280f00 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ ############################################ # 🏗 Stage 1 – build gems + assets ############################################ -FROM ruby:3.3.8-slim AS builder +FROM ruby:3.4.5-slim AS builder # Essential OS packages (compile + JS pipeline) # RUN apt-get update @@ -32,7 +32,7 @@ RUN RAILS_ENV=production DISABLE_DB=true SECRET_KEY_BASE=precompile_only bundle ################################################ # 🏃‍♂️ Stage 2 – production image ################################################ -FROM ruby:3.3.8-slim AS prod +FROM ruby:3.4.5-slim AS prod # ➜ install only the shared lib, not the dev headers RUN --mount=type=cache,target=/var/cache/apt \ @@ -68,7 +68,7 @@ CMD ["/usr/local/bin/docker_entrypoint.sh"] ############################################ # 🏗 Stage 3 – development environment ############################################ -FROM ruby:3.3.8-slim AS dev +FROM ruby:3.4.5-slim AS dev # Essential OS packages (compile + JS pipeline) RUN apt-get update && \ diff --git a/Gemfile b/Gemfile index 2b73ef3e5..bbfa16872 100644 --- a/Gemfile +++ b/Gemfile @@ -2,13 +2,13 @@ source 'https://rubygems.org' -ruby '3.3.8' +ruby '3.4.5' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' -gem 'rails', '~> 7.2.0' +gem 'rails', '~> 8.0', '>= 8.0.2.1' gem 'delayed_job_mongoid', '~> 3.0.0' -gem 'mongoid', '~> 8.1.0' +gem 'mongoid', '~> 9.0.0' # gem 'mongoid', '~> 4.0.2' gem 'bson' @@ -17,21 +17,20 @@ gem 'mustache' ## gem 'os' gem 'cqm-models', '~> 4.2.0' -gem 'cqm-parsers', '~> 4.1.1.1' -gem 'cqm-reports', '~> 4.1.4' +gem 'cqm-parsers', '~> 4.1.1.2' +gem 'cqm-reports', '~> 4.1.5' gem 'cqm-validators', '~> 4.0.6' # # Use faker to generate addresses gem 'faker', '> 1.5.0' -# Use SCSS for stylesheets -gem 'sass-rails', '~> 5.0.4' +gem 'csv', '~> 3.3', '>= 3.3.5' + # Dependencies for CMS Assets Framework -# gem 'bootstrap-sass', '~> 3.4.1' -gem 'bootstrap', '~> 5.3.3' -gem 'dartsass-sprockets' +gem 'bootstrap', '~> 5.3.5' +gem 'dartsass-sprockets', '~> 3.2', '>= 3.2.1' -gem 'font-awesome-sass', '~> 5.0.13' +gem 'font-awesome-sass', '~> 6.7', '>= 6.7.2' gem 'jquery-rails' # TODO: remove or use gem gem 'jquery-ui-rails', '~> 8.0.0' @@ -44,9 +43,8 @@ gem 'uglifier', '>= 1.3.0' # Bake the best breadcrumbs gem 'breadcrumbs_on_rails' # Help our forms -gem 'bootstrap_form', '~> 2.7' +gem 'bootstrap_form', '~> 5.4' gem 'jasny-bootstrap-rails' -gem 'nested_form' gem 'jquery-datatables-rails' gem 'local_time', '~> 2.0.0' @@ -57,7 +55,7 @@ gem 'local_time', '~> 2.0.0' # Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks gem 'turbolinks', git: 'https://github.com/turbolinks/turbolinks-classic', branch: 'master' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder -gem 'jbuilder', '~> 2.11.0' +gem 'jbuilder', '~> 2.14', '>= 2.14.1' # A set of responders modules to dry up your Rails 4.2+ app. gem 'responders' # Roar is a framework for parsing and rendering REST documents @@ -88,8 +86,8 @@ gem 'devise' gem 'devise_invitable' gem 'rolify' -# Use Unicorn as the app server -# gem 'unicorn' +# Use Puma as the app server +gem 'puma', '~> 6.6' # Use Capistrano for deployment # gem 'capistrano-rails', group: :development @@ -104,8 +102,8 @@ gem 'validate_url' gem 'telephone_number' group :development, :test do - # rubocop 0.67 currently has a bug that is causing it to crash in product.rb and vendor.rb - gem 'rubocop' + # pin rubocop to version 1.69.1, to avoid new errors in overcommit from later verisons + gem 'rubocop', '1.69.1' gem 'rubocop-rspec' # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'axe-core-capybara' @@ -123,8 +121,10 @@ group :development, :test do gem 'rails_best_practices' gem 'rails-controller-testing' gem 'rails-perftest' - gem 'scss_lint', require: false + # remove scss_lint, incompatible with sass dependency upgrades + # gem 'scss_lint', require: false gem 'selenium-webdriver' + gem 'webrick' end group :development do @@ -153,9 +153,4 @@ end group :production do gem 'newrelic_rpm' - gem 'unicorn-rails' -end - -group :docker do - gem 'puma', '~> 6.6' end diff --git a/Gemfile.lock b/Gemfile.lock index 432b3977d..183152915 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -9,66 +9,65 @@ GIT GEM remote: https://rubygems.org/ specs: - actioncable (7.2.2.1) - actionpack (= 7.2.2.1) - activesupport (= 7.2.2.1) + actioncable (8.0.3) + actionpack (= 8.0.3) + activesupport (= 8.0.3) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (7.2.2.1) - actionpack (= 7.2.2.1) - activejob (= 7.2.2.1) - activerecord (= 7.2.2.1) - activestorage (= 7.2.2.1) - activesupport (= 7.2.2.1) + actionmailbox (8.0.3) + actionpack (= 8.0.3) + activejob (= 8.0.3) + activerecord (= 8.0.3) + activestorage (= 8.0.3) + activesupport (= 8.0.3) mail (>= 2.8.0) - actionmailer (7.2.2.1) - actionpack (= 7.2.2.1) - actionview (= 7.2.2.1) - activejob (= 7.2.2.1) - activesupport (= 7.2.2.1) + actionmailer (8.0.3) + actionpack (= 8.0.3) + actionview (= 8.0.3) + activejob (= 8.0.3) + activesupport (= 8.0.3) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (7.2.2.1) - actionview (= 7.2.2.1) - activesupport (= 7.2.2.1) + actionpack (8.0.3) + actionview (= 8.0.3) + activesupport (= 8.0.3) nokogiri (>= 1.8.5) - racc - rack (>= 2.2.4, < 3.2) + rack (>= 2.2.4) rack-session (>= 1.0.1) rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actiontext (7.2.2.1) - actionpack (= 7.2.2.1) - activerecord (= 7.2.2.1) - activestorage (= 7.2.2.1) - activesupport (= 7.2.2.1) + actiontext (8.0.3) + actionpack (= 8.0.3) + activerecord (= 8.0.3) + activestorage (= 8.0.3) + activesupport (= 8.0.3) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.2.2.1) - activesupport (= 7.2.2.1) + actionview (8.0.3) + activesupport (= 8.0.3) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.2.2.1) - activesupport (= 7.2.2.1) + activejob (8.0.3) + activesupport (= 8.0.3) globalid (>= 0.3.6) - activemodel (7.2.2.1) - activesupport (= 7.2.2.1) - activerecord (7.2.2.1) - activemodel (= 7.2.2.1) - activesupport (= 7.2.2.1) + activemodel (8.0.3) + activesupport (= 8.0.3) + activerecord (8.0.3) + activemodel (= 8.0.3) + activesupport (= 8.0.3) timeout (>= 0.4.0) - activestorage (7.2.2.1) - actionpack (= 7.2.2.1) - activejob (= 7.2.2.1) - activerecord (= 7.2.2.1) - activesupport (= 7.2.2.1) + activestorage (8.0.3) + actionpack (= 8.0.3) + activejob (= 8.0.3) + activerecord (= 8.0.3) + activesupport (= 8.0.3) marcel (~> 1.0) - activesupport (7.2.2.1) + activesupport (8.0.3) base64 benchmark (>= 0.3) bigdecimal @@ -80,21 +79,20 @@ GEM minitest (>= 5.1) securerandom (>= 0.3) tzinfo (~> 2.0, >= 2.0.5) + uri (>= 0.13.1) addressable (2.8.7) public_suffix (>= 2.0.2, < 7.0) ansi (1.5.0) - ast (2.4.2) - autoprefixer-rails (10.4.19.0) - execjs (~> 2) - axe-core-api (4.10.2) + ast (2.4.3) + axe-core-api (4.10.3) dumb_delegator ostruct virtus - axe-core-capybara (4.10.2) - axe-core-api (= 4.10.2) + axe-core-capybara (4.10.3) + axe-core-api (= 4.10.3) dumb_delegator - axe-core-cucumber (4.10.2) - axe-core-api (= 4.10.2) + axe-core-cucumber (4.10.3) + axe-core-api (= 4.10.3) dumb_delegator ostruct virtus @@ -105,22 +103,23 @@ GEM base64 (0.3.0) bcrypt (3.1.20) benchmark (0.4.1) - bigdecimal (3.2.2) + bigdecimal (3.2.3) bindex (0.8.1) - bootsnap (1.18.4) + bootsnap (1.18.6) msgpack (~> 1.2) - bootstrap (5.3.3) - autoprefixer-rails (>= 9.1.0) + bootstrap (5.3.5) popper_js (>= 2.11.8, < 3) - bootstrap_form (2.7.0) + bootstrap_form (5.4.0) + actionpack (>= 6.1) + activemodel (>= 6.1) breadcrumbs_on_rails (4.1.0) railties (>= 5.0) - bson (5.0.2) + bson (5.1.1) builder (3.3.0) bundler-audit (0.9.2) bundler (>= 1.2.0, < 3) thor (~> 1.0) - byebug (11.1.3) + byebug (12.0.0) cancancan (3.6.1) capybara (3.40.0) addressable @@ -164,9 +163,9 @@ GEM execjs coffee-script-source (1.12.2) concurrent-ruby (1.3.5) - connection_pool (2.5.3) + connection_pool (2.5.4) cqm-models (4.2.0) - cqm-parsers (4.1.1.1) + cqm-parsers (4.1.1.2) activesupport (> 5.0) builder (~> 3.1) cqm-models (> 3.0.0) @@ -174,15 +173,15 @@ GEM highline (~> 1.7.0) log4r (~> 1.1.10) memoist (~> 0.9.1) - mongoid (> 6.0.5, < 9.0.0) - mongoid-tree (~> 2.2.0) + mongoid (> 6.0.5, < 10.0.0) + mongoid-tree (~> 2.3.0) mustache nokogiri (>= 1.16.2) rubyzip (~> 1.3) typhoeus uuid (~> 2.3.7) zip-zip (~> 0.3) - cqm-reports (4.1.4) + cqm-reports (4.1.5) cqm-models (~> 4.0) cqm-validators (~> 4.0) erubis (~> 2.7) @@ -199,38 +198,39 @@ GEM bigdecimal rexml crass (1.0.6) - cucumber (9.2.0) + csv (3.3.5) + cucumber (10.1.0) + base64 (~> 0.2) builder (~> 3.2) cucumber-ci-environment (> 9, < 11) - cucumber-core (> 13, < 14) - cucumber-cucumber-expressions (~> 17.0) - cucumber-gherkin (> 24, < 28) + cucumber-core (> 15, < 17) + cucumber-cucumber-expressions (> 17, < 19) cucumber-html-formatter (> 20.3, < 22) - cucumber-messages (> 19, < 25) diff-lcs (~> 1.5) + logger (~> 1.6) mini_mime (~> 1.1) multi_test (~> 1.1) - sys-uname (~> 1.2) + sys-uname (~> 1.3) cucumber-ci-environment (10.0.1) - cucumber-core (13.0.3) - cucumber-gherkin (>= 27, < 28) - cucumber-messages (>= 20, < 23) + cucumber-core (15.2.1) + cucumber-gherkin (> 27, < 33) + cucumber-messages (> 26, < 30) cucumber-tag-expressions (> 5, < 7) - cucumber-cucumber-expressions (17.1.0) + cucumber-cucumber-expressions (18.0.1) bigdecimal - cucumber-gherkin (27.0.0) - cucumber-messages (>= 19.1.4, < 23) - cucumber-html-formatter (21.7.0) - cucumber-messages (> 19, < 27) - cucumber-messages (22.0.0) - cucumber-rails (3.1.0) - capybara (>= 3.11, < 4) - cucumber (>= 5, < 10) - railties (>= 5.2, < 9) - cucumber-tag-expressions (6.1.1) - dartsass-sprockets (3.1.0) + cucumber-gherkin (32.2.0) + cucumber-messages (> 25, < 28) + cucumber-html-formatter (21.15.1) + cucumber-messages (> 19, < 28) + cucumber-messages (27.2.0) + cucumber-rails (4.0.0) + capybara (>= 3.25, < 4) + cucumber (>= 7, < 11) + railties (>= 6.1, < 9) + cucumber-tag-expressions (6.1.2) + dartsass-sprockets (3.2.1) railties (>= 4.0.0) - sassc-embedded (~> 1.69) + sassc-embedded (~> 1.80.1) sprockets (> 3.0) sprockets-rails tilt @@ -254,69 +254,70 @@ GEM railties (>= 4.1.0) responders warden (~> 1.2.3) - devise_invitable (2.0.9) + devise_invitable (2.0.11) actionmailer (>= 5.0) devise (>= 4.6) - diff-lcs (1.5.1) - diffy (3.4.3) + diff-lcs (1.6.2) + diffy (3.4.4) docile (1.4.1) domain_name (0.6.20240107) drb (2.2.3) - dumb_delegator (1.0.0) + dumb_delegator (1.1.0) erb (5.0.2) erubi (1.13.1) erubis (2.7.0) - ethon (0.16.0) + ethon (0.15.0) ffi (>= 1.15.0) execjs (2.10.0) - factory_bot (6.5.0) - activesupport (>= 5.0.0) - factory_bot_rails (6.4.4) + factory_bot (6.5.5) + activesupport (>= 6.1.0) + factory_bot_rails (6.5.1) factory_bot (~> 6.5) - railties (>= 5.0.0) - faker (3.5.1) + railties (>= 6.1.0) + faker (3.5.2) i18n (>= 1.8.11, < 2) - ffi (1.17.0-aarch64-linux-gnu) - ffi (1.17.0-aarch64-linux-musl) - ffi (1.17.0-arm-linux-gnu) - ffi (1.17.0-arm-linux-musl) - ffi (1.17.0-arm64-darwin) - ffi (1.17.0-x86-linux-gnu) - ffi (1.17.0-x86-linux-musl) - ffi (1.17.0-x86_64-darwin) - ffi (1.17.0-x86_64-linux-gnu) - ffi (1.17.0-x86_64-linux-musl) - font-awesome-sass (5.0.13) - sassc (>= 1.11) - globalid (1.2.1) + ffi (1.17.2-aarch64-linux-gnu) + ffi (1.17.2-aarch64-linux-musl) + ffi (1.17.2-arm-linux-gnu) + ffi (1.17.2-arm-linux-musl) + ffi (1.17.2-arm64-darwin) + ffi (1.17.2-x86_64-darwin) + ffi (1.17.2-x86_64-linux-gnu) + ffi (1.17.2-x86_64-linux-musl) + font-awesome-sass (6.7.2) + sassc (~> 2.0) + globalid (1.3.0) activesupport (>= 6.1) - google-protobuf (4.29.1) + google-protobuf (4.32.1) bigdecimal rake (>= 13) - google-protobuf (4.29.1-aarch64-linux) + google-protobuf (4.32.1-aarch64-linux-gnu) bigdecimal rake (>= 13) - google-protobuf (4.29.1-arm64-darwin) + google-protobuf (4.32.1-aarch64-linux-musl) bigdecimal rake (>= 13) - google-protobuf (4.29.1-x86-linux) + google-protobuf (4.32.1-arm64-darwin) bigdecimal rake (>= 13) - google-protobuf (4.29.1-x86_64-darwin) + google-protobuf (4.32.1-x86_64-darwin) bigdecimal rake (>= 13) - google-protobuf (4.29.1-x86_64-linux) + google-protobuf (4.32.1-x86_64-linux-gnu) bigdecimal rake (>= 13) - hashdiff (1.1.2) + google-protobuf (4.32.1-x86_64-linux-musl) + bigdecimal + rake (>= 13) + hashdiff (1.2.1) highline (1.7.10) - http-cookie (1.0.7) + http-cookie (1.0.8) domain_name (~> 0.5) i18n (1.14.7) concurrent-ruby (~> 1.0) ice_nine (0.11.2) - image_processing (1.13.0) - mini_magick (>= 4.9.5, < 5) + image_processing (1.14.0) + mini_magick (>= 4.9.5, < 6) ruby-vips (>= 2.0.17, < 3) iniparse (1.5.0) io-console (0.8.1) @@ -326,9 +327,9 @@ GEM reline (>= 0.4.2) jasny-bootstrap-rails (3.1.3) railties (>= 3.0) - jbuilder (2.11.5) - actionview (>= 5.0.0) - activesupport (>= 5.0.0) + jbuilder (2.14.1) + actionview (>= 7.0.0) + activesupport (>= 7.0.0) jquery-datatables-rails (3.4.0) actionpack (>= 3.1) jquery-rails @@ -340,16 +341,16 @@ GEM thor (>= 0.14, < 2.0) jquery-ui-rails (8.0.0) railties (>= 3.2.16) - json (2.9.0) + json (2.15.0) kaminari-core (1.2.2) kaminari-mongoid (1.0.2) kaminari-core (~> 1.0) mongoid - kgio (2.11.4) - language_server-protocol (3.17.0.3) - launchy (3.0.1) + language_server-protocol (3.17.0.5) + launchy (3.1.1) addressable (~> 2.8) childprocess (~> 5.0) + logger (~> 1.6) listen (3.9.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) @@ -367,83 +368,80 @@ GEM net-pop net-smtp marcel (1.0.4) - matrix (0.4.2) + matrix (0.4.3) memoist (0.9.3) + memoist3 (1.0.0) method_source (1.1.0) - mime-types (3.6.0) + mime-types (3.7.0) + logger + mime-types-data (~> 3.2025, >= 3.2025.0507) + mime-types-data (3.2025.0916) + mini_magick (5.3.1) logger - mime-types-data (~> 3.2015) - mime-types-data (3.2024.1203) - mini_magick (4.13.2) mini_mime (1.1.5) - mini_portile2 (2.8.9) minitest (5.25.5) - minitest-rails (7.1.1) + minitest-rails (8.0.0) minitest (~> 5.20) - railties (>= 7.1.0, < 8.0.0) + railties (>= 8.0.0, < 8.1.0) minitest-reporters (1.7.1) ansi builder minitest (>= 5.0) ruby-progressbar - mocha (2.6.1) + mocha (2.7.1) ruby2_keywords (>= 0.0.5) - mongo (2.21.0) + mongo (2.21.3) + base64 bson (>= 4.14.1, < 6.0.0) - mongoid (8.1.7) + mongoid (9.0.8) activemodel (>= 5.1, < 8.1, != 7.0.0) concurrent-ruby (>= 1.0.5, < 2.0) mongo (>= 2.18.0, < 3.0.0) - ruby2_keywords (~> 0.0.5) mongoid-grid_fs (2.6.0) mime-types (>= 1.0, < 4.0) mongoid (>= 3.0, < 10.0) - mongoid-tree (2.2.0) - mongoid (>= 4.0, < 9) - msgpack (1.7.5) - multi_json (1.15.0) + mongoid-tree (2.3.0) + mongoid (>= 4.0, < 10) + msgpack (1.8.0) + multi_json (1.17.0) multi_test (1.1.0) mustache (1.1.1) - nested_form (0.3.2) - net-imap (0.5.7) + net-imap (0.5.10) date net-protocol net-pop (0.1.2) net-protocol net-protocol (0.2.2) timeout - net-smtp (0.5.0) + net-smtp (0.5.1) net-protocol netrc (0.11.0) - newrelic_rpm (9.16.1) + newrelic_rpm (9.21.0) nio4r (2.7.4) - nokogiri (1.18.9) - mini_portile2 (~> 2.8.2) + nokogiri (1.18.10-aarch64-linux-gnu) racc (~> 1.4) - nokogiri (1.18.9-aarch64-linux-gnu) + nokogiri (1.18.10-aarch64-linux-musl) racc (~> 1.4) - nokogiri (1.18.9-aarch64-linux-musl) + nokogiri (1.18.10-arm-linux-gnu) racc (~> 1.4) - nokogiri (1.18.9-arm-linux-gnu) + nokogiri (1.18.10-arm-linux-musl) racc (~> 1.4) - nokogiri (1.18.9-arm-linux-musl) + nokogiri (1.18.10-arm64-darwin) racc (~> 1.4) - nokogiri (1.18.9-arm64-darwin) + nokogiri (1.18.10-x86_64-darwin) racc (~> 1.4) - nokogiri (1.18.9-x86_64-darwin) + nokogiri (1.18.10-x86_64-linux-gnu) racc (~> 1.4) - nokogiri (1.18.9-x86_64-linux-gnu) - racc (~> 1.4) - nokogiri (1.18.9-x86_64-linux-musl) + nokogiri (1.18.10-x86_64-linux-musl) racc (~> 1.4) orm_adapter (0.5.0) - ostruct (0.6.1) - overcommit (0.64.1) + ostruct (0.6.3) + overcommit (0.68.0) childprocess (>= 0.6.3, < 6) iniparse (~> 1.4) rexml (>= 3.3.9) - parallel (1.26.3) - parser (3.3.6.0) + parallel (1.27.0) + parser (3.3.9.0) ast (~> 2.4.1) racc poltergeist (1.18.1) @@ -454,6 +452,7 @@ GEM pp (0.6.2) prettyprint prettyprint (0.2.0) + prism (1.5.1) pry (0.14.2) coderay (~> 1.1) method_source (~> 1.0) @@ -462,32 +461,32 @@ GEM psych (5.2.6) date stringio - public_suffix (6.0.1) - puma (6.6.0) + public_suffix (6.0.2) + puma (6.6.1) nio4r (~> 2.0) racc (1.8.1) - rack (2.2.17) - rack-session (1.0.2) - rack (< 3) + rack (3.2.3) + rack-session (2.1.1) + base64 (>= 0.1.0) + rack (>= 3.0.0) rack-test (2.2.0) rack (>= 1.3) - rackup (1.0.1) - rack (< 3) - webrick - rails (7.2.2.1) - actioncable (= 7.2.2.1) - actionmailbox (= 7.2.2.1) - actionmailer (= 7.2.2.1) - actionpack (= 7.2.2.1) - actiontext (= 7.2.2.1) - actionview (= 7.2.2.1) - activejob (= 7.2.2.1) - activemodel (= 7.2.2.1) - activerecord (= 7.2.2.1) - activestorage (= 7.2.2.1) - activesupport (= 7.2.2.1) + rackup (2.2.1) + rack (>= 3) + rails (8.0.3) + actioncable (= 8.0.3) + actionmailbox (= 8.0.3) + actionmailer (= 8.0.3) + actionpack (= 8.0.3) + actiontext (= 8.0.3) + actionview (= 8.0.3) + activejob (= 8.0.3) + activemodel (= 8.0.3) + activerecord (= 8.0.3) + activestorage (= 8.0.3) + activesupport (= 8.0.3) bundler (>= 1.15.0) - railties (= 7.2.2.1) + railties (= 8.0.3) rails-controller-testing (1.0.5) actionpack (>= 5.0.1.rc1) actionview (>= 5.0.1.rc1) @@ -508,16 +507,16 @@ GEM json require_all (~> 3.0) ruby-progressbar - railties (7.2.2.1) - actionpack (= 7.2.2.1) - activesupport (= 7.2.2.1) + railties (8.0.3) + actionpack (= 8.0.3) + activesupport (= 8.0.3) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) thor (~> 1.0, >= 1.2.2) + tsort (>= 0.2) zeitwerk (~> 2.6) rainbow (3.1.1) - raindrops (0.20.1) rake (13.3.0) rb-fsevent (0.11.2) rb-inotify (0.11.1) @@ -525,7 +524,7 @@ GEM rdoc (6.14.2) erb psych (>= 4.0.0) - regexp_parser (2.9.3) + regexp_parser (2.11.3) reline (0.6.2) io-console (~> 0.5) remotipart (1.4.4) @@ -541,7 +540,7 @@ GEM http-cookie (>= 1.0.2, < 2.0) mime-types (>= 1.16, < 4.0) netrc (~> 0.8) - rexml (3.3.9) + rexml (3.4.4) roar (1.1.1) representable (~> 3.0) roar-rails (1.1.0) @@ -562,107 +561,96 @@ GEM rubocop-ast (>= 1.36.2, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 4.0) - rubocop-ast (1.36.2) - parser (>= 3.3.1.0) - rubocop-rspec (3.2.0) + rubocop-ast (1.47.1) + parser (>= 3.3.7.2) + prism (~> 1.4) + rubocop-rspec (3.4.0) rubocop (~> 1.61) ruby-progressbar (1.13.0) - ruby-vips (2.2.2) + ruby-vips (2.2.5) ffi (~> 1.12) logger ruby2_keywords (0.0.5) rubyzip (1.3.0) - sass (3.7.4) - sass-listen (~> 4.0.0) - sass-embedded (1.82.0-aarch64-linux-gnu) - google-protobuf (~> 4.28) - sass-embedded (1.82.0-aarch64-linux-musl) - google-protobuf (~> 4.28) - sass-embedded (1.82.0-arm-linux-gnueabihf) - google-protobuf (~> 4.28) - sass-embedded (1.82.0-arm-linux-musleabihf) - google-protobuf (~> 4.28) - sass-embedded (1.82.0-arm64-darwin) - google-protobuf (~> 4.28) - sass-embedded (1.82.0-x86-linux-gnu) - google-protobuf (~> 4.28) - sass-embedded (1.82.0-x86-linux-musl) - google-protobuf (~> 4.28) - sass-embedded (1.82.0-x86_64-darwin) - google-protobuf (~> 4.28) - sass-embedded (1.82.0-x86_64-linux-gnu) - google-protobuf (~> 4.28) - sass-embedded (1.82.0-x86_64-linux-musl) - google-protobuf (~> 4.28) - sass-listen (4.0.0) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - sass-rails (5.0.8) - railties (>= 5.2.0) - sass (~> 3.1) - sprockets (>= 2.8, < 4.0) - sprockets-rails (>= 2.0, < 4.0) - tilt (>= 1.1, < 3) + sass-embedded (1.93.2-aarch64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-aarch64-linux-musl) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-arm-linux-gnueabihf) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-arm-linux-musleabihf) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-arm64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-x86_64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-x86_64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.93.2-x86_64-linux-musl) + google-protobuf (~> 4.31) + sass-rails (6.0.0) + sassc-rails (~> 2.1, >= 2.1.1) sassc (2.4.0) ffi (~> 1.9) - sassc-embedded (1.80.1) + sassc-embedded (1.80.5) sass-embedded (~> 1.80) - scss_lint (0.60.0) - sass (~> 3.5, >= 3.5.5) + sassc-rails (2.1.2) + railties (>= 4.0.0) + sassc (>= 2.0) + sprockets (> 3.0) + sprockets-rails + tilt securerandom (0.4.1) - selenium-webdriver (4.27.0) + selenium-webdriver (4.35.0) base64 (~> 0.2) logger (~> 1.4) rexml (~> 3.2, >= 3.2.5) - rubyzip (>= 1.2.2, < 3.0) + rubyzip (>= 1.2.2, < 4.0) websocket (~> 1.0) - sexp_processor (4.17.3) + sexp_processor (4.17.4) simplecov (0.22.0) docile (~> 1.1) simplecov-html (~> 0.11) simplecov_json_formatter (~> 0.1) - simplecov-cobertura (2.1.0) + simplecov-cobertura (3.1.0) rexml simplecov (~> 0.19) - simplecov-html (0.13.1) + simplecov-html (0.13.2) simplecov_json_formatter (0.1.4) - sprockets (3.7.5) - base64 + sprockets (4.2.2) concurrent-ruby (~> 1.0) - rack (> 1, < 3) + logger + rack (>= 2.2.4, < 4) sprockets-rails (3.5.2) actionpack (>= 6.1) activesupport (>= 6.1) sprockets (>= 3.0.0) - ssrf_filter (1.2.0) + ssrf_filter (1.3.0) stringio (3.1.7) - sys-uname (1.3.1) + sys-uname (1.4.1) ffi (~> 1.1) + memoist3 (~> 1.0.0) systemu (2.6.5) - telephone_number (1.4.22) + telephone_number (1.4.23) test_xml (0.1.8) diffy (~> 3.0) nokogiri (>= 1.3.2) thor (1.4.0) thread_safe (0.3.6) - tilt (2.4.0) + tilt (2.6.1) timeout (0.4.3) - typhoeus (1.4.1) - ethon (>= 0.9.0) + tsort (0.2.0) + typhoeus (1.5.0) + ethon (>= 0.9.0, < 0.16.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) uber (0.1.0) uglifier (4.2.1) execjs (>= 0.3.0, < 3) - unicode-display_width (3.1.2) - unicode-emoji (~> 4.0, >= 4.0.4) - unicode-emoji (4.0.4) - unicorn (6.1.0) - kgio (~> 2.6) - raindrops (~> 0.7) - unicorn-rails (2.2.1) - rack - unicorn + unicode-display_width (3.2.0) + unicode-emoji (~> 4.1) + unicode-emoji (4.1.0) + uri (1.0.4) useragent (0.16.11) uuid (2.3.9) macaddr (~> 1.0) @@ -683,13 +671,14 @@ GEM activemodel (>= 6.0.0) bindex (>= 0.4.0) railties (>= 6.0.0) - webmock (3.24.0) + webmock (3.25.1) addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) webrick (1.9.1) websocket (1.2.11) - websocket-driver (0.7.6) + websocket-driver (0.8.0) + base64 websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) xpath (3.2.0) @@ -699,20 +688,14 @@ GEM rubyzip (>= 1.0.0) PLATFORMS - aarch64-linux aarch64-linux-gnu aarch64-linux-musl - arm-linux arm-linux-gnu arm-linux-gnueabihf arm-linux-musl arm-linux-musleabihf arm64-darwin - x86-linux - x86-linux-gnu - x86-linux-musl x86_64-darwin - x86_64-linux x86_64-linux-gnu x86_64-linux-musl @@ -720,8 +703,8 @@ DEPENDENCIES axe-core-capybara axe-core-cucumber bootsnap - bootstrap (~> 5.3.3) - bootstrap_form (~> 2.7) + bootstrap (~> 5.3.5) + bootstrap_form (~> 5.4) breadcrumbs_on_rails bson bundler-audit @@ -733,20 +716,21 @@ DEPENDENCIES carrierwave-mongoid codecov cqm-models (~> 4.2.0) - cqm-parsers (~> 4.1.1.1) - cqm-reports (~> 4.1.4) + cqm-parsers (~> 4.1.1.2) + cqm-reports (~> 4.1.5) cqm-validators (~> 4.0.6) + csv (~> 3.3, >= 3.3.5) cucumber-rails - dartsass-sprockets + dartsass-sprockets (~> 3.2, >= 3.2.1) database_cleaner-mongoid delayed_job_mongoid (~> 3.0.0) devise devise_invitable factory_bot_rails faker (> 1.5.0) - font-awesome-sass (~> 5.0.13) + font-awesome-sass (~> 6.7, >= 6.7.2) jasny-bootstrap-rails - jbuilder (~> 2.11.0) + jbuilder (~> 2.14, >= 2.14.1) jquery-datatables-rails jquery-rails jquery-ui-rails (~> 8.0.0) @@ -758,17 +742,16 @@ DEPENDENCIES minitest-rails minitest-reporters mocha - mongoid (~> 8.1.0) + mongoid (~> 9.0.0) multi_json mustache - nested_form newrelic_rpm overcommit poltergeist pry pry-nav puma (~> 6.6) - rails (~> 7.2.0) + rails (~> 8.0, >= 8.0.2.1) rails-controller-testing rails-perftest rails_best_practices @@ -778,25 +761,23 @@ DEPENDENCIES rest-client (~> 2.0.2) roar-rails rolify - rubocop + rubocop (= 1.69.1) rubocop-rspec - sass-rails (~> 5.0.4) - scss_lint selenium-webdriver simplecov simplecov-cobertura telephone_number turbolinks! uglifier (>= 1.3.0) - unicorn-rails validate_url vcr vmstat web-console (~> 4.2.0) webmock + webrick RUBY VERSION - ruby 3.3.8p144 + ruby 3.4.5p51 BUNDLED WITH - 2.7.0 + 2.6.9 diff --git a/Procfile b/Procfile index 793489725..f787d4ed7 100644 --- a/Procfile +++ b/Procfile @@ -1,2 +1,2 @@ -web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb +web: bundle exec puma -C config/puma.rb worker: bundle exec rake jobs:work diff --git a/app/assets/config/manifest.js b/app/assets/config/manifest.js new file mode 100644 index 000000000..c4df807ae --- /dev/null +++ b/app/assets/config/manifest.js @@ -0,0 +1,5 @@ +// manifest.js necessary for newer version of dartsass-sprockets +//= link_tree ../images +//= link_directory ../javascripts .js +// compile all SCSS through application.scss, expose that one CSS bundle +//= link application.css diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index eef8d4f76..b5261fb56 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -20,7 +20,6 @@ //= require jquery-ui/widgets/datepicker //= require assets_framework/assets.core //= require assets_framework/breadcrumb -//= require jquery_nested_form //= require jasny-bootstrap.min //= require local-time //= require_tree . diff --git a/app/assets/javascripts/checklist_measures.js b/app/assets/javascripts/checklist_measures.js index 8ffb5358c..459e5ae13 100644 --- a/app/assets/javascripts/checklist_measures.js +++ b/app/assets/javascripts/checklist_measures.js @@ -20,7 +20,7 @@ var ready_run_once; ready_run_once = function() { // Enable changing measures - $('#save_options').find('button.confirm').on('click', function (event) { + $('#save_options').find('button').on('click', function (event) { event.preventDefault(); $('.btn-danger').attr('disabled', false); }); diff --git a/app/assets/javascripts/measure_selection.js b/app/assets/javascripts/measure_selection.js index 72c5132f5..87f23aee3 100644 --- a/app/assets/javascripts/measure_selection.js +++ b/app/assets/javascripts/measure_selection.js @@ -51,7 +51,7 @@ function UpdateGroupSelections(event) { } else { return '' } }); - $('.select-measures .panel-title .selected-number') + $('.select-measures .card-title .selected-number') .html(function() { if ($('.measure-group .measure-checkbox:checked').length > 0) { return $('.measure-group .measure-checkbox:checked').length + '' @@ -133,7 +133,7 @@ function UpdateMeasureSet(bundle_id) { // Allows the enabling or disabling of a checkbox by passing true or false // as the second parameter. True means disabled and false means enabled. function setCheckboxDisabled(element, state) { - var children = $(element).closest('div.checkbox').find('*').addBack(); + var children = $(element).closest('input.form-check-input').find('*').addBack(); if (state) { $(children).addClass('disabled'); $(children).prop('disabled', true); @@ -146,7 +146,7 @@ function setCheckboxDisabled(element, state) { } function setCheckboxDisabledNoUncheck(element, state) { - var children = $(element).closest('div.checkbox').find('*').addBack(); + var children = $(element).closest('input.form-check-input').find('*').addBack(); if (state) { $(children).addClass('disabled'); $(children).prop('disabled', true); @@ -253,7 +253,7 @@ ready_run_once = function() { }); // Checking a radio button indicating measure selection - $('.btn-checkbox input[name="product[measure_selection]"]').on('change', function() { + $('.form-check input[name="product[measure_selection]"]').on('change', function() { if ($(this).attr('disabled') != true) { var selection = $(this).val(); @@ -284,7 +284,7 @@ ready_run_once = function() { // Changing the bundle - $('.btn-checkbox input[name="product[bundle_id]"]').on('change', function() { + $('.form-check input[name="product[bundle_id]"]').on('change', function() { if ($(this).attr('disabled') != true) { var selection = $(this).val(); UpdateMeasureSet(selection); @@ -292,25 +292,25 @@ ready_run_once = function() { }); // Check Duplicate Records on C2 Test check - $('.btn-checkbox input[name="product[c2_test]"]').on('change', function() { + $('.form-check input[name="product[c2_test]"]').on('change', function() { if ($(this).attr('disabled') != true) { var c2_checked = $(this).prop('checked'); setCheckboxDisabled('#product_duplicate_patients', !c2_checked); - $('.btn-checkbox input[name="product[duplicate_patients]"]').prop('checked', c2_checked); + $('.form-check-input#product_duplicate_patients').prop('checked', c2_checked); } }); // Check Duplicate Records on CVU+ check - $('.btn-checkbox input[name="product[cvuplus]"]').on('change', function() { + $('.form-check input[name="product[cvuplus]"]').on('change', function() { if ($(this).attr('disabled') != true) { var cvu_plus = $(this).val(); var c2_checked = $('input[name="product[c2_test]"]')[1].checked setCheckboxDisabled('#product_duplicate_patients', (cvu_plus == 'false' && !c2_checked)); - $('.btn-checkbox input[name="product[duplicate_patients]"]').prop('checked', cvu_plus == 'true' || c2_checked); + $('.form-check-input#product_duplicate_patients').prop('checked', cvu_plus == 'true' || c2_checked); } }); - $('.btn-checkbox input[name="product[cvuplus]"]').on('change', function() { + $('.form-check input[name="product[cvuplus]"]').on('change', function() { var cvuplus_checked = ($(this).val() == 'true'); if ($(this).attr('disabled') != 'disabled') { setCheckboxDisabledNoUncheck('#product_vendor_patients', !cvuplus_checked); diff --git a/app/assets/javascripts/records.js b/app/assets/javascripts/records.js index 477b51ecd..7ba8b85e5 100644 --- a/app/assets/javascripts/records.js +++ b/app/assets/javascripts/records.js @@ -16,13 +16,17 @@ ready = function() { // when the user selects a different bundle // just take them to the new page // use Turbolinks so it doesn't full refresh - $(document).on('change', 'label.bundle-checkbox input[name="bundle_id"]', function() { + $(document).on('change', 'input[name="bundle_id"]', function() { var bundle_id = $(this).val(); - Turbolinks.visit("/bundles/"+bundle_id+"/records"); + if ($(this).next('.bundle-checkbox').length > 0) { + Turbolinks.visit("/bundles/"+bundle_id+"/records"); + } }); - $(document).on('change', 'label.vendor-checkbox input[name="bundle_id"]', function() { + $(document).on('change', 'input[name="bundle_id"]', function() { var bundle_id = $(this).val(); - Turbolinks.visit("?bundle_id="+bundle_id); + if ($(this).next('.vendor-checkbox').length > 0) { + Turbolinks.visit("?bundle_id="+bundle_id); + } }); // This is its own unique checkbox panel danger class, so should not affect diff --git a/app/assets/javascripts/vendors.js b/app/assets/javascripts/vendors.js new file mode 100644 index 000000000..3ad8a1b4d --- /dev/null +++ b/app/assets/javascripts/vendors.js @@ -0,0 +1,25 @@ +document.addEventListener("DOMContentLoaded", function() { + var commentsContainer = document.getElementById("pocs"); + var addCommentButton = document.getElementById("add-poc"); + var uniqueIndex = new Date().getTime(); + + addCommentButton.addEventListener("click", function() { + // Get the template for a new comment + var newCommentTemplate = document.querySelector("#new-poc-template").innerHTML; + + var newFieldHtml = newCommentTemplate.replace(/new_record/g, uniqueIndex); + + // Insert the new comment fields into the container + commentsContainer.insertAdjacentHTML("beforeend", newFieldHtml); + + uniqueIndex++; + }); + + commentsContainer.addEventListener("click", function(event) { + if (event.target.classList.contains("remove-poc")) { + var nestedFields = event.target.closest(".nested-fields"); + nestedFields.querySelector('input[name*="_destroy"]').value = "1"; + nestedFields.style.display = "none"; + } + }); +}); \ No newline at end of file diff --git a/app/assets/stylesheets/_bootstrap-variables.scss b/app/assets/stylesheets/_bootstrap-variables.scss index 9f3b69e9c..1c85648f2 100644 --- a/app/assets/stylesheets/_bootstrap-variables.scss +++ b/app/assets/stylesheets/_bootstrap-variables.scss @@ -1,3 +1,4 @@ +@use "sass:color"; $bootstrap-sass-asset-helper: false !default; // // Variables @@ -9,16 +10,16 @@ $bootstrap-sass-asset-helper: false !default; //## Gray and brand colors for use across Bootstrap. $gray-base: #000 !default; -$gray-darker: lighten($gray-base, 13.5%) !default; // #222 -$gray-dark: lighten($gray-base, 20%) !default; // #333 -$gray: lighten($gray-base, 33.5%) !default; // #555 -$gray-light: lighten($gray-base, 46.2745%) !default; // #767676 -$gray-lighter: lighten($gray-base, 93.5%) !default; // #eee +$gray-darker: color.adjust($gray-base, $lightness: 13.5%) !default; // #222 +$gray-dark: color.adjust($gray-base, $lightness: 20%) !default; // #333 +$gray: color.adjust($gray-base, $lightness: 33.5%) !default; // #555 +$gray-light: color.adjust($gray-base, $lightness: 46.2745%) !default; // #767676 +$gray-lighter: color.adjust($gray-base, $lightness: 93.5%) !default; // #eee $gray-medium-light: $gray-light !default; $brand-primary: #527E73 !default; -$brand-primary-highlight: lighten(saturate($brand-primary, 80%), 20%); +$brand-primary-highlight: color.adjust(color.adjust($brand-primary, $saturation: 80%), $lightness: 20%); $brand-secondary: #2b4941 !default; $brand-success: #269E00 !default; $brand-info: #106078 !default; @@ -36,9 +37,9 @@ $body-bg: #fff !default; $text-color: $gray-dark !default; //** Global textual link color. -$link-color: darken(saturate($brand-primary, 40%), 12%) !default; -//** Link hover color set via `darken()` function. -$link-hover-color: darken($link-color, 10%) !default; +$link-color: color.adjust(color.adjust($brand-primary, $saturation: 40%), $lightness: -12%) !default; +//** Link hover color set via `color.adjust()` function. +$link-hover-color: color.adjust($link-color, $lightness: -10%) !default; //** Link hover decoration. $link-hover-decoration: underline !default; @@ -157,29 +158,29 @@ $btn-font-weight: normal !default; $btn-default-color: #666 !default; $btn-default-bg: #fff !default; -$btn-default-border: desaturate(darken($brand-primary, 10%), 35%) !default; +$btn-default-border: color.adjust(color.adjust($brand-primary, $lightness: -10%), $saturation: -35%) !default; $btn-primary-color: #fff !default; $btn-primary-bg: $brand-primary !default; -$btn-primary-border: darken($btn-primary-bg, 5%) !default; +$btn-primary-border: color.adjust($btn-primary-bg, $lightness: -5%) !default; $btn-success-color: #fff !default; -$btn-success-bg: darken($brand-success, 10%) !default; -$btn-success-border: darken($btn-success-bg, 5%) !default; +$btn-success-bg: color.adjust($brand-success, $lightness: -10%) !default; +$btn-success-border: color.adjust($btn-success-bg, $lightness: -5%) !default; $btn-info-color: #fff !default; $btn-info-bg: $brand-info !default; -$btn-info-border: darken($btn-info-bg, 5%) !default; +$btn-info-border: color.adjust($btn-info-bg, $lightness: -5%) !default; $btn-warning-color: #fff !default; $btn-warning-bg: $brand-warning !default; -$btn-warning-border: darken($btn-warning-bg, 5%) !default; +$btn-warning-border: color.adjust($btn-warning-bg, $lightness: -5%) !default; $btn-danger-color: $brand-danger !default; $btn-danger-bg: #fff !default; -$btn-danger-border: darken($btn-danger-color, 5%) !default; +$btn-danger-border: color.adjust($btn-danger-color, $lightness: -5%) !default; -$btn-pop-color: desaturate($brand-primary-highlight, 40%) !default; +$btn-pop-color: color.adjust($brand-primary-highlight, $saturation: -40%) !default; $btn-pop-bg: Transparent !default; $btn-pop-border: Transparent !default; @@ -196,14 +197,14 @@ $btn-border-radius-small: $border-radius-small !default; //## //** `` background color -$input-bg: lighten($brand-primary, 55%) !default; +$input-bg: color.adjust($brand-primary, $lightness: 55%) !default; //** `` background color $input-bg-disabled: $gray-lighter !default; //** Text color for ``s $input-color: $gray-darker !default; //** `` border color -$input-border: darken($input-bg, 30%) !default; + $input-border: color.adjust($input-bg, $lightness: -30%) !default; // TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4 //** Default `.form-control` border radius @@ -258,7 +259,7 @@ $dropdown-divider-bg: #e5e5e5 !default; //** Dropdown link text color. $dropdown-link-color: $gray-dark !default; //** Hover color for dropdown links. -$dropdown-link-hover-color: darken($gray-dark, 5%) !default; + $dropdown-link-hover-color: color.adjust($gray-dark, $lightness: -5%) !default; //** Hover background for dropdown links. $dropdown-link-hover-bg: #f5f5f5 !default; @@ -375,8 +376,8 @@ $container-lg: $container-large-desktop !default; $navbar-height: 28px !default; $navbar-margin-bottom: 1em !default; $navbar-border-radius: $border-radius-base !default; -$navbar-padding-horizontal: floor(($grid-gutter-width / 2)) !default; -$navbar-padding-vertical: (($navbar-height - $line-height-computed) / 4) !default; +$navbar-padding-horizontal: floor(calc($grid-gutter-width / 2)) !default; +$navbar-padding-vertical: (calc($navbar-height - $line-height-computed) / 4) !default; $navbar-collapse-max-height: 340px !default; $navbar-shadow: rgba(0,0,0, .15) !default; @@ -386,10 +387,10 @@ $navbar-default-border: $gray-lighter !default; // Navbar links $navbar-default-link-color: $brand-primary !default; -$navbar-default-link-hover-color: desaturate(lighten($brand-primary, 65%), 50%) !default; + $navbar-default-link-hover-color: color.adjust(color.adjust($brand-primary, $lightness: 65%), $saturation: -50%) !default; $navbar-default-link-hover-bg: $brand-primary !default; -$navbar-default-link-active-color: darken($brand-primary, 20%) !default; -$navbar-default-link-active-bg: desaturate(lighten($brand-primary, 65%), 50%) !default; + $navbar-default-link-active-color: color.adjust($brand-primary, $lightness: -20%) !default; + $navbar-default-link-active-bg: color.adjust(color.adjust($brand-primary, $lightness: 65%), $saturation: -50%) !default; $navbar-default-link-disabled-color: #ccc !default; $navbar-default-link-disabled-bg: transparent !default; @@ -406,16 +407,16 @@ $navbar-default-toggle-border-color: transparent !default; //=== Inverted navbar // Reset inverted navbar basics -$navbar-inverse-color: lighten($brand-primary, 55%) !default; + $navbar-inverse-color: color.adjust($brand-primary, $lightness: 55%) !default; $navbar-inverse-bg: $brand-primary !default; -$navbar-inverse-border: darken($navbar-inverse-bg, 10%) !default; + $navbar-inverse-border: color.adjust($navbar-inverse-bg, $lightness: -10%) !default; // Inverted navbar links $navbar-inverse-link-color: #fff !default; -$navbar-inverse-link-hover-color: lighten($brand-primary, 60%) !default; -$navbar-inverse-link-hover-bg: darken($navbar-inverse-bg, 10%) !default; + $navbar-inverse-link-hover-color: color.adjust($brand-primary, $lightness: 60%) !default; + $navbar-inverse-link-hover-bg: color.adjust($navbar-inverse-bg, $lightness: -10%) !default; $navbar-inverse-link-active-color: $navbar-inverse-link-color !default; -$navbar-inverse-link-active-bg: darken($navbar-inverse-bg, 15%) !default; + $navbar-inverse-link-active-bg: color.adjust($navbar-inverse-bg, $lightness: -15%) !default; $navbar-inverse-link-disabled-color: #444 !default; $navbar-inverse-link-disabled-bg: transparent !default; @@ -512,21 +513,21 @@ $jumbotron-heading-font-size: ceil(($font-size-base * 4.5)) !default; // //## Define colors for form feedback states and, by default, alerts. -$state-success-text: darken($brand-success, 10%) !default; -$state-success-bg: lighten(desaturate($brand-success, 30%), 62%) !default; -$state-success-border: darken($state-success-bg, 5%) !default; + $state-success-text: color.adjust($brand-success, $lightness: -10%) !default; + $state-success-bg: color.adjust(color.adjust($brand-success, $saturation: -30%), $lightness: 62%) !default; + $state-success-border: color.adjust($state-success-bg, $lightness: -5%) !default; -$state-info-text: darken($brand-info, 10%) !default; -$state-info-bg: lighten(desaturate($brand-info, 30%), 65%) !default; -$state-info-border: darken($state-info-bg, 7%) !default; + $state-info-text: color.adjust($brand-info, $lightness: -10%) !default; + $state-info-bg: color.adjust(color.adjust($brand-info, $saturation: -30%), $lightness: 65%) !default; + $state-info-border: color.adjust($state-info-bg, $lightness: -7%) !default; -$state-warning-text: darken($brand-warning, 10%) !default; -$state-warning-bg: lighten(desaturate($brand-warning, 30%), 65%) !default; -$state-warning-border: darken($state-warning-bg, 5%) !default; + $state-warning-text: color.adjust($brand-warning, $lightness: -10%) !default; + $state-warning-bg: color.adjust(color.adjust($brand-warning, $saturation: -30%), $lightness: 65%) !default; + $state-warning-border: color.adjust($state-warning-bg, $lightness: -5%) !default; -$state-danger-text: darken($brand-danger, 10%) !default; -$state-danger-bg: lighten(desaturate($brand-danger, 30%), 68%) !default; -$state-danger-border: darken($state-danger-bg, 5%) !default; + $state-danger-text: color.adjust($brand-danger, $lightness: -10%) !default; + $state-danger-bg: color.adjust(color.adjust($brand-danger, $saturation: -30%), $lightness: 68%) !default; + $state-danger-border: color.adjust($state-danger-bg, $lightness: -5%) !default; //== Tooltips @@ -561,7 +562,7 @@ $popover-border-color: rgba(0, 0, 0, .2) !default; $popover-fallback-border-color: #ccc !default; //** Popover title background color -$popover-title-bg: darken($popover-bg, 3%) !default; + $popover-title-bg: color.adjust($popover-bg, $lightness: -3%) !default; //** Popover arrow width $popover-arrow-width: 10px !default; @@ -573,7 +574,7 @@ $popover-arrow-outer-width: ($popover-arrow-width + 1) !default; //** Popover outer arrow color $popover-arrow-outer-color: fade_in($popover-border-color, 0.05) !default; //** Popover outer arrow fallback color -$popover-arrow-outer-fallback-color: darken($popover-fallback-border-color, 20%) !default; + $popover-arrow-outer-fallback-color: color.adjust($popover-fallback-border-color, $lightness: -20%) !default; //== Labels @@ -700,7 +701,7 @@ $list-group-active-bg: $component-active-bg !default; //** Border color of active list elements $list-group-active-border: $list-group-active-bg !default; //** Text color for content within active list items -$list-group-active-text-color: lighten($list-group-active-bg, 40%) !default; + $list-group-active-text-color: color.adjust($list-group-active-bg, $lightness: 40%) !default; //** Text color of disabled list items $list-group-disabled-color: $gray-light !default; @@ -728,32 +729,32 @@ $panel-border-radius: $border-radius-base !default; $panel-footer-bg: $gray-lighter !default; $panel-inner-border: transparent !default; -$panel-default-text: lighten($brand-primary, 55%) !default; -$panel-default-heading-bg: darken($brand-primary, 5%) !default; + $panel-default-text: color.adjust($brand-primary, $lightness: 55%) !default; + $panel-default-heading-bg: color.adjust($brand-primary, $lightness: -5%) !default; $panel-default-border: transparentize($brand-primary, 0.8) !default; -$panel-primary-text: lighten($brand-primary, 55%) !default; -$panel-primary-heading-bg: darken($brand-primary, 5%) !default; + $panel-primary-text: color.adjust($brand-primary, $lightness: 55%) !default; + $panel-primary-heading-bg: color.adjust($brand-primary, $lightness: -5%) !default; $panel-primary-border: transparentize($brand-primary, 0.8) !default; $panel-inactive-text: #555 !default; $panel-inactive-heading-bg: #fff !default; -$panel-inactive-border: desaturate(darken($brand-primary, 10%), 35%) !default; + $panel-inactive-border: color.adjust(color.adjust($brand-primary, $lightness: -10%), $saturation: -35%) !default; -$panel-success-text: lighten($state-success-text, 60%) !default; -$panel-success-heading-bg: darken($brand-success, 10%) !default; + $panel-success-text: color.adjust($state-success-text, $lightness: 60%) !default; + $panel-success-heading-bg: color.adjust($brand-success, $lightness: -10%) !default; $panel-success-border: transparentize($brand-success, 0.8) !default; -$panel-info-text: lighten($state-info-text, 50%) !default; -$panel-info-heading-bg: darken($brand-info, 5%) !default; + $panel-info-text: color.adjust($state-info-text, $lightness: 50%) !default; + $panel-info-heading-bg: color.adjust($brand-info, $lightness: -5%) !default; $panel-info-border: transparentize($brand-info, 0.8) !default; -$panel-warning-text: lighten($state-warning-text, 50%) !default; -$panel-warning-heading-bg: darken($brand-warning, 5%) !default; + $panel-warning-text: color.adjust($state-warning-text, $lightness: 50%) !default; + $panel-warning-heading-bg: color.adjust($brand-warning, $lightness: -5%) !default; $panel-warning-border: transparentize($brand-warning, 0.8) !default; -$panel-danger-text: lighten($state-danger-text, 55%) !default; -$panel-danger-heading-bg: darken($brand-danger, 5%) !default; + $panel-danger-text: color.adjust($state-danger-text, $lightness: 55%) !default; + $panel-danger-heading-bg: color.adjust($brand-danger, $lightness: -5%) !default; $panel-danger-border: transparentize($brand-danger, 0.8) !default; @@ -781,7 +782,7 @@ $thumbnail-caption-padding: 9px !default; //## $well-bg: #f5f5f5 !default; -$well-border: darken($well-bg, 7%) !default; + $well-border: color.adjust($well-bg, $lightness: -7%) !default; //== Badges @@ -812,9 +813,9 @@ $breadcrumb-padding-horizontal: 15px !default; //** Breadcrumb background color $breadcrumb-bg: transparent !default; //** Breadcrumb text color -$breadcrumb-color: darken($brand-primary, 20%) !default; + $breadcrumb-color: color.adjust($brand-primary, $lightness: -20%) !default; //** Text color of current page in the breadcrumb -$breadcrumb-active-color: lighten($brand-primary, 60%) !default; + $breadcrumb-active-color: color.adjust($brand-primary, $lightness: 60%) !default; //** Textual separator for between breadcrumb elements $breadcrumb-separator: ">" !default; diff --git a/app/assets/stylesheets/_bootstrap.scss b/app/assets/stylesheets/_bootstrap.scss index 83743971d..5d4040102 100644 --- a/app/assets/stylesheets/_bootstrap.scss +++ b/app/assets/stylesheets/_bootstrap.scss @@ -5,8 +5,10 @@ // scss-docs-start import-stack // Configuration @import "bootstrap/functions"; -@import 'variables'; -@import 'variables-dark'; +@import "variables"; +@import "variables-dark"; +@import "bootstrap/variables"; +@import "bootstrap/variables-dark"; @import "bootstrap/maps"; @import "bootstrap/mixins"; @import "bootstrap/utilities"; @@ -49,4 +51,4 @@ // Utilities @import "bootstrap/utilities/api"; -// scss-docs-end import-stack \ No newline at end of file +// scss-docs-end import-stack diff --git a/app/assets/stylesheets/_globals.scss b/app/assets/stylesheets/_globals.scss index d060da815..5a3e1d9bc 100644 --- a/app/assets/stylesheets/_globals.scss +++ b/app/assets/stylesheets/_globals.scss @@ -1,21 +1,7 @@ -@import 'bootstrap'; -@import 'font-awesome-sprockets'; -@import 'font-awesome'; +@use 'variables' as *; // Turbolinks progress bar #cypress::before { background-color: $secondary; height: 6px; } - -// Mixins -@mixin hidden-cell() { - // we want visually reduce the appearance, but it's ok to reveal to screen readers - color: $gray-600; - border: 0; -} - -@mixin hidden-header-cell() { - color: $gray-600; - border-bottom: 0; -} diff --git a/app/assets/stylesheets/_parsley.scss b/app/assets/stylesheets/_parsley.scss index 5ca312914..b99c15e24 100644 --- a/app/assets/stylesheets/_parsley.scss +++ b/app/assets/stylesheets/_parsley.scss @@ -1,3 +1,6 @@ +@use 'variables' as *; +@use 'font-awesome' as *; + .parsley-success { // color: $success-text-emphasis; // border: 1px solid $success-border-subtle; diff --git a/app/assets/stylesheets/_variables.scss b/app/assets/stylesheets/_variables.scss index 655f79d81..b2feea0a7 100644 --- a/app/assets/stylesheets/_variables.scss +++ b/app/assets/stylesheets/_variables.scss @@ -1,3 +1,6 @@ +@use "sass:color"; +@use "sass:string"; + // Variables // // Variables should follow the `$component-state-property-size` formula for @@ -76,100 +79,100 @@ $color-contrast-dark: $black !default; $color-contrast-light: $white !default; // fusv-disable -$blue-100: tint-color($blue, 80%) !default; -$blue-200: tint-color($blue, 60%) !default; -$blue-300: tint-color($blue, 40%) !default; -$blue-400: tint-color($blue, 20%) !default; + $blue-100: color.mix(white, $blue, 80%) !default; + $blue-200: color.mix(white, $blue, 60%) !default; + $blue-300: color.mix(white, $blue, 40%) !default; + $blue-400: color.mix(white, $blue, 20%) !default; $blue-500: $blue !default; $blue-600: shade-color($blue, 20%) !default; $blue-700: shade-color($blue, 40%) !default; $blue-800: shade-color($blue, 60%) !default; $blue-900: shade-color($blue, 80%) !default; -$indigo-100: tint-color($indigo, 80%) !default; -$indigo-200: tint-color($indigo, 60%) !default; -$indigo-300: tint-color($indigo, 40%) !default; -$indigo-400: tint-color($indigo, 20%) !default; + $indigo-100: color.mix(white, $indigo, 80%) !default; + $indigo-200: color.mix(white, $indigo, 60%) !default; + $indigo-300: color.mix(white, $indigo, 40%) !default; + $indigo-400: color.mix(white, $indigo, 20%) !default; $indigo-500: $indigo !default; $indigo-600: shade-color($indigo, 20%) !default; $indigo-700: shade-color($indigo, 40%) !default; $indigo-800: shade-color($indigo, 60%) !default; $indigo-900: shade-color($indigo, 80%) !default; -$purple-100: tint-color($purple, 80%) !default; -$purple-200: tint-color($purple, 60%) !default; -$purple-300: tint-color($purple, 40%) !default; -$purple-400: tint-color($purple, 20%) !default; + $purple-100: color.mix(white, $purple, 80%) !default; + $purple-200: color.mix(white, $purple, 60%) !default; + $purple-300: color.mix(white, $purple, 40%) !default; + $purple-400: color.mix(white, $purple, 20%) !default; $purple-500: $purple !default; $purple-600: shade-color($purple, 20%) !default; $purple-700: shade-color($purple, 40%) !default; $purple-800: shade-color($purple, 60%) !default; $purple-900: shade-color($purple, 80%) !default; -$pink-100: tint-color($pink, 80%) !default; -$pink-200: tint-color($pink, 60%) !default; -$pink-300: tint-color($pink, 40%) !default; -$pink-400: tint-color($pink, 20%) !default; + $pink-100: color.mix(white, $pink, 80%) !default; + $pink-200: color.mix(white, $pink, 60%) !default; + $pink-300: color.mix(white, $pink, 40%) !default; + $pink-400: color.mix(white, $pink, 20%) !default; $pink-500: $pink !default; $pink-600: shade-color($pink, 20%) !default; $pink-700: shade-color($pink, 40%) !default; $pink-800: shade-color($pink, 60%) !default; $pink-900: shade-color($pink, 80%) !default; -$red-100: tint-color($red, 80%) !default; -$red-200: tint-color($red, 60%) !default; -$red-300: tint-color($red, 40%) !default; -$red-400: tint-color($red, 20%) !default; + $red-100: color.mix(white, $red, 80%) !default; + $red-200: color.mix(white, $red, 60%) !default; + $red-300: color.mix(white, $red, 40%) !default; + $red-400: color.mix(white, $red, 20%) !default; $red-500: $red !default; $red-600: shade-color($red, 20%) !default; $red-700: shade-color($red, 40%) !default; $red-800: shade-color($red, 60%) !default; $red-900: shade-color($red, 80%) !default; -$orange-100: tint-color($orange, 80%) !default; -$orange-200: tint-color($orange, 60%) !default; -$orange-300: tint-color($orange, 40%) !default; -$orange-400: tint-color($orange, 20%) !default; + $orange-100: color.mix(white, $orange, 80%) !default; + $orange-200: color.mix(white, $orange, 60%) !default; + $orange-300: color.mix(white, $orange, 40%) !default; + $orange-400: color.mix(white, $orange, 20%) !default; $orange-500: $orange !default; $orange-600: shade-color($orange, 20%) !default; $orange-700: shade-color($orange, 40%) !default; $orange-800: shade-color($orange, 60%) !default; $orange-900: shade-color($orange, 80%) !default; -$yellow-100: tint-color($yellow, 80%) !default; -$yellow-200: tint-color($yellow, 60%) !default; -$yellow-300: tint-color($yellow, 40%) !default; -$yellow-400: tint-color($yellow, 20%) !default; + $yellow-100: color.mix(white, $yellow, 80%) !default; + $yellow-200: color.mix(white, $yellow, 60%) !default; + $yellow-300: color.mix(white, $yellow, 40%) !default; + $yellow-400: color.mix(white, $yellow, 20%) !default; $yellow-500: $yellow !default; $yellow-600: shade-color($yellow, 20%) !default; $yellow-700: shade-color($yellow, 40%) !default; $yellow-800: shade-color($yellow, 60%) !default; $yellow-900: shade-color($yellow, 80%) !default; -$green-100: tint-color($green, 80%) !default; -$green-200: tint-color($green, 60%) !default; -$green-300: tint-color($green, 40%) !default; -$green-400: tint-color($green, 20%) !default; + $green-100: color.mix(white, $green, 80%) !default; + $green-200: color.mix(white, $green, 60%) !default; + $green-300: color.mix(white, $green, 40%) !default; + $green-400: color.mix(white, $green, 20%) !default; $green-500: $green !default; $green-600: shade-color($green, 20%) !default; $green-700: shade-color($green, 40%) !default; $green-800: shade-color($green, 60%) !default; $green-900: shade-color($green, 80%) !default; -$teal-100: tint-color($teal, 80%) !default; -$teal-200: tint-color($teal, 60%) !default; -$teal-300: tint-color($teal, 40%) !default; -$teal-400: tint-color($teal, 20%) !default; + $teal-100: color.mix(white, $teal, 80%) !default; + $teal-200: color.mix(white, $teal, 60%) !default; + $teal-300: color.mix(white, $teal, 40%) !default; + $teal-400: color.mix(white, $teal, 20%) !default; $teal-500: $teal !default; $teal-600: shade-color($teal, 20%) !default; $teal-700: shade-color($teal, 40%) !default; $teal-800: shade-color($teal, 60%) !default; $teal-900: shade-color($teal, 80%) !default; -$cyan-100: tint-color($cyan, 80%) !default; -$cyan-200: tint-color($cyan, 60%) !default; -$cyan-300: tint-color($cyan, 40%) !default; -$cyan-400: tint-color($cyan, 20%) !default; + $cyan-100: color.mix(white, $cyan, 80%) !default; + $cyan-200: color.mix(white, $cyan, 60%) !default; + $cyan-300: color.mix(white, $cyan, 40%) !default; + $cyan-400: color.mix(white, $cyan, 20%) !default; $cyan-500: $cyan !default; $cyan-600: shade-color($cyan, 20%) !default; $cyan-700: shade-color($cyan, 40%) !default; @@ -333,23 +336,23 @@ $dark-text-emphasis: $gray-700 !default; // scss-docs-end theme-text-variables // scss-docs-start theme-bg-subtle-variables -$primary-bg-subtle: tint-color($primary, 80%) !default; -$secondary-bg-subtle: tint-color($secondary, 80%) !default; -$success-bg-subtle: tint-color($success, 80%) !default; -$info-bg-subtle: tint-color($info, 80%) !default; -$warning-bg-subtle: tint-color($warning, 80%) !default; -$danger-bg-subtle: tint-color($danger, 80%) !default; -$light-bg-subtle: mix($gray-100, $white) !default; + $primary-bg-subtle: color.mix(white, $primary, 80%) !default; + $secondary-bg-subtle: color.mix(white, $secondary, 80%) !default; + $success-bg-subtle: color.mix(white, $success, 80%) !default; + $info-bg-subtle: color.mix(white, $info, 80%) !default; + $warning-bg-subtle: color.mix(white, $warning, 80%) !default; + $danger-bg-subtle: color.mix(white, $danger, 80%) !default; +$light-bg-subtle: color.mix($gray-100, $white) !default; $dark-bg-subtle: $gray-400 !default; // scss-docs-end theme-bg-subtle-variables // scss-docs-start theme-border-subtle-variables -$primary-border-subtle: tint-color($primary, 60%) !default; -$secondary-border-subtle: tint-color($secondary, 60%) !default; -$success-border-subtle: tint-color($success, 60%) !default; -$info-border-subtle: tint-color($info, 60%) !default; -$warning-border-subtle: tint-color($warning, 60%) !default; -$danger-border-subtle: tint-color($danger, 60%) !default; + $primary-border-subtle: color.mix(white, $primary, 60%) !default; + $secondary-border-subtle: color.mix(white, $secondary, 60%) !default; + $success-border-subtle: color.mix(white, $success, 60%) !default; + $info-border-subtle: color.mix(white, $info, 60%) !default; + $warning-border-subtle: color.mix(white, $warning, 60%) !default; + $danger-border-subtle: color.mix(white, $danger, 60%) !default; $light-border-subtle: $gray-200 !default; $dark-border-subtle: $gray-500 !default; // scss-docs-end theme-border-subtle-variables @@ -491,8 +494,8 @@ $grid-breakpoints: ( ) !default; // scss-docs-end grid-breakpoints -@include _assert-ascending($grid-breakpoints, "$grid-breakpoints"); -@include _assert-starts-at-zero($grid-breakpoints, "$grid-breakpoints"); +// @include _assert-ascending($grid-breakpoints, "$grid-breakpoints"); +// @include _assert-starts-at-zero($grid-breakpoints, "$grid-breakpoints"); // Grid containers @@ -509,7 +512,7 @@ $container-max-widths: ( ) !default; // scss-docs-end container-max-widths -@include _assert-ascending($container-max-widths, "$container-max-widths"); +// @include _assert-ascending($container-max-widths, "$container-max-widths"); // Grid columns @@ -843,7 +846,11 @@ $btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default; $btn-link-color: var(--#{$prefix}link-color) !default; $btn-link-hover-color: var(--#{$prefix}link-hover-color) !default; $btn-link-disabled-color: $gray-600 !default; -$btn-link-focus-shadow-rgb: to-rgb(mix(color-contrast($link-color), $link-color, 15%)) !default; +$btn-link-focus-shadow-rgb: ( + color.channel(color.mix(color.mix(white, $link-color, 15%), $link-color, 15%), "red", $space: rgb), + color.channel(color.mix(color.mix(white, $link-color, 15%), $link-color, 15%), "green", $space: rgb), + color.channel(color.mix(color.mix(white, $link-color, 15%), $link-color, 15%), "blue", $space: rgb) +) !default; // Allows for customizing button radius independently from global border radius $btn-border-radius: var(--#{$prefix}border-radius) !default; @@ -1639,7 +1646,7 @@ $breadcrumb-margin-bottom: 1rem !default; $breadcrumb-bg: null !default; $breadcrumb-divider-color: $white !default; $breadcrumb-active-color: var(--#{$prefix}secondary-color) !default; -$breadcrumb-divider: quote(">") !default; +$breadcrumb-divider: string.quote(">") !default; $breadcrumb-divider-flipped: $breadcrumb-divider !default; $breadcrumb-border-radius: null !default; // scss-docs-end breadcrumb-variables @@ -1748,4 +1755,3 @@ $nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, remo $pre-color: null !default; -@import "variables-dark"; // TODO: can be removed safely in v6, only here to avoid breaking changes in v5.3 \ No newline at end of file diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index bd62ad605..c96c53746 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -17,9 +17,35 @@ *= require dataTables/jquery.dataTables */ -@import 'globals'; -@import './assets_framework/custom-mixins'; -@import './assets_framework/breadcrumb'; -@import './assets_framework/widgets/_alerts'; -@import './parsley'; -@import './cypress/**/*'; +@use "variables" as *; +@use "globals" as *; +@use 'bootstrap' as *; +@use 'font-awesome' as *; +@use "./assets_framework/custom-mixins" as *; +@use "./assets_framework/breadcrumb" as *; +@use "./assets_framework/widgets/_alerts" as *; +@use "./parsley" as *; + +// @use './cypress/**/*'; +@use "./cypress/alerts" as cypress_alerts; +@use "./cypress/analysis" as *; +@use "./cypress/buttons" as *; +@use "./cypress/cards" as *; +@use "./cypress/fonts" as *; +@use "./cypress/forms" as *; +@use "./cypress/markup" as *; +@use "./cypress/measure_tests" as *; +@use "./cypress/modal" as *; +@use "./cypress/navbar" as *; +@use "./cypress/print_report" as *; +@use "./cypress/products" as *; +@use "./cypress/record" as *; +@use "./cypress/sessions" as *; +@use "./cypress/tables" as *; +@use "./cypress/tabs" as *; +@use "./cypress/test_executions" as *; +@use "./cypress/text" as *; +@use "./cypress/toggle" as *; +@use "./cypress/valuesets" as *; +@use "./cypress/vendor" as *; +@use "./cypress/xml_view" as *; diff --git a/app/assets/stylesheets/cypress/_alerts.scss b/app/assets/stylesheets/cypress/_alerts.scss index 49f8a4349..e662b21d1 100644 --- a/app/assets/stylesheets/cypress/_alerts.scss +++ b/app/assets/stylesheets/cypress/_alerts.scss @@ -1,3 +1,5 @@ +@use "bootstrap" as *; + @mixin alert-border($color, $bg) { $faded-background-color: rgba($bg, .2); border-left: 5px solid $color; diff --git a/app/assets/stylesheets/cypress/_analysis.scss b/app/assets/stylesheets/cypress/_analysis.scss index d9bf56bda..2bf29336b 100644 --- a/app/assets/stylesheets/cypress/_analysis.scss +++ b/app/assets/stylesheets/cypress/_analysis.scss @@ -1,3 +1,5 @@ +@use "bootstrap" as *; + .patient-analysis { border-collapse: collapse; width: 100%; diff --git a/app/assets/stylesheets/cypress/_buttons.scss b/app/assets/stylesheets/cypress/_buttons.scss index 3d1230482..78a65ba78 100644 --- a/app/assets/stylesheets/cypress/_buttons.scss +++ b/app/assets/stylesheets/cypress/_buttons.scss @@ -1,8 +1,11 @@ +@use "bootstrap" as *; +@use "sass:color"; + $background-color: rgba(#000, .00); @mixin darker-hover($border-color, $name) { - $darker-border-color: darken($border-color, 15%); - border-color: darken($border-color, 5%); + $darker-border-color: color.adjust($border-color, $lightness: -15%); + border-color: color.adjust($border-color, $lightness: -5%); // for the buttons with dark backgrounds, add a shadow to text @if $name != 'danger' { @@ -14,17 +17,25 @@ $background-color: rgba(#000, .00); &:hover, &:focus { + // apply button hover styles + color: $btn-color; + background-color: $darker-border-color; + border-color: $darker-border-color; + // create namespaced animation for the background-color @keyframes pulsate-#{$name} { 50% { background-color: $border-color; } } - color: $btn-color; - background-color: $darker-border-color; - border-color: $darker-border-color; } } -$btn-icon-outline: desaturate(lighten(saturate($primary, 80%), 20%), 40%); +$btn-icon-outline: color.adjust( + color.adjust( + color.adjust($primary, $saturation: 80%), + $lightness: 20% + ), + $saturation: -40% +); .btn { font-family: 'Ubuntu'; diff --git a/app/assets/stylesheets/cypress/_cards.scss b/app/assets/stylesheets/cypress/_cards.scss index 80047dcd6..337c9c791 100644 --- a/app/assets/stylesheets/cypress/_cards.scss +++ b/app/assets/stylesheets/cypress/_cards.scss @@ -1,3 +1,6 @@ +@use "bootstrap" as *; +@use "sass:color"; + .card-title { letter-spacing: .04em; } @@ -46,8 +49,8 @@ } @mixin darker-hover($border-color, $name) { - $darker-border-color: darken($border-color, 15%); - border-color: darken($border-color, 5%); + $darker-border-color: color.adjust($border-color, $lightness: -15%); + border-color: color.adjust($border-color, $lightness: -5%); // for the buttons with dark backgrounds, add a shadow to text @if $name != 'danger' { @@ -74,4 +77,3 @@ border-color: $card-inactive-border; } } - diff --git a/app/assets/stylesheets/cypress/_fonts.scss b/app/assets/stylesheets/cypress/_fonts.scss index ecc86501c..eb057494f 100644 --- a/app/assets/stylesheets/cypress/_fonts.scss +++ b/app/assets/stylesheets/cypress/_fonts.scss @@ -1,3 +1,5 @@ +@use "bootstrap" as *; + @font-face { font-family: 'Ubuntu'; font-display: fallback; diff --git a/app/assets/stylesheets/cypress/_forms.scss b/app/assets/stylesheets/cypress/_forms.scss index 4f5cf3782..f93899f4e 100644 --- a/app/assets/stylesheets/cypress/_forms.scss +++ b/app/assets/stylesheets/cypress/_forms.scss @@ -1,3 +1,5 @@ +@use "bootstrap" as *; + .form-group { .control-label .radio, .control-label .checkbox { @@ -15,6 +17,23 @@ } } +.form-check { + margin-bottom: 10px !important; +} + +.form-check .form-check-input { + border-color: #9d9d9d !important; +} + +.control-label { + margin-bottom: 6px !important; +} + +.form-check .form-check-label { + margin: 0px !important; + padding: 0px !important; +} + // need to overwrite .input-group-addon colors when buttons are involved @each $state in primary, success, danger, warning, info, default { .input-group-addon.btn-#{$state} { @@ -50,7 +69,8 @@ legend.control-label { } .ui-autocomplete { - @include box-shadow(0 1px 1px $dropdown-border-color); + // @include box-shadow(0 1px 1px $dropdown-border-color); + // box-shadow: 0 1px 1px $dropdown-border-color; .ui-menu-item { &.ui-state-focus { diff --git a/app/assets/stylesheets/cypress/_markup.scss b/app/assets/stylesheets/cypress/_markup.scss index 6b2372b05..74eab4a72 100644 --- a/app/assets/stylesheets/cypress/_markup.scss +++ b/app/assets/stylesheets/cypress/_markup.scss @@ -1,3 +1,5 @@ +@use "bootstrap" as *; + .cql-logic { .cql-statement-group { diff --git a/app/assets/stylesheets/cypress/_navbar.scss b/app/assets/stylesheets/cypress/_navbar.scss index 9b847467e..bb190a483 100644 --- a/app/assets/stylesheets/cypress/_navbar.scss +++ b/app/assets/stylesheets/cypress/_navbar.scss @@ -1,10 +1,13 @@ +@use "bootstrap" as *; + .navbar-toggle { color: $navbar-light-color; margin: 0; } .navbar { - @include box-shadow(0 1px 1px $dropdown-border-width); + // @include box-shadow(0 1px 1px $dropdown-border-width); + // box-shadow: 0 1px 1px $dropdown-border-width; margin-bottom: 1em; } @@ -63,7 +66,8 @@ } .breadcrumb > li { - @include box-shadow(0 1px 1px $dropdown-border-width); + // @include box-shadow(0 1px 1px $dropdown-border-width); + // box-shadow: 0 1px 1px $dropdown-border-width; display: table-cell; padding: 8px 10px; background-color: $primary; diff --git a/app/assets/stylesheets/cypress/_print_report.scss b/app/assets/stylesheets/cypress/_print_report.scss index b1c3fcec8..24503a7c3 100644 --- a/app/assets/stylesheets/cypress/_print_report.scss +++ b/app/assets/stylesheets/cypress/_print_report.scss @@ -1,3 +1,5 @@ +@use "bootstrap" as *; + .product-report { dl { background-color: $gray-200; diff --git a/app/assets/stylesheets/cypress/_products.scss b/app/assets/stylesheets/cypress/_products.scss index 06a37d6b3..02f5e8baa 100644 --- a/app/assets/stylesheets/cypress/_products.scss +++ b/app/assets/stylesheets/cypress/_products.scss @@ -1,3 +1,19 @@ +@use "bootstrap" as *; +@use "sass:color"; + +// Mixins +@mixin hidden-cell() { + // we want visually reduce the appearance, but it's ok to reveal to screen readers + color: $gray-600; + border: 0; +} + +@mixin hidden-header-cell() { + color: $gray-600; + border-bottom: 0; +} + + .inline-block { display: inline-block; } @@ -44,7 +60,7 @@ } .product-name { - background: darken($primary, 5%); + background: color.adjust($primary, $lightness: -5%); color: $white; font-size: 1.5em; font-weight: 500; diff --git a/app/assets/stylesheets/cypress/_record.scss b/app/assets/stylesheets/cypress/_record.scss index 4602da168..45450415d 100644 --- a/app/assets/stylesheets/cypress/_record.scss +++ b/app/assets/stylesheets/cypress/_record.scss @@ -1,6 +1,9 @@ +@use "bootstrap" as *; +@use "sass:color"; + $gray: #999; $white: #fff; -$table-row-odd-bg: lighten($primary, 50%); +$table-row-odd-bg: color.adjust($primary, $lightness: 50%); .description-heading { font-size: 1.25em; diff --git a/app/assets/stylesheets/cypress/_sessions.scss b/app/assets/stylesheets/cypress/_sessions.scss index cdd163de4..d73507792 100644 --- a/app/assets/stylesheets/cypress/_sessions.scss +++ b/app/assets/stylesheets/cypress/_sessions.scss @@ -1,3 +1,5 @@ +@use "bootstrap" as *; + .splash-panel { background: image-url('cypress_bg_cropped.png'); background-size: cover; diff --git a/app/assets/stylesheets/cypress/_tables.scss b/app/assets/stylesheets/cypress/_tables.scss index 645bcae09..2764461ca 100644 --- a/app/assets/stylesheets/cypress/_tables.scss +++ b/app/assets/stylesheets/cypress/_tables.scss @@ -1,3 +1,5 @@ +@use "bootstrap" as *; + .table { .abbreviated { max-width: 16em; diff --git a/app/assets/stylesheets/cypress/_tabs.scss b/app/assets/stylesheets/cypress/_tabs.scss index 48243a518..3d57d6bfa 100644 --- a/app/assets/stylesheets/cypress/_tabs.scss +++ b/app/assets/stylesheets/cypress/_tabs.scss @@ -1,3 +1,4 @@ +@use "bootstrap" as *; // overwrite the styles for jQuery-UI tabs with // reasonable styles for both vertical and horizontal tabs $tab-font-color: #212121; diff --git a/app/assets/stylesheets/cypress/_test_executions.scss b/app/assets/stylesheets/cypress/_test_executions.scss index b08b16206..10ef9ecdc 100644 --- a/app/assets/stylesheets/cypress/_test_executions.scss +++ b/app/assets/stylesheets/cypress/_test_executions.scss @@ -1,4 +1,5 @@ -@import './xml_view'; +@use 'variables' as *; +@use './xml_view' as *; .page-title { margin-bottom: 1em; @@ -48,7 +49,7 @@ } div:not(:first-child) { - border-left: 1px solid $gray; + border-left: 1px solid $gray-800; } .active-cert { diff --git a/app/assets/stylesheets/cypress/_text.scss b/app/assets/stylesheets/cypress/_text.scss index 43cfd10ee..e977371ae 100644 --- a/app/assets/stylesheets/cypress/_text.scss +++ b/app/assets/stylesheets/cypress/_text.scss @@ -1,3 +1,5 @@ +@use "bootstrap" as *; + a.label { color: $white; } diff --git a/app/assets/stylesheets/cypress/_toggle.scss b/app/assets/stylesheets/cypress/_toggle.scss index 32e3f0f0c..255ada995 100644 --- a/app/assets/stylesheets/cypress/_toggle.scss +++ b/app/assets/stylesheets/cypress/_toggle.scss @@ -1,8 +1,11 @@ +@use "sass:math"; +@use "bootstrap" as *; + $color-checkbox-success:#4cd964; $color-checkbox-default:#8E8E93; $transition: .3s cubic-bezier(.95, .05, .795, .035); $width: 4em; -$height: $width / 2; +$height: math.div($width, 2); $background-color: rgba(#000, .06); $after-background-color: #fff; $box-shadow: rgba(#000, .4); @@ -22,7 +25,7 @@ $box-shadow: rgba(#000, .4); &::after { transition: $transition; content: ''; - width: $width / 2; + width: math.div($width, 2); height: $height; display: block; background-color: $after-background-color; @@ -43,7 +46,7 @@ $box-shadow: rgba(#000, .4); background-color: $color-checkbox-success; &::after { - left: $width / 2; + left: math.div($width, 2); } } } diff --git a/app/assets/stylesheets/cypress/_valuesets.scss b/app/assets/stylesheets/cypress/_valuesets.scss index cd4ecf41a..e64f856b4 100644 --- a/app/assets/stylesheets/cypress/_valuesets.scss +++ b/app/assets/stylesheets/cypress/_valuesets.scss @@ -1,5 +1,4 @@ - - +@use "bootstrap" as *; .value-set-group { @extend .btn; diff --git a/app/assets/stylesheets/cypress/_vendor.scss b/app/assets/stylesheets/cypress/_vendor.scss index 429bcfb38..e600ed67e 100644 --- a/app/assets/stylesheets/cypress/_vendor.scss +++ b/app/assets/stylesheets/cypress/_vendor.scss @@ -1,25 +1,28 @@ +@use "bootstrap" as *; +@use "sass:color"; + .status-passing { color: $success-text-emphasis; background: $success-bg-subtle; - border: 1px solid darken($success-bg-subtle, 20%); + border: 1px solid color.adjust($success-bg-subtle, $lightness: -20%); } .status-failing { color: $danger-text-emphasis; background: $danger-bg-subtle; - border: 1px solid darken($danger-bg-subtle, 20%); + border: 1px solid color.adjust($danger-bg-subtle, $lightness: -20%); } .status-errored { color: $warning-text-emphasis; background: $warning-bg-subtle; - border: 1px solid darken($warning-bg-subtle, 20%); + border: 1px solid color.adjust($warning-bg-subtle, $lightness: -20%); } .status-not-started { color: $info-text-emphasis; background: $info-bg-subtle; - border: 1px solid darken($info-bg-subtle, 20%); + border: 1px solid color.adjust($info-bg-subtle, $lightness: -20%); } .scroll-link-wrapper { diff --git a/app/assets/stylesheets/cypress/_xml_view.scss b/app/assets/stylesheets/cypress/_xml_view.scss index f995e0031..bf130af7d 100644 --- a/app/assets/stylesheets/cypress/_xml_view.scss +++ b/app/assets/stylesheets/cypress/_xml_view.scss @@ -1,9 +1,11 @@ +@use "bootstrap" as *; +@use "sass:color"; -$xml-orange: lighten($warning, 10%) !default; -$xml-light-orange: lighten($xml-orange, 15%) !default; -$xml-dark-orange: darken($xml-orange, 10%) !default; -$xml-red: lighten($danger, 15%) !default; -$xml-light-red: lighten($xml-red, 15%) !default; +$xml-orange: color.adjust($warning, $lightness: 10%) !default; +$xml-light-orange: color.adjust($xml-orange, $lightness: 15%) !default; +$xml-dark-orange: color.adjust($xml-orange, $lightness: -10%) !default; +$xml-red: color.adjust($danger, $lightness: 15%) !default; +$xml-light-red: color.adjust($xml-red, $lightness: 15%) !default; $xml-green: $success !default; $xml-gray: $gray-500 !default; diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb index 4a74f83d1..f1c601359 100644 --- a/app/controllers/products_controller.rb +++ b/app/controllers/products_controller.rb @@ -36,6 +36,7 @@ def new def create @product = @vendor.products.new @product.update_with_tests(product_params) + @product.bundle_patients = true unless @product.cvuplus @product.save! flash_comment(@product.name, 'success', 'created') respond_with(@product) do |f| diff --git a/app/controllers/vendors_controller.rb b/app/controllers/vendors_controller.rb index 824dc723f..ae07e01a1 100644 --- a/app/controllers/vendors_controller.rb +++ b/app/controllers/vendors_controller.rb @@ -99,6 +99,7 @@ def update_preferences # save preferences to vendor preferred_code_systems @vendor.preferred_code_systems = JSON.parse(params['vendor_preferences']) @vendor.preferred_ccn = params['preferred_ccn'] unless params['preferred_ccn'] == '' + @vendor.preferred_tin = params['preferred_tin'] unless params['preferred_tin'] == '' @vendor.save redirect_to vendor_path(@vendor) end diff --git a/app/helpers/products_helper.rb b/app/helpers/products_helper.rb index 6f15c5470..68a6c6f52 100644 --- a/app/helpers/products_helper.rb +++ b/app/helpers/products_helper.rb @@ -118,9 +118,9 @@ def with_c3_task(task) case task when C1Task - return [task, task.product_test.tasks.c3_cat1_task] if task.product_test.c3_cat1_task? + return [task, task.product_test.tasks.c3_cat1_task].compact when C2Task - return [task, task.product_test.tasks.c3_cat3_task] if task.product_test.c3_cat3_task? + return [task, task.product_test.tasks.c3_cat3_task].compact end [task] end diff --git a/app/helpers/records_helper.rb b/app/helpers/records_helper.rb index 7cf46d538..00228af12 100644 --- a/app/helpers/records_helper.rb +++ b/app/helpers/records_helper.rb @@ -12,7 +12,7 @@ module RecordsHelper SUBFIELDS = %w[title scalar value unit units description period dispenseDate quantityDispensed time].freeze CV_POPULATION_KEYS = %w[IPP MSRPOPL MSRPOPLEX OBSERV].freeze PROPORTION_POPULATION_KEYS = %w[IPP DENOM NUMER NUMEX DENEX DENEXCEP].freeze - RATIO_POPULATION_KEYS = %w[IPP DENOM NUMER DENEX DENEXCEP OBSERV].freeze + RATIO_POPULATION_KEYS = %w[IPP DENOM DENEX NUMER NUMEX OBSERV].freeze def full_gender_name(gender) case gender diff --git a/app/models/c1_task.rb b/app/models/c1_task.rb index ad1bec1cd..338185cbd 100644 --- a/app/models/c1_task.rb +++ b/app/models/c1_task.rb @@ -12,6 +12,7 @@ class C1Task < Task def validators @validators = if product_test.c1_test [::Validators::CalculatingSmokingGunValidator.new(product_test.measures, product_test.patients, product_test.id), + ::Validators::TinValidator.new, ::Validators::QrdaCat1Validator.new(product_test.bundle, false, product_test.c3_test, true, product_test.measures)] else # A C1 task is created whenever C3 is selected. If C1 isn't also selected, this task doesn't perform any validations diff --git a/app/models/measure_test.rb b/app/models/measure_test.rb index b63243ddb..df553e26e 100644 --- a/app/models/measure_test.rb +++ b/app/models/measure_test.rb @@ -30,7 +30,8 @@ def generate_provider return unless provider.nil? self.provider = Provider.generate_provider(measure_type: measures.first.reporting_program_type, - preferred_ccn: product.vendor.preferred_ccn) + preferred_ccn: product.vendor.preferred_ccn, + preferred_tin: product.vendor.preferred_tin) end # passing only if both c1 and c3_cat1 tasks pass diff --git a/app/models/product_test.rb b/app/models/product_test.rb index 45c7de3e1..713560f90 100644 --- a/app/models/product_test.rb +++ b/app/models/product_test.rb @@ -423,13 +423,17 @@ def generate_random_seed self.rand_seed = Random.new_seed.to_s unless rand_seed end + # rubocop:disable Metrics/AbcSize + # rubocop:disable Metrics/CyclomaticComplexity # rubocop:disable Metrics/MethodLength + # rubocop:disable Metrics/PerceivedComplexity # Adds 0's for all missing populations (e.g., if DENEX is 0) or missing demographics (e.g., no Payer 349 in the DENEX) def expected_results_with_all_supplemental_codes # Since this is a CMS IG requirement, only do this for CVU+ or C3 tests return expected_results unless product.cvuplus? || product.c3_test? - required_codes = { 'PAYER' => %w[1 2 6 9 349], 'SEX' => %w[M 248153007 F 248152002], 'RACE' => %w[2106-3 2076-8 2054-5 2028-9 1002-5 2131-1], + gender_codes = bundle.randomization['genders']&.map(&:code) + required_codes = { 'PAYER' => %w[1 2 6 9 349], 'SEX' => gender_codes, 'RACE' => %w[2106-3 2076-8 2054-5 2028-9 1002-5 2131-1], 'ETHNICITY' => %w[2135-2 2186-5] }.freeze equivalent_codes = { '9' => '349', '349' => '9', 'M' => '248153007', '248153007' => 'M', 'F' => '248152002', '248152002' => 'F' } new_hash = expected_results @@ -452,6 +456,9 @@ def expected_results_with_all_supplemental_codes end new_hash end + # rubocop:enable Metrics/AbcSize + # rubocop:enable Metrics/CyclomaticComplexity # rubocop:enable Metrics/MethodLength + # rubocop:enable Metrics/PerceivedComplexity end # rubocop:enable Metrics/ClassLength diff --git a/app/models/vendor.rb b/app/models/vendor.rb index 259ab7b95..75a1e05ca 100644 --- a/app/models/vendor.rb +++ b/app/models/vendor.rb @@ -11,7 +11,6 @@ class Vendor has_many :products, dependent: :destroy has_many :patients, dependent: :destroy, foreign_key: 'correlation_id', class_name: 'CQM::VendorPatient' embeds_many :points_of_contact, class_name: 'PointOfContact', cascade_callbacks: true - accepts_nested_attributes_for :points_of_contact, allow_destroy: true, reject_if: ->(poc) { poc[:name].blank? } field :name, type: String @@ -22,6 +21,7 @@ class Vendor field :zip, type: String field :preferred_code_systems, type: Hash, default: {} field :preferred_ccn, type: String + field :preferred_tin, type: String field :favorite_user_ids, type: Array, default: [] field :vendor_patient_analysis, type: Hash, default: {} diff --git a/app/views/admin/settings/edit.html.erb b/app/views/admin/settings/edit.html.erb index 7014252ed..0b07bc435 100644 --- a/app/views/admin/settings/edit.html.erb +++ b/app/views/admin/settings/edit.html.erb @@ -45,19 +45,22 @@
Custom Mode Options - <%= f.fields_for :custom_options do |custom_form| %> + <%= fields_for :custom_options, {}, builder: BootstrapForm::FormBuilder do |custom_form| %> <%= custom_form.form_group :auto_approve, label: { text: "Auto Approve", id: "auto-approve" } do %> - <%= custom_form.radio_button :auto_approve, "enable", label: "Enable", inline: true, checked: mode_settings.auto_approve, 'aria-labelledby' => "auto-approve" %> - <%= custom_form.radio_button :auto_approve, "disable", label: "Disable", inline: true, checked: !mode_settings.auto_approve, 'aria-labelledby' => "auto-approve" %> + <%= custom_form.radio_button :auto_approve, "enable", label: "Enable", inline: true, checked: mode_settings.auto_approve %> + <%= custom_form.radio_button :auto_approve, "disable", label: "Disable", inline: true, checked: !mode_settings.auto_approve %> <% end %> + <%= custom_form.form_group :ignore_roles, label: { text: "Ignore Roles", id: "ignore-roles" } do %> - <%= custom_form.radio_button :ignore_roles, "enable", label: "Enable", inline: true, checked: mode_settings.ignore_roles, 'aria-labelledby' => "ignore-roles" %> - <%= custom_form.radio_button :ignore_roles, "disable", label: "Disable", inline: true, checked: !mode_settings.ignore_roles, 'aria-labelledby' => "ignore-roles" %> + <%= custom_form.radio_button :ignore_roles, "enable", label: "Enable", inline: true, checked: mode_settings.ignore_roles %> + <%= custom_form.radio_button :ignore_roles, "disable", label: "Disable", inline: true, checked: !mode_settings.ignore_roles %> <% end %> + <%= custom_form.form_group :debug_features, label: { text: "Debug Features", id: "debug-features" } do %> - <%= custom_form.radio_button :debug_features, "enable", label: "Enable", inline: true, checked: mode_settings.debug_features, 'aria-labelledby' => "debug-features" %> - <%= custom_form.radio_button :debug_features, "disable", label: "Disable", inline: true, checked: !mode_settings.debug_features, 'aria-labelledby' => "debug-features" %> + <%= custom_form.radio_button :debug_features, "enable", label: "Enable", inline: true, checked: mode_settings.debug_features %> + <%= custom_form.radio_button :debug_features, "disable", label: "Disable", inline: true, checked: !mode_settings.debug_features %> <% end %> + <%= custom_form.select :default_role, roles, selected: mode_settings.default_role %> <% end %>
diff --git a/app/views/application/_certification_status_table.html.erb b/app/views/application/_certification_status_table.html.erb index 521e8f231..56fb5bd8c 100644 --- a/app/views/application/_certification_status_table.html.erb +++ b/app/views/application/_certification_status_table.html.erb @@ -12,7 +12,7 @@ <% if show_product_link %> - <%= button_to vendor_product_favorite_path(product.vendor_id, product), remote: true, :class => "btn btn-link btn-pop" do %> + <%= button_to favorite_vendor_product_path(product.vendor_id, product), remote: true, :class => "btn btn-link btn-pop" do %> <% if (product.favorite_user_ids.include? current_user.id) %> <%= icon('fas fa-fw', 'star', :"aria-hidden" => true) %> product favorited diff --git a/app/views/application/_cvu_plus_status_table.html.erb b/app/views/application/_cvu_plus_status_table.html.erb index 112608cee..42987bd6f 100644 --- a/app/views/application/_cvu_plus_status_table.html.erb +++ b/app/views/application/_cvu_plus_status_table.html.erb @@ -6,7 +6,7 @@ <% if show_product_link %> - <%= button_to vendor_product_favorite_path(product.vendor_id, product), remote: true, :class => "btn btn-link btn-pop" do %> + <%= button_to favorite_vendor_product_path(product.vendor_id, product), remote: true, :class => "btn btn-link btn-pop" do %> <% if (product.favorite_user_ids.include? current_user.id) %> <%= icon('fas fa-fw', 'star', :"aria-hidden" => true) %> product favorited diff --git a/app/views/application/_navbar.html.erb b/app/views/application/_navbar.html.erb index 78d305228..a9b0adca3 100644 --- a/app/views/application/_navbar.html.erb +++ b/app/views/application/_navbar.html.erb @@ -12,7 +12,7 @@ elsif (controller.controller_name == 'records' && params[:task_id].nil? && params[:vendor_id].nil?) || (current_page?(:records) && params[:task_id].nil? && params[:vendor_id].nil?) :master_patient_list - elsif current_page?(admin_path) || current_page?(new_admin_bundle_path) + elsif current_page?(admin_path) || current_page?(new_admin_bundle_path) || current_page?(edit_admin_settings_path) || (!params[:id].nil? && current_page?(edit_admin_user_path)) :admin elsif current_page?(bundle_downloads_path) :bundle_download diff --git a/app/views/bundle_downloads/index.html.erb b/app/views/bundle_downloads/index.html.erb index 6c2e2005e..5f79763fc 100644 --- a/app/views/bundle_downloads/index.html.erb +++ b/app/views/bundle_downloads/index.html.erb @@ -4,7 +4,7 @@ <%= f.form_group :bundle_year, help: "Select the bundle you would like to download." do %> <% @bundle_years.each do |bundle_year| %> - <%= f.radio_button :bundle_year, bundle_year, label: "bundle-#{bundle_year}.zip", label_class: "btn btn-checkbox", required: true %> + <%= f.radio_button :bundle_year, bundle_year, label: "bundle-#{bundle_year}.zip", label_class: "btn btn-checkbox text-start", required: true %> <% end # bundle loop %> <% end # form_group %> diff --git a/app/views/checklist_tests/_checklist_measure.html.erb b/app/views/checklist_tests/_checklist_measure.html.erb index fd25482ec..18ea352a6 100644 --- a/app/views/checklist_tests/_checklist_measure.html.erb +++ b/app/views/checklist_tests/_checklist_measure.html.erb @@ -7,7 +7,7 @@ # measure (Measure) should be a measure that belongs to the checklist test %> -<%= bootstrap_nested_form_for([measures, product, product_test], :url => { :controller => 'checklist_tests', :action => 'update' }) do |f| %> +<%= bootstrap_form_for([measures, product, product_test], :url => { :controller => 'checklist_tests', :action => 'update' }) do |f| %> <% if !hide_patient_calculation? %>
<% end %> diff --git a/app/views/checklist_tests/print_criteria.html.erb b/app/views/checklist_tests/print_criteria.html.erb index 3d7a44c59..fa03fb980 100644 --- a/app/views/checklist_tests/print_criteria.html.erb +++ b/app/views/checklist_tests/print_criteria.html.erb @@ -5,7 +5,7 @@

Criteria List for C1 Record Sample

<% if checklist_test.measures %> - <%= bootstrap_nested_form_for([@product, checklist_test], :url => { :controller => 'checklist_tests', :action => 'update' }) do |f| %> + <%= bootstrap_form_for([@product, checklist_test], :url => { :controller => 'checklist_tests', :action => 'update' }) do |f| %> <% checklist_test.measures.each do |measure| %>
diff --git a/app/views/products/_product_form.html.erb b/app/views/products/_product_form.html.erb index 8c64b6b4a..ccea52354 100644 --- a/app/views/products/_product_form.html.erb +++ b/app/views/products/_product_form.html.erb @@ -1,7 +1,7 @@

<%= submit_text %><%= product.name ? ": "+ product.name : "" %>

- <%= bootstrap_nested_form_for [product.vendor, product], html: { "data-parsley-validate": '','data-parsley-excluded': "input.disabled" } do |f| %> + <%= bootstrap_form_for [product.vendor, product], html: { "data-parsley-validate": '','data-parsley-excluded': "input.disabled" } do |f| %>
@@ -12,8 +12,8 @@
Product Types <%= f.form_group do %> - <%= f.radio_button :cvuplus, "false", label: 'Certification Product', label_class: "btn btn-checkbox", checked: !product.cvuplus, disabled: !product.new_record? %> - <%= f.radio_button :cvuplus, "true", label: 'CVU+ Product', label_class: "btn btn-checkbox", checked: product.cvuplus, disabled: !product.new_record? %> + <%= f.radio_button :cvuplus, "false", label: 'Certification Product', label_class: "btn btn-checkbox text-start", checked: !product.cvuplus, disabled: !product.new_record? %> + <%= f.radio_button :cvuplus, "true", label: 'CVU+ Product', label_class: "btn btn-checkbox text-start", checked: product.cvuplus, disabled: !product.new_record? %> <% end %>
@@ -25,7 +25,7 @@ <%= f.form_group help: "Select the certification type Cypress should use to certify this product" do %> <% APP_CONSTANTS['certifications'].each do |c, certification| %> <% if c == 'C1' || c == 'C2' || c == 'C3' || c == 'C4'%> - <%= f.check_box c.downcase + '_test', label: certification["title"], label_class: "btn btn-checkbox", disabled: !product.new_record?, data: { + <%= f.check_box c.downcase + '_test', label: certification["title"], label_class: "btn btn-checkbox text-start", disabled: !product.new_record?, data: { 'parsley-required': 'true', 'parsley-trigger': 'change', 'parsley-class-handler': "#certification_options", @@ -34,7 +34,7 @@ 'parsley-multiple': 'mandatory_certifications', 'parsley-errors-container': "#certifications_errors_container" } %> <% else %> - <%= f.check_box c.downcase + '_test', label: certification["title"], label_class: "btn btn-checkbox", disabled: !product.new_record? %> + <%= f.check_box c.downcase + '_test', label: certification["title"], label_class: "btn btn-checkbox text-start", disabled: !product.new_record? %> <% end %> <% end %> <% end %> @@ -82,7 +82,7 @@
Records Options <%= f.form_group help: "Recommended for most robust testing." do %> - <%= f.check_box :randomize_patients, label: 'Randomize Records', label_class: "btn btn-checkbox", checked: product.new_record? ? true : product.randomize_patients, disabled: !product.new_record? %> + <%= f.check_box :randomize_patients, label: 'Randomize Records', label_class: "btn btn-checkbox text-start", checked: product.new_record? ? true : product.randomize_patients, disabled: !product.new_record? %> <%= f.check_box :duplicate_patients, label: 'Duplicate Records', label_class: "btn btn-checkbox btn-light", checked: product.duplicate_patients, disabled: true %> <% end %>
@@ -94,7 +94,7 @@ <%= f.form_group :bundle_id, help: "Select the measure versions Cypress should use to certify this product." do %> <% Bundle.available.all.each do |bundle_current| %> - <%= f.radio_button :bundle_id, bundle_current.id, label: "#{bundle_current.title} #{bundle_current.version}", label_class: "btn btn-checkbox", + <%= f.radio_button :bundle_id, bundle_current.id, label: "#{bundle_current.title} #{bundle_current.version}", label_class: "btn btn-checkbox text-start", checked: bundle_current == bundle, disabled: !product.new_record? %> <% end # bundle loop %> @@ -104,7 +104,7 @@
<%= f.form_group help: "Selecting Shift Records will move patient data forward into the appropriate reporting period. Otherwise patient data will remain in a previously completed calendar year." do %> - <%= f.check_box :shift_patients, label: 'Shift Records', label_class: "btn btn-checkbox", checked: product.new_record? ? false : product.shift_patients, disabled: !product.new_record? %> + <%= f.check_box :shift_patients, label: 'Shift Records', label_class: "btn btn-checkbox text-start", checked: product.new_record? ? false : product.shift_patients, disabled: !product.new_record? %> <% end %>
<% unless bundle&.deprecated %> @@ -136,15 +136,15 @@ <% end %>
<%= f.form_group :measure_selection, help: "Indicate the clinical quality measures Cypress should use to certify this product. Testing will be performed on a measure-by-measure basis. Click 'Custom' to specify individual measures." do %> - <%= f.radio_button :measure_selection, "eh", label: "Eligible Hospital eCQMs (Including Program Candidate/Pre-Rulemaking)", label_class: "btn btn-checkbox", disabled: !product.new_record?, data: { + <%= f.radio_button :measure_selection, "eh", label: "Eligible Hospital eCQMs (Including Program Candidate/Pre-Rulemaking)", label_class: "btn btn-checkbox text-start", disabled: !product.new_record?, data: { 'parsley-required': '', 'parsley-trigger': 'blur change focusout', 'parsley-class-handler': "#measures_options", 'parsley-error-message': 'Must select measures.', 'parsley-errors-container': "#simple_measures_errors_container" } %> - <%= f.radio_button :measure_selection, "ep", label: "Eligible Clinician eCQMs (Including Program Candidate/Pre-Rulemaking)", label_class: "btn btn-checkbox", disabled: !product.new_record? %> - <%= f.radio_button :measure_selection, "all", label: "All eCQMs (Excluding Retired)", label_class: "btn btn-checkbox", disabled: !product.new_record? %> - <%= f.radio_button :measure_selection, "custom", label: "Custom...", label_class: "btn btn-checkbox", disabled: !product.new_record? %> + <%= f.radio_button :measure_selection, "ep", label: "Eligible Clinician eCQMs (Including Program Candidate/Pre-Rulemaking)", label_class: "btn btn-checkbox text-start", disabled: !product.new_record? %> + <%= f.radio_button :measure_selection, "all", label: "All eCQMs (Excluding Retired)", label_class: "btn btn-checkbox text-start", disabled: !product.new_record? %> + <%= f.radio_button :measure_selection, "custom", label: "Custom...", label_class: "btn btn-checkbox text-start", disabled: !product.new_record? %> <% end %> <% end %> diff --git a/app/views/program_tests/_program_fields.html.erb b/app/views/program_tests/_program_fields.html.erb index 96cf35286..3a931a115 100644 --- a/app/views/program_tests/_program_fields.html.erb +++ b/app/views/program_tests/_program_fields.html.erb @@ -5,7 +5,7 @@ <% end %> -<%= bootstrap_nested_form_for([@product, @product_test], :url => { :controller => 'program_tests', :action => 'update' }) do |f| %> +<%= bootstrap_form_for([@product, @product_test], :url => { :controller => 'program_tests', :action => 'update' }) do |f| %>
diff --git a/app/views/records/_calculation_results.html.erb b/app/views/records/_calculation_results.html.erb index 670b3e971..449c9cc93 100644 --- a/app/views/records/_calculation_results.html.erb +++ b/app/views/records/_calculation_results.html.erb @@ -5,7 +5,7 @@ <% elsif @vendor %> <%= bootstrap_form_tag url: vendor_records_path(@vendor), html: {class: "delete_vendor_patients_form"} do |f| %> - <%= f.check_box r.id, label: "", title: "delete_patient", label_class: "btn btn-checkbox"%> + <%= f.check_box r.id, hide_label: true, label: "", title: "delete_patient", label_class: "btn btn-checkbox text-start"%> <% end %> <%= link_to full_name(r), vendor_record_path(:vendor_id => @vendor.id, :id => r.id, :bundle_id => @bundle.id) %> diff --git a/app/views/records/by_filter_task.html.erb b/app/views/records/by_filter_task.html.erb index 42d616f6c..a2aba7a2e 100644 --- a/app/views/records/by_filter_task.html.erb +++ b/app/views/records/by_filter_task.html.erb @@ -6,12 +6,12 @@
<% end %> - <%= button_to product_test_task_html_filter_patients_path(@task.product_test, @task, hqmf_id: @measure.hqmf_id), method: :get, :class => "btn btn-default" do %> + <%= button_to html_filter_patients_product_test_task_path(@task.product_test, @task, hqmf_id: @measure.hqmf_id), method: :get, :class => "btn btn-default" do %> <%= icon('fas fa-fw', 'download', :"aria-hidden" => true) %> Download HTML Patients <% end %>
diff --git a/app/views/records/index.html.erb b/app/views/records/index.html.erb index e702e23e1..a56c0b111 100644 --- a/app/views/records/index.html.erb +++ b/app/views/records/index.html.erb @@ -50,13 +50,13 @@ <% if @vendor %>
- <%= f.radio_button :bundle_id, bundle.id, label: bundle.title, label_class: "btn btn-checkbox vendor-checkbox", + <%= f.radio_button :bundle_id, bundle.id, label: bundle.title, label_class: "btn btn-checkbox vendor-checkbox text-start", checked: bundle == @bundle %>
<%# create qrda download package of vendor patients #%> <% else %>
- <%= f.radio_button :bundle_id, bundle.id, label: bundle.title, label_class: "btn btn-checkbox bundle-checkbox", + <%= f.radio_button :bundle_id, bundle.id, label: bundle.title, label_class: "btn btn-checkbox bundle-checkbox text-start", checked: bundle == @bundle %>
diff --git a/app/views/records/new.html.erb b/app/views/records/new.html.erb index c5758ce38..fd68b389f 100644 --- a/app/views/records/new.html.erb +++ b/app/views/records/new.html.erb @@ -10,13 +10,13 @@ <% Bundle.available.each do |bundle| %>
- <%= f.radio_button :bundle_id, bundle.id, label: bundle.title, label_class: "btn btn-checkbox", + <%= f.radio_button :bundle_id, bundle.id, label: bundle.title, label_class: "btn btn-checkbox text-start", checked: bundle == default_selection %>
<% end %> <% end %> <%= f.form_group help: "Including logic highlighting provides a detailed view of measure calculation but impacts the calculation speed" do %> - <%= f.check_box :include_highlighting, label: 'Include Highlighting?', label_class: "btn btn-checkbox", checked: false %> + <%= f.check_box :include_highlighting, label: 'Include Highlighting?', label_class: "btn btn-checkbox text-start", checked: false %> <% end %> <%= f.file_field :file, label: 'Add Patients', accept: 'application/zip', label_class: "form-label" %> diff --git a/app/views/test_executions/_test_info.html.erb b/app/views/test_executions/_test_info.html.erb index 1c96d270c..533fa0118 100644 --- a/app/views/test_executions/_test_info.html.erb +++ b/app/views/test_executions/_test_info.html.erb @@ -36,7 +36,7 @@ <%= link_to 'View Patients', { controller: 'records', hqmf_id: task.product_test.measure_ids.first, task_id: task.id}, method: :get %> <% if (task.is_a?(Cat1FilterTask) || task.is_a?(Cat3FilterTask)) && should_display_expected_results(task) %>
- <%= link_to 'View Expected Result', product_test_task_by_filter_task_path(task.product_test, task, hqmf_id: task.product_test.measure_ids.first), method: :get %> + <%= link_to 'View Expected Result', by_filter_task_product_test_task_path(task.product_test, task, hqmf_id: task.product_test.measure_ids.first), method: :get %> <% end %> <% if Settings.current.enable_debug_features %>
diff --git a/app/views/vendors/_poc_fields.html.erb b/app/views/vendors/_poc_fields.html.erb new file mode 100644 index 000000000..c19db3fd3 --- /dev/null +++ b/app/views/vendors/_poc_fields.html.erb @@ -0,0 +1,10 @@ +
+ <%= poc_field.text_field :name, wrapper: { class: 'col-sm-3'}, label_class: 'label-block', label: 'POC Name', 'data-parsley-required': '' %> + <%= poc_field.email_field :email, autocorrect: 'off', autocapitalize: 'off', wrapper: { class: 'col-sm-3'}, label_class: 'label-block', label: 'Email'%> + <%= poc_field.phone_field :phone, wrapper: { class: 'col-sm-3' }, label_class: 'label-block', label: 'Telephone', 'data-parsley-phonenumber': '' %> + <%= poc_field.text_field :contact_type, wrapper: { class: 'col-sm-2' }, label_class: 'label-block', label: 'Type of Contact' %> + <%= poc_field.hidden_field :_destroy %> +
+ +
+
\ No newline at end of file diff --git a/app/views/vendors/_vendor.html.erb b/app/views/vendors/_vendor.html.erb index ae0384c6a..977600ac3 100644 --- a/app/views/vendors/_vendor.html.erb +++ b/app/views/vendors/_vendor.html.erb @@ -1,7 +1,7 @@ <% vendor_statuses = vendor_statuses(vendor) %> - <%= button_to vendor_favorite_path(vendor), remote: true, :class => "btn btn-link" do %> + <%= button_to favorite_vendor_path(vendor), remote: true, :class => "btn btn-link" do %> <% if (vendor.favorite_user_ids.include? current_user.id) %> <%= icon('fas fa-fw', 'star', :"aria-hidden" => true) %> vendor favorited diff --git a/app/views/vendors/_vendor_form.html.erb b/app/views/vendors/_vendor_form.html.erb index 1ade0c5d4..b9dfdce97 100644 --- a/app/views/vendors/_vendor_form.html.erb +++ b/app/views/vendors/_vendor_form.html.erb @@ -1,7 +1,7 @@

<%= submit_text %><%= vendor.name ? ": "+ vendor.name : "" %>

-<%= bootstrap_nested_form_for vendor, html: {id: "add_vendor_form", "data-parsley-validate": ''} do |f| %> +<%= bootstrap_form_for vendor, html: {id: "add_vendor_form", "data-parsley-validate": ''} do |f| %>
<%= f.text_field :name, label: 'Vendor Name', autocomplete: 'off', required: '', 'data-parsley-required': '', 'data-parsley-trigger': 'change'%> <%= f.text_field :vendor_id, label: 'Vendor ID' %> @@ -10,19 +10,13 @@ <%= f.text_field :state %> <%= f.text_field :zip, 'data-parsley-type': "digits", 'data-parsley-length': "[5, 5]", 'data-parsley-length-message': "This value should be a 5 digit US zip code.", 'data-parsley-trigger': 'blur' %> - <%= f.fields_for :points_of_contact do |poc_field| %> -
- <%= poc_field.text_field :name, wrapper: { class: 'col-sm-3'}, label_class: 'label-block', label: 'POC Name', 'data-parsley-required': '' %> - <%= poc_field.email_field :email, autocorrect: 'off', autocapitalize: 'off', wrapper: { class: 'col-sm-3'}, label_class: 'label-block', label: 'Email'%> - <%= poc_field.phone_field :phone, wrapper: { class: 'col-sm-3' }, label_class: 'label-block', label: 'Telephone', 'data-parsley-phonenumber': '' %> - <%= poc_field.text_field :contact_type, wrapper: { class: 'col-sm-2' }, label_class: 'label-block', label: 'Type of Contact' %> -
- <%= poc_field.link_to_remove "Remove", :class => "btn btn-danger", :type => "button" %> -
-
- <% end %> +
+ <%= f.fields_for :points_of_contact do |poc_field| %> + <%= render 'poc_fields', poc_field: poc_field %> + <% end %> +
- <%= f.link_to_add "Add Point of Contact", :points_of_contact, :class => "btn btn-default", :type => "button" %>

+
+ \ No newline at end of file diff --git a/app/views/vendors/preferences.html.erb b/app/views/vendors/preferences.html.erb index 9a5dd055f..e6639a0e2 100644 --- a/app/views/vendors/preferences.html.erb +++ b/app/views/vendors/preferences.html.erb @@ -27,6 +27,7 @@
<%= f.text_field :preferred_ccn, help: 'Health IT may be tailored for certain facility types (e.g., Critical Access Hospitals ). In these scenarios it is appropriate to use a preferred CMS Certification Number appropriate for the facility.', label: 'Preferred CMS Certification Number', autocomplete: 'off', value: @vendor.preferred_ccn %> + <%= f.text_field :preferred_tin, help: 'Health IT may be tailored for certain provider. It is appropriate to use a preferred TIN for the provider.', label: 'Preferred TIN', autocomplete: 'off', value: @vendor.preferred_tin %>