diff --git a/Dockerfile b/Dockerfile index 8783df2..8cc38d4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,7 @@ # The base stage scaffolds elements which are common to building and running # the application, such as installing ca-certificates, creating the app user, # and installing runtime system dependencies. -FROM ruby:3.3-slim AS base +FROM ruby:3.4-slim AS base # ------------------------------------------------------------ # Declarative metadata diff --git a/Gemfile b/Gemfile index 4c3dcf5..04b7026 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,7 @@ source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } -ruby '~> 3.0' +ruby '~> 3.4' gem 'amazing_print', '~> 1.1' gem 'berkeley_library-docker' @@ -19,7 +19,7 @@ gem 'okcomputer', '~> 1.19' gem 'ougai', '~> 1.8' gem 'puma', '~> 7.2.1' gem 'puma-plugin-delayed_stop', '~> 0.1.2' -gem 'rails', '~> 8.0.0' +gem 'rails', '~> 8.1.3' gem 'rake' gem 'sass-rails', '>= 6' gem 'turbolinks' @@ -28,7 +28,7 @@ gem 'will_paginate' group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console - gem 'byebug', platforms: %i[mri mingw x64_mingw] + gem 'byebug', platforms: %i[mri windows] gem 'rspec-rails', '~> 8.0' gem 'simplecov', require: false gem 'simplecov-rcov', require: false diff --git a/Gemfile.lock b/Gemfile.lock index d098439..1bffe5d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,29 +1,31 @@ GEM remote: https://rubygems.org/ specs: - actioncable (8.0.5) - actionpack (= 8.0.5) - activesupport (= 8.0.5) + action_text-trix (2.1.19) + railties + actioncable (8.1.3) + actionpack (= 8.1.3) + activesupport (= 8.1.3) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (8.0.5) - actionpack (= 8.0.5) - activejob (= 8.0.5) - activerecord (= 8.0.5) - activestorage (= 8.0.5) - activesupport (= 8.0.5) + actionmailbox (8.1.3) + actionpack (= 8.1.3) + activejob (= 8.1.3) + activerecord (= 8.1.3) + activestorage (= 8.1.3) + activesupport (= 8.1.3) mail (>= 2.8.0) - actionmailer (8.0.5) - actionpack (= 8.0.5) - actionview (= 8.0.5) - activejob (= 8.0.5) - activesupport (= 8.0.5) + actionmailer (8.1.3) + actionpack (= 8.1.3) + actionview (= 8.1.3) + activejob (= 8.1.3) + activesupport (= 8.1.3) mail (>= 2.8.0) rails-dom-testing (~> 2.2) - actionpack (8.0.5) - actionview (= 8.0.5) - activesupport (= 8.0.5) + actionpack (8.1.3) + actionview (= 8.1.3) + activesupport (= 8.1.3) nokogiri (>= 1.8.5) rack (>= 2.2.4) rack-session (>= 1.0.1) @@ -31,42 +33,43 @@ GEM rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) useragent (~> 0.16) - actiontext (8.0.5) - actionpack (= 8.0.5) - activerecord (= 8.0.5) - activestorage (= 8.0.5) - activesupport (= 8.0.5) + actiontext (8.1.3) + action_text-trix (~> 2.1.15) + actionpack (= 8.1.3) + activerecord (= 8.1.3) + activestorage (= 8.1.3) + activesupport (= 8.1.3) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (8.0.5) - activesupport (= 8.0.5) + actionview (8.1.3) + activesupport (= 8.1.3) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (8.0.5) - activesupport (= 8.0.5) + activejob (8.1.3) + activesupport (= 8.1.3) globalid (>= 0.3.6) - activemodel (8.0.5) - activesupport (= 8.0.5) - activerecord (8.0.5) - activemodel (= 8.0.5) - activesupport (= 8.0.5) + activemodel (8.1.3) + activesupport (= 8.1.3) + activerecord (8.1.3) + activemodel (= 8.1.3) + activesupport (= 8.1.3) timeout (>= 0.4.0) - activestorage (8.0.5) - actionpack (= 8.0.5) - activejob (= 8.0.5) - activerecord (= 8.0.5) - activesupport (= 8.0.5) + activestorage (8.1.3) + actionpack (= 8.1.3) + activejob (= 8.1.3) + activerecord (= 8.1.3) + activesupport (= 8.1.3) marcel (~> 1.0) - activesupport (8.0.5) + activesupport (8.1.3) base64 - benchmark (>= 0.3) bigdecimal concurrent-ruby (~> 1.0, >= 1.3.1) connection_pool (>= 2.2.5) drb i18n (>= 1.6, < 2) + json logger (>= 1.4.2) minitest (>= 5.1) securerandom (>= 0.3) @@ -95,8 +98,8 @@ GEM brakeman (8.0.5) racc builder (3.3.0) - bundler-audit (0.9.2) - bundler (>= 1.2.0, < 3) + bundler-audit (0.9.3) + bundler (>= 1.2.0) thor (~> 1.0) byebug (12.0.0) capybara (3.40.0) @@ -118,7 +121,7 @@ GEM colorize (0.8.1) concurrent-ruby (1.3.7) connection_pool (3.0.2) - crass (1.0.6) + crass (1.0.7) date (3.5.1) diff-lcs (1.6.2) docile (1.4.1) @@ -131,12 +134,12 @@ GEM ffi (1.17.2-x86_64-linux-gnu) font-awesome-rails (4.7.0.9) railties (>= 3.2, < 9.0) - globalid (1.3.0) + globalid (1.4.0) activesupport (>= 6.1) - i18n (1.14.8) + i18n (1.15.2) concurrent-ruby (~> 1.0) io-console (0.8.2) - irb (1.17.0) + irb (1.18.0) pp (>= 0.6.0) prism (>= 1.3.0) rdoc (>= 4.0.0) @@ -148,7 +151,7 @@ GEM rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) - json (2.19.3) + json (2.20.0) language_server-protocol (3.17.0.5) lint_roller (1.1.0) listen (3.9.0) @@ -169,10 +172,10 @@ GEM net-imap net-pop net-smtp - marcel (1.1.0) + marcel (1.2.1) matrix (0.4.3) mini_mime (1.1.5) - minitest (6.0.2) + minitest (6.0.6) drb (~> 2.0) prism (~> 1.5) mysql2 (0.5.7) @@ -205,13 +208,10 @@ GEM parser (3.3.10.0) ast (~> 2.4.1) racc - pp (0.6.3) + pp (0.6.4) prettyprint prettyprint (0.2.0) - prism (1.6.0) - psych (5.3.1) - date - stringio + prism (1.9.0) public_suffix (7.0.5) puma (7.2.1) nio4r (~> 2.0) @@ -228,20 +228,20 @@ GEM rack (>= 1.3) rackup (2.3.1) rack (>= 3) - rails (8.0.5) - actioncable (= 8.0.5) - actionmailbox (= 8.0.5) - actionmailer (= 8.0.5) - actionpack (= 8.0.5) - actiontext (= 8.0.5) - actionview (= 8.0.5) - activejob (= 8.0.5) - activemodel (= 8.0.5) - activerecord (= 8.0.5) - activestorage (= 8.0.5) - activesupport (= 8.0.5) + rails (8.1.3) + actioncable (= 8.1.3) + actionmailbox (= 8.1.3) + actionmailer (= 8.1.3) + actionpack (= 8.1.3) + actiontext (= 8.1.3) + actionview (= 8.1.3) + activejob (= 8.1.3) + activemodel (= 8.1.3) + activerecord (= 8.1.3) + activestorage (= 8.1.3) + activesupport (= 8.1.3) bundler (>= 1.15.0) - railties (= 8.0.5) + railties (= 8.1.3) rails-dom-testing (2.3.0) activesupport (>= 5.0.0) minitest @@ -249,9 +249,9 @@ GEM rails-html-sanitizer (1.7.0) loofah (~> 2.25) nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0) - railties (8.0.5) - actionpack (= 8.0.5) - activesupport (= 8.0.5) + railties (8.1.3) + actionpack (= 8.1.3) + activesupport (= 8.1.3) irb (~> 1.13) rackup (>= 1.0.0) rake (>= 12.2) @@ -259,13 +259,18 @@ GEM tsort (>= 0.2) zeitwerk (~> 2.6) rainbow (3.1.1) - rake (13.3.1) + rake (13.4.2) rb-fsevent (0.11.2) rb-inotify (0.11.1) ffi (~> 1.0) - rdoc (7.2.0) + rbs (4.0.3) + logger + prism (>= 1.6.0) + tsort + rdoc (8.0.0) erb - psych (>= 4.0.0) + prism (>= 1.6.0) + rbs (>= 4.0.0) tsort regexp_parser (2.11.3) reline (0.6.3) @@ -358,7 +363,6 @@ GEM actionpack (>= 6.1) activesupport (>= 6.1) sprockets (>= 3.0.0) - stringio (3.2.0) thor (1.5.0) tilt (2.6.1) timeout (0.6.1) @@ -384,14 +388,14 @@ GEM railties (>= 5.2) semantic_range (>= 2.3.0) websocket (1.2.11) - websocket-driver (0.8.0) + websocket-driver (0.8.2) base64 websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) will_paginate (4.0.1) xpath (3.2.0) nokogiri (~> 1.8) - zeitwerk (2.7.5) + zeitwerk (2.8.2) PLATFORMS aarch64-linux-gnu @@ -420,7 +424,7 @@ DEPENDENCIES ougai (~> 1.8) puma (~> 7.2.1) puma-plugin-delayed_stop (~> 0.1.2) - rails (~> 8.0.0) + rails (~> 8.1.3) rake rspec-rails (~> 8.0) rspec_junit_formatter (~> 0.4.1) @@ -439,7 +443,7 @@ DEPENDENCIES will_paginate RUBY VERSION - ruby 3.3.10p183 + ruby 3.4.9 BUNDLED WITH - 2.5.22 + 4.0.8 diff --git a/bin/bundler-audit b/bin/bundler-audit new file mode 100755 index 0000000..e2ef226 --- /dev/null +++ b/bin/bundler-audit @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby +require_relative "../config/boot" +require "bundler/audit/cli" + +ARGV.concat %w[ --config config/bundler-audit.yml ] if ARGV.empty? || ARGV.include?("check") +Bundler::Audit::CLI.start diff --git a/bin/ci b/bin/ci new file mode 100755 index 0000000..4137ad5 --- /dev/null +++ b/bin/ci @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby +require_relative "../config/boot" +require "active_support/continuous_integration" + +CI = ActiveSupport::ContinuousIntegration +require_relative "../config/ci.rb" diff --git a/bin/rubocop b/bin/rubocop index 40330c0..5a20504 100755 --- a/bin/rubocop +++ b/bin/rubocop @@ -2,7 +2,7 @@ require "rubygems" require "bundler/setup" -# explicit rubocop config increases performance slightly while avoiding config confusion. +# Explicit RuboCop config increases performance slightly while avoiding config confusion. ARGV.unshift("--config", File.expand_path("../.rubocop.yml", __dir__)) load Gem.bin_path("rubocop", "rubocop") diff --git a/bin/setup b/bin/setup index be3db3c..81be011 100755 --- a/bin/setup +++ b/bin/setup @@ -22,6 +22,7 @@ FileUtils.chdir APP_ROOT do puts "\n== Preparing database ==" system! "bin/rails db:prepare" + system! "bin/rails db:reset" if ARGV.include?("--reset") puts "\n== Removing old logs and tempfiles ==" system! "bin/rails log:clear tmp:clear" diff --git a/config/application.rb b/config/application.rb index 684c776..8228376 100644 --- a/config/application.rb +++ b/config/application.rb @@ -9,7 +9,7 @@ module NewNara class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. - config.load_defaults 8.0 + config.load_defaults 8.1 # Please, add to the `ignore` list any other `lib` subdirectories that do # not contain `.rb` files, or that should not be reloaded or eager loaded. diff --git a/config/bundler-audit.yml b/config/bundler-audit.yml new file mode 100644 index 0000000..e74b3af --- /dev/null +++ b/config/bundler-audit.yml @@ -0,0 +1,5 @@ +# Audit all gems listed in the Gemfile for known security problems by running bin/bundler-audit. +# CVEs that are not relevant to the application can be enumerated on the ignore list below. + +ignore: + - CVE-THAT-DOES-NOT-APPLY diff --git a/config/ci.rb b/config/ci.rb new file mode 100644 index 0000000..a75ee71 --- /dev/null +++ b/config/ci.rb @@ -0,0 +1,24 @@ +# Run using bin/ci + +CI.run do + step 'Setup', 'bin/setup --skip-server' + + step 'Style: Ruby', 'bin/rubocop' + + step 'Security: Gem audit', 'bin/bundler-audit' + step 'Security: Importmap vulnerability audit', 'bin/importmap audit' + step 'Security: Brakeman code analysis', 'bin/brakeman --quiet --no-pager --exit-on-warn --exit-on-error' + step 'Tests: Rails', 'bin/rails test' + step 'Tests: Seeds', 'env RAILS_ENV=test bin/rails db:seed:replant' + + # Optional: Run system tests + # step 'Tests: System', 'bin/rails test:system' + + # Optional: set a green GitHub commit status to unblock PR merge. + # Requires the `gh` CLI and `gh extension install basecamp/gh-signoff`. + # if success? + # step 'Signoff: All systems go. Ready for merge and deploy.', 'gh signoff' + # else + # failure 'Signoff: CI failed. Do not merge or deploy.', 'Fix the issues and try again.' + # end +end diff --git a/config/environments/development.rb b/config/environments/development.rb index d1aa4de..14c25d0 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -55,6 +55,9 @@ # Highlight code that enqueued background job in logs. config.active_job.verbose_enqueue_logs = true + # Highlight code that triggered redirect in logs. + config.action_dispatch.verbose_redirect_logs = true + # Raises error for missing translations. # config.i18n.raise_on_missing_translations = true diff --git a/config/initializers/content_security_policy.rb b/config/initializers/content_security_policy.rb index b3076b3..d51d713 100644 --- a/config/initializers/content_security_policy.rb +++ b/config/initializers/content_security_policy.rb @@ -20,6 +20,10 @@ # config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s } # config.content_security_policy_nonce_directives = %w(script-src style-src) # +# # Automatically add `nonce` to `javascript_tag`, `javascript_include_tag`, and `stylesheet_link_tag` +# # if the corresponding directives are specified in `content_security_policy_nonce_directives`. +# # config.content_security_policy_nonce_auto = true +# # # Report violations without enforcing the policy. # # config.content_security_policy_report_only = true # end diff --git a/config/puma.rb b/config/puma.rb index 3037022..d060738 100644 --- a/config/puma.rb +++ b/config/puma.rb @@ -7,7 +7,8 @@ # # You can control the number of workers using ENV["WEB_CONCURRENCY"]. You # should only set this value when you want to run 2 or more workers. The -# default is already 1. +# default is already 1. You can set it to `auto` to automatically start a worker +# for each available processor. # # The ideal number of threads per worker depends both on how much time the # application spends waiting for IO operations and on how much you wish to @@ -33,7 +34,7 @@ # Allow puma to be restarted by `bin/rails restart` command. plugin :tmp_restart -# Run the Solid Queue supervisor inside of Puma for single-server deployments +# Run the Solid Queue supervisor inside of Puma for single-server deployments. plugin :solid_queue if ENV["SOLID_QUEUE_IN_PUMA"] # enable the delayed_stop plugin to intercept signals diff --git a/db/migrate/20260630191754_add_service_name_to_active_storage_blobs.active_storage.rb b/db/migrate/20260630191754_add_service_name_to_active_storage_blobs.active_storage.rb new file mode 100644 index 0000000..9af9359 --- /dev/null +++ b/db/migrate/20260630191754_add_service_name_to_active_storage_blobs.active_storage.rb @@ -0,0 +1,23 @@ +# This migration comes from active_storage (originally 20190112182829) +class AddServiceNameToActiveStorageBlobs < ActiveRecord::Migration[6.0] + def up + return unless table_exists?(:active_storage_blobs) + return if column_exists?(:active_storage_blobs, :service_name) + + add_column :active_storage_blobs, :service_name, :string + + if (configured_service = ActiveStorage::Blob.service.name) + # rubocop:disable Rails/SkipsModelValidations + ActiveStorage::Blob.unscoped.update_all(service_name: configured_service) + # rubocop:enable Rails/SkipsModelValidations + end + + change_column :active_storage_blobs, :service_name, :string, null: false + end + + def down + return unless table_exists?(:active_storage_blobs) + + remove_column :active_storage_blobs, :service_name + end +end diff --git a/db/migrate/20260630191755_create_active_storage_variant_records.active_storage.rb b/db/migrate/20260630191755_create_active_storage_variant_records.active_storage.rb new file mode 100644 index 0000000..58cc779 --- /dev/null +++ b/db/migrate/20260630191755_create_active_storage_variant_records.active_storage.rb @@ -0,0 +1,28 @@ +# This migration comes from active_storage (originally 20191206030411) +class CreateActiveStorageVariantRecords < ActiveRecord::Migration[6.0] + def change + return unless table_exists?(:active_storage_blobs) + + # Use Active Record's configured type for primary key + create_table :active_storage_variant_records, id: primary_key_type, if_not_exists: true do |t| + t.belongs_to :blob, null: false, index: false, type: blobs_primary_key_type + t.string :variation_digest, null: false + + t.index %i[blob_id variation_digest], name: 'index_active_storage_variant_records_uniqueness', unique: true + t.foreign_key :active_storage_blobs, column: :blob_id + end + end + + private + + def primary_key_type + config = Rails.configuration.generators + config.options[config.orm][:primary_key_type] || :primary_key + end + + def blobs_primary_key_type + pkey_name = connection.primary_key(:active_storage_blobs) + pkey_column = connection.columns(:active_storage_blobs).find { |c| c.name == pkey_name } + pkey_column.bigint? ? :bigint : pkey_column.type + end +end diff --git a/db/migrate/20260630191756_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb b/db/migrate/20260630191756_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb new file mode 100644 index 0000000..93c8b85 --- /dev/null +++ b/db/migrate/20260630191756_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb @@ -0,0 +1,8 @@ +# This migration comes from active_storage (originally 20211119233751) +class RemoveNotNullOnActiveStorageBlobsChecksum < ActiveRecord::Migration[6.0] + def change + return unless table_exists?(:active_storage_blobs) + + change_column_null(:active_storage_blobs, :checksum, true) + end +end diff --git a/db/schema.rb b/db/schema.rb index 578e710..09e9f7f 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,182 +10,180 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[6.1].define(version: 0) do - - create_table "CPC", id: false, charset: "latin1", options: "ENGINE=MyISAM", force: :cascade do |t| - t.integer "ID" - t.string "Title" +ActiveRecord::Schema[8.1].define(version: 2026_06_30_191756) do + create_table "CPC", id: false, charset: "latin1", collation: "latin1_swedish_ci", options: "ENGINE=MyISAM", force: :cascade do |t| t.text "Abstract", size: :medium - t.string "PaperNumber", limit: 10 - t.string "AuthorFirstName", limit: 80 - t.string "AuthorLastName", limit: 80 - t.string "AuthorAffiliation", limit: 100 + t.string "Author2Affiliation", limit: 100 t.string "Author2FirstName", limit: 80 t.string "Author2LastName", limit: 80 - t.string "Author2Affiliation", limit: 100 + t.string "AuthorAffiliation", limit: 100 + t.string "AuthorFirstName", limit: 80 + t.string "AuthorLastName", limit: 80 + t.string "CitationInfo", limit: 200 + t.datetime "DateEntered", precision: nil + t.datetime "DateWritten", precision: nil + t.string "EmailContact", limit: 100 + t.integer "FileSize" + t.integer "ID" + t.string "JELNumbers", limit: 50 + t.string "Keywords" + t.text "Notes", size: :medium t.string "OtherAuthors" t.string "OtherAuthorsAffiliations" - t.integer "FileSize" t.integer "Pages" - t.datetime "DateWritten" - t.datetime "DateEntered" + t.string "PaperNumber", limit: 10 + t.string "PublicationInfo" + t.string "Title" t.string "URL", limit: 100 - t.string "Keywords" - t.string "EmailContact", limit: 100 - t.string "JELNumbers", limit: 50 t.string "WPSeries", limit: 50 - t.string "PublicationInfo" - t.string "CitationInfo", limit: 200 - t.text "Notes", size: :medium end - create_table "NARA_CaseFiles", primary_key: "Case_ID", id: :integer, default: nil, charset: "latin1", options: "ENGINE=MyISAM", force: :cascade do |t| - t.integer "ID" + create_table "NARA_CaseFiles", primary_key: "Case_ID", id: :integer, default: nil, charset: "latin1", collation: "latin1_swedish_ci", options: "ENGINE=MyISAM", force: :cascade do |t| + t.string "AFILENUM", limit: 50 + t.string "AGE", limit: 5 + t.string "ARRIVAL_AGE", limit: 50 + t.string "BIRTHPLACE", limit: 100 + t.string "BIRTHPLACE_CITY", limit: 50 + t.string "BIRTHPLACE_STATE", limit: 50 t.string "BOXNUMBER", limit: 50 - t.string "LASTNAME", limit: 20 - t.string "FIRSTNAME", limit: 20 - t.string "MIDDLENAME", limit: 20 - t.string "SERIES", limit: 6 t.string "CASENUMBER", limit: 20 - t.string "SHIP", limit: 22 + t.string "CERTIFICATE_OF_IDENTITY", limit: 50 + t.string "CERTIFICATE_OF_RESIDENCE", limit: 50 + t.string "CLASS", limit: 50 + t.string "COMPANY", limit: 100 + t.string "COURT_RECORD", limit: 50 t.string "DATE", limit: 50 + t.datetime "DATE_ENTERED", precision: nil t.string "DESTINATION", limit: 50 - t.string "BIRTHPLACE", limit: 100 - t.string "BIRTHPLACE_CITY", limit: 50 - t.string "BIRTHPLACE_STATE", limit: 50 + t.string "DISPOSITION_OF_CASE", limit: 150 t.string "DOB", limit: 15 - t.string "AGE", limit: 5 - t.string "ARRIVAL_AGE", limit: 50 + t.string "FIRSTNAME", limit: 20 t.string "GENDER", limit: 1 - t.string "AFILENUM", limit: 50 - t.string "CLASS", limit: 50 - t.string "DISPOSITION_OF_CASE", limit: 150 - t.string "ST_BORN", limit: 10 t.string "HOUSE_NUM", limit: 4 - t.string "OTHERNAMEL", limit: 34 + t.integer "ID" + t.string "LASTNAME", limit: 20 + t.string "MIDDLENAME", limit: 20 t.string "OTHERNAMEF", limit: 34 + t.string "OTHERNAMEL", limit: 34 t.string "OTHERNAMEM", limit: 34 - t.string "CERTIFICATE_OF_RESIDENCE", limit: 50 - t.string "CERTIFICATE_OF_IDENTITY", limit: 50 + t.string "PORT", limit: 20 t.string "RED_EAGLE_CERTIFICATE", limit: 50 - t.string "COURT_RECORD", limit: 50 t.string "REMARKS", limit: 100 - t.string "PORT", limit: 20 + t.string "SERIES", limit: 6 + t.string "SHIP", limit: 22 t.string "SOURCE", limit: 100 - t.datetime "DATE_ENTERED" - t.string "COMPANY", limit: 100 + t.string "ST_BORN", limit: 10 t.index ["LASTNAME", "FIRSTNAME", "DESTINATION", "BIRTHPLACE", "PORT", "DATE", "SHIP"], name: "search_index", type: :fulltext end - create_table "NARA_CaseFiles_020130", id: false, charset: "latin1", options: "ENGINE=MyISAM", force: :cascade do |t| - t.integer "ID" + create_table "NARA_CaseFiles_020130", id: false, charset: "latin1", collation: "latin1_swedish_ci", options: "ENGINE=MyISAM", force: :cascade do |t| + t.string "AFILENUM", limit: 50 + t.string "AGE", limit: 5 + t.string "BIRTHPLACE", limit: 11 t.string "BOXNUMBER", limit: 50 - t.string "LASTNAME", limit: 20 - t.string "FIRSTNAME", limit: 20 - t.string "MIDDLENAME", limit: 20 - t.string "SERIES", limit: 6 t.string "CASENUMBER", limit: 20 - t.string "SHIP", limit: 22 - t.datetime "DATE" - t.string "BIRTHPLACE", limit: 11 + t.datetime "DATE", precision: nil t.string "DOB", limit: 15 - t.string "AGE", limit: 5 + t.string "FIRSTNAME", limit: 20 t.string "GENDER", limit: 1 - t.string "AFILENUM", limit: 50 - t.string "ST_BORN", limit: 10 t.string "HOUSE_NUM", limit: 4 - t.string "OTHERNAMEL", limit: 34 + t.integer "ID" + t.string "LASTNAME", limit: 20 + t.string "MIDDLENAME", limit: 20 t.string "OTHERNAMEF", limit: 34 + t.string "OTHERNAMEL", limit: 34 t.string "OTHERNAMEM", limit: 34 + t.string "SERIES", limit: 6 + t.string "SHIP", limit: 22 + t.string "ST_BORN", limit: 10 t.string "Type", limit: 10 end - create_table "NARA_CaseFiles_040506", id: false, charset: "latin1", options: "ENGINE=MyISAM", force: :cascade do |t| - t.integer "Case_ID" - t.integer "ID" + create_table "NARA_CaseFiles_040506", id: false, charset: "latin1", collation: "latin1_swedish_ci", options: "ENGINE=MyISAM", force: :cascade do |t| + t.string "AFILENUM", limit: 50 + t.string "AGE", limit: 5 + t.string "ARRIVAL_AGE", limit: 50 + t.string "BIRTHPLACE", limit: 11 + t.string "BIRTHPLACE_CITY", limit: 50 t.string "BOXNUMBER", limit: 50 - t.string "LASTNAME", limit: 20 - t.string "FIRSTNAME", limit: 20 - t.string "MIDDLENAME", limit: 20 - t.string "SERIES", limit: 6 t.string "CASENUMBER", limit: 20 - t.string "SHIP", limit: 22 - t.datetime "DATE" + t.string "CERTIFICATE_OF_IDENTITY", limit: 50 + t.string "CERTIFICATE_OF_RESIDENCE", limit: 50 + t.string "CLASS", limit: 50 + t.string "COURT_RECORD", limit: 50 + t.integer "Case_ID" + t.datetime "DATE", precision: nil + t.datetime "DATE_ENTERED", precision: nil t.string "DESTINATION", limit: 50 - t.string "BIRTHPLACE", limit: 11 - t.string "BIRTHPLACE_CITY", limit: 50 + t.string "DISPOSITION_OF_CASE", limit: 150 t.string "DOB", limit: 15 - t.string "AGE", limit: 5 - t.string "ARRIVAL_AGE", limit: 50 + t.string "FIRSTNAME", limit: 20 t.string "GENDER", limit: 1 - t.string "AFILENUM", limit: 50 - t.string "CLASS", limit: 50 - t.string "DISPOSITION_OF_CASE", limit: 150 - t.string "ST_BORN", limit: 10 t.string "HOUSE_NUM", limit: 4 - t.string "OTHERNAMEL", limit: 34 + t.integer "ID" + t.string "LASTNAME", limit: 20 + t.string "MIDDLENAME", limit: 20 t.string "OTHERNAMEF", limit: 34 + t.string "OTHERNAMEL", limit: 34 t.string "OTHERNAMEM", limit: 34 - t.string "CERTIFICATE_OF_RESIDENCE", limit: 50 - t.string "CERTIFICATE_OF_IDENTITY", limit: 50 + t.string "PORT", limit: 20 t.string "RED_EAGLE_CERTIFICATE", limit: 50 - t.string "COURT_RECORD", limit: 50 t.string "REMARKS", limit: 100 - t.string "PORT", limit: 20 + t.string "SERIES", limit: 6 + t.string "SHIP", limit: 22 t.string "SOURCE", limit: 100 - t.datetime "DATE_ENTERED" + t.string "ST_BORN", limit: 10 end - create_table "NARA_CaseFiles_060705", id: false, charset: "latin1", options: "ENGINE=MyISAM", force: :cascade do |t| - t.integer "Case_ID" - t.integer "ID" + create_table "NARA_CaseFiles_060705", id: false, charset: "latin1", collation: "latin1_swedish_ci", options: "ENGINE=MyISAM", force: :cascade do |t| + t.string "AFILENUM", limit: 50 + t.string "AGE", limit: 5 + t.string "ARRIVAL_AGE", limit: 50 + t.string "BIRTHPLACE", limit: 100 + t.string "BIRTHPLACE_CITY", limit: 50 t.string "BOXNUMBER", limit: 50 - t.string "LASTNAME", limit: 20 - t.string "FIRSTNAME", limit: 20 - t.string "MIDDLENAME", limit: 20 - t.string "SERIES", limit: 6 t.string "CASENUMBER", limit: 20 - t.string "SHIP", limit: 22 + t.string "CERTIFICATE_OF_IDENTITY", limit: 50 + t.string "CERTIFICATE_OF_RESIDENCE", limit: 50 + t.string "CLASS", limit: 50 + t.string "COURT_RECORD", limit: 50 + t.integer "Case_ID" t.string "DATE", limit: 50 + t.datetime "DATE_ENTERED", precision: nil t.string "DESTINATION", limit: 50 - t.string "BIRTHPLACE", limit: 100 - t.string "BIRTHPLACE_CITY", limit: 50 + t.string "DISPOSITION_OF_CASE", limit: 150 t.string "DOB", limit: 15 - t.string "AGE", limit: 5 - t.string "ARRIVAL_AGE", limit: 50 + t.string "FIRSTNAME", limit: 20 t.string "GENDER", limit: 1 - t.string "AFILENUM", limit: 50 - t.string "CLASS", limit: 50 - t.string "DISPOSITION_OF_CASE", limit: 150 - t.string "ST_BORN", limit: 10 t.string "HOUSE_NUM", limit: 4 - t.string "OTHERNAMEL", limit: 34 + t.integer "ID" + t.string "LASTNAME", limit: 20 + t.string "MIDDLENAME", limit: 20 t.string "OTHERNAMEF", limit: 34 + t.string "OTHERNAMEL", limit: 34 t.string "OTHERNAMEM", limit: 34 - t.string "CERTIFICATE_OF_RESIDENCE", limit: 50 - t.string "CERTIFICATE_OF_IDENTITY", limit: 50 + t.string "PORT", limit: 20 t.string "RED_EAGLE_CERTIFICATE", limit: 50 - t.string "COURT_RECORD", limit: 50 t.string "REMARKS", limit: 100 - t.string "PORT", limit: 20 + t.string "SERIES", limit: 6 + t.string "SHIP", limit: 22 t.string "SOURCE", limit: 100 - t.datetime "DATE_ENTERED" + t.string "ST_BORN", limit: 10 end - create_table "NARA_HawaiiSeries", id: false, charset: "latin1", options: "ENGINE=MyISAM", force: :cascade do |t| + create_table "NARA_HawaiiSeries", id: false, charset: "latin1", collation: "latin1_swedish_ci", options: "ENGINE=MyISAM", force: :cascade do |t| + t.text "Series_Description", size: :medium t.string "Series_Number" t.string "Series_Type" - t.text "Series_Description", size: :medium end - create_table "dtproperties", id: false, charset: "latin1", options: "ENGINE=MyISAM", force: :cascade do |t| + create_table "dtproperties", id: false, charset: "latin1", collation: "latin1_swedish_ci", options: "ENGINE=MyISAM", force: :cascade do |t| t.integer "id" + t.binary "lvalue", size: :medium t.integer "objectid" t.string "property", limit: 64 - t.string "value" t.string "uvalue" - t.binary "lvalue", size: :medium + t.string "value" t.integer "version" end - end diff --git a/public/400.html b/public/400.html index 282dbc8..640de03 100644 --- a/public/400.html +++ b/public/400.html @@ -35,12 +35,35 @@ font-weight: 400; letter-spacing: -0.0025em; line-height: 1.4; - min-height: 100vh; + min-height: 100dvh; place-items: center; text-rendering: optimizeLegibility; -webkit-text-size-adjust: 100%; } + #error-description { + fill: #d30001; + } + + #error-id { + fill: #f0eff0; + } + + @media (prefers-color-scheme: dark) { + body { + background: #101010; + color: #e0e0e0; + } + + #error-description { + fill: #FF6161; + } + + #error-id { + fill: #2c2c2c; + } + } + a { color: inherit; font-weight: 700; @@ -83,13 +106,11 @@ } main article br { - display: none; @media(min-width: 48em) { display: inline; } - } @@ -102,10 +123,10 @@
- +
-

The server cannot process the request due to a client error. Please check the request and try again. If you’re the application owner check the logs for more information.

+

The server cannot process the request due to a client error. Please check the request and try again. If you're the application owner check the logs for more information.

diff --git a/public/404.html b/public/404.html index c0670bc..d7f0f14 100644 --- a/public/404.html +++ b/public/404.html @@ -4,7 +4,7 @@ - The page you were looking for doesn’t exist (404 Not found) + The page you were looking for doesn't exist (404 Not found) @@ -35,12 +35,35 @@ font-weight: 400; letter-spacing: -0.0025em; line-height: 1.4; - min-height: 100vh; + min-height: 100dvh; place-items: center; text-rendering: optimizeLegibility; -webkit-text-size-adjust: 100%; } + #error-description { + fill: #d30001; + } + + #error-id { + fill: #f0eff0; + } + + @media (prefers-color-scheme: dark) { + body { + background: #101010; + color: #e0e0e0; + } + + #error-description { + fill: #FF6161; + } + + #error-id { + fill: #2c2c2c; + } + } + a { color: inherit; font-weight: 700; @@ -83,13 +106,11 @@ } main article br { - display: none; @media(min-width: 48em) { display: inline; } - } @@ -102,10 +123,10 @@
- +
-

The page you were looking for doesn’t exist. You may have mistyped the address or the page may have moved. If you’re the application owner check the logs for more information.

+

The page you were looking for doesn't exist. You may have mistyped the address or the page may have moved. If you're the application owner check the logs for more information.

diff --git a/public/406-unsupported-browser.html b/public/406-unsupported-browser.html index 9532a9c..43d2811 100644 --- a/public/406-unsupported-browser.html +++ b/public/406-unsupported-browser.html @@ -35,12 +35,35 @@ font-weight: 400; letter-spacing: -0.0025em; line-height: 1.4; - min-height: 100vh; + min-height: 100dvh; place-items: center; text-rendering: optimizeLegibility; -webkit-text-size-adjust: 100%; } + #error-description { + fill: #d30001; + } + + #error-id { + fill: #f0eff0; + } + + @media (prefers-color-scheme: dark) { + body { + background: #101010; + color: #e0e0e0; + } + + #error-description { + fill: #FF6161; + } + + #error-id { + fill: #2c2c2c; + } + } + a { color: inherit; font-weight: 700; @@ -83,13 +106,11 @@ } main article br { - display: none; @media(min-width: 48em) { display: inline; } - } @@ -102,7 +123,7 @@
- +

Your browser is not supported.
Please upgrade your browser to continue.

diff --git a/public/422.html b/public/422.html index 8bcf060..f12fb4a 100644 --- a/public/422.html +++ b/public/422.html @@ -35,12 +35,35 @@ font-weight: 400; letter-spacing: -0.0025em; line-height: 1.4; - min-height: 100vh; + min-height: 100dvh; place-items: center; text-rendering: optimizeLegibility; -webkit-text-size-adjust: 100%; } + #error-description { + fill: #d30001; + } + + #error-id { + fill: #f0eff0; + } + + @media (prefers-color-scheme: dark) { + body { + background: #101010; + color: #e0e0e0; + } + + #error-description { + fill: #FF6161; + } + + #error-id { + fill: #2c2c2c; + } + } + a { color: inherit; font-weight: 700; @@ -83,13 +106,11 @@ } main article br { - display: none; @media(min-width: 48em) { display: inline; } - } @@ -102,10 +123,10 @@
- +
-

The change you wanted was rejected. Maybe you tried to change something you didn’t have access to. If you’re the application owner check the logs for more information.

+

The change you wanted was rejected. Maybe you tried to change something you didn't have access to. If you're the application owner check the logs for more information.

diff --git a/public/500.html b/public/500.html index d77718c..e4eb18a 100644 --- a/public/500.html +++ b/public/500.html @@ -4,7 +4,7 @@ - We’re sorry, but something went wrong (500 Internal Server Error) + We're sorry, but something went wrong (500 Internal Server Error) @@ -35,12 +35,35 @@ font-weight: 400; letter-spacing: -0.0025em; line-height: 1.4; - min-height: 100vh; + min-height: 100dvh; place-items: center; text-rendering: optimizeLegibility; -webkit-text-size-adjust: 100%; } + #error-description { + fill: #d30001; + } + + #error-id { + fill: #f0eff0; + } + + @media (prefers-color-scheme: dark) { + body { + background: #101010; + color: #e0e0e0; + } + + #error-description { + fill: #FF6161; + } + + #error-id { + fill: #2c2c2c; + } + } + a { color: inherit; font-weight: 700; @@ -83,13 +106,11 @@ } main article br { - display: none; @media(min-width: 48em) { display: inline; } - } @@ -102,10 +123,10 @@
- +
-

We’re sorry, but something went wrong.
If you’re the application owner check the logs for more information.

+

We're sorry, but something went wrong.
If you're the application owner check the logs for more information.

diff --git a/public/icon.png b/public/icon.png new file mode 100644 index 0000000..c4c9dbf Binary files /dev/null and b/public/icon.png differ diff --git a/public/icon.svg b/public/icon.svg new file mode 100644 index 0000000..04b34bf --- /dev/null +++ b/public/icon.svg @@ -0,0 +1,3 @@ + + +