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 @@
+
+
+