Compare commits

...

11 Commits

27 changed files with 856 additions and 237 deletions

1
.gitignore vendored
View File

@ -33,3 +33,4 @@
# Ignore master key for decrypting credentials and more.
/config/master.key
/node_modules/

View File

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Rubocop" enabled="false" level="WARNING" enabled_by_default="false" />
</profile>
</component>

View File

@ -26,82 +26,83 @@
<excludeFolder url="file://$MODULE_DIR$/public/system" />
<excludeFolder url="file://$MODULE_DIR$/components" />
</content>
<orderEntry type="jdk" jdkName="rbenv: 3.0.2" jdkType="RUBY_SDK" />
<orderEntry type="jdk" jdkName="rbenv: 3.1.2" jdkType="RUBY_SDK" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" scope="PROVIDED" name="actioncable (v7.0.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="actionmailbox (v7.0.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="actionmailer (v7.0.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="actionpack (v7.0.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="actiontext (v7.0.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="actionview (v7.0.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="activejob (v7.0.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="activemodel (v7.0.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="activerecord (v7.0.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="activestorage (v7.0.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="activesupport (v7.0.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="addressable (v2.8.0, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="bindex (v0.8.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="bootsnap (v1.9.4, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="builder (v3.2.4, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="bundler (v2.2.22, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="capybara (v3.36.0, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="childprocess (v4.1.0, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="concurrent-ruby (v1.1.9, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="crass (v1.0.6, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="debug (v1.4.0, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="digest (v3.1.0, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="erubi (v1.10.0, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="globalid (v1.0.0, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="i18n (v1.8.11, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="importmap-rails (v1.0.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="io-console (v0.5.11, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="io-wait (v0.2.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="irb (v1.4.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="jbuilder (v2.11.5, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="loofah (v2.13.0, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="mail (v2.7.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="marcel (v1.0.2, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="matrix (v0.4.2, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="method_source (v1.0.0, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="mini_mime (v1.1.2, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="minitest (v5.15.0, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="msgpack (v1.4.2, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="net-imap (v0.2.3, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="net-protocol (v0.1.2, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="net-smtp (v0.3.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="nio4r (v2.5.8, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="nokogiri (v1.13.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="public_suffix (v4.0.6, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="puma (v5.5.2, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="racc (v1.6.0, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="rack (v2.2.3, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="rack-test (v1.1.0, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="rails (v7.0.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="rails-dom-testing (v2.0.3, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="rails-html-sanitizer (v1.4.2, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="railties (v7.0.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="rake (v13.0.6, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="redis (v4.5.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="regexp_parser (v2.2.0, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="reline (v0.3.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="rexml (v3.2.5, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="rubyzip (v2.3.2, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="selenium-webdriver (v4.1.0, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="sprockets (v4.0.2, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="sprockets-rails (v3.4.2, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="sqlite3 (v1.4.2, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="stimulus-rails (v1.0.2, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="strscan (v3.0.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="thor (v1.2.1, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="timeout (v0.2.0, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="turbo-rails (v1.0.0, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="tzinfo (v2.0.4, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="web-console (v4.2.0, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="webdrivers (v5.0.0, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="websocket-driver (v0.7.5, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="websocket-extensions (v0.1.5, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="xpath (v3.2.0, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="zeitwerk (v2.5.3, rbenv: 3.0.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="actioncable (v7.0.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="actionmailbox (v7.0.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="actionmailer (v7.0.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="actionpack (v7.0.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="actiontext (v7.0.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="actionview (v7.0.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="activejob (v7.0.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="activemodel (v7.0.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="activerecord (v7.0.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="activestorage (v7.0.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="activesupport (v7.0.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="addressable (v2.8.0, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="bindex (v0.8.1, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="bootsnap (v1.12.0, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="builder (v3.2.4, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="bundler (v2.3.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="capybara (v3.37.1, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="childprocess (v4.1.0, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="concurrent-ruby (v1.1.10, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="crass (v1.0.6, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="debug (v1.5.0, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="digest (v3.1.0, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="erubi (v1.10.0, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="globalid (v1.0.0, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="i18n (v1.10.0, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="importmap-rails (v1.1.2, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="io-console (v0.5.11, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="irb (v1.4.1, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="jbuilder (v2.11.5, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="loofah (v2.18.0, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="mail (v2.7.1, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="marcel (v1.0.2, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="matrix (v0.4.2, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="method_source (v1.0.0, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="mini_mime (v1.1.2, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="minitest (v5.16.0, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="msgpack (v1.5.2, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="net-imap (v0.2.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="net-pop (v0.1.1, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="net-protocol (v0.1.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="net-smtp (v0.3.1, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="nio4r (v2.5.8, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="nokogiri (v1.13.6, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="public_suffix (v4.0.7, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="puma (v5.6.4, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="racc (v1.6.0, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="rack (v2.2.3.1, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="rack-test (v1.1.0, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="rails (v7.0.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="rails-dom-testing (v2.0.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="rails-html-sanitizer (v1.4.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="railties (v7.0.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="rake (v13.0.6, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="redis (v4.6.0, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="regexp_parser (v2.5.0, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="reline (v0.3.1, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="rexml (v3.2.5, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="rubyzip (v2.3.2, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="selenium-webdriver (v4.2.1, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="sprockets (v4.0.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="sprockets-rails (v3.4.2, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="sqlite3 (v1.4.4, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="stimulus-rails (v1.0.4, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="strscan (v3.0.3, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="thor (v1.2.1, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="timeout (v0.3.0, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="turbo-rails (v1.1.1, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="tzinfo (v2.0.4, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="web-console (v4.2.0, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="webdrivers (v5.0.0, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="websocket (v1.2.9, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="websocket-driver (v0.7.5, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="websocket-extensions (v0.1.5, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="xpath (v3.2.0, rbenv: 3.1.2) [gem]" level="application" />
<orderEntry type="library" scope="PROVIDED" name="zeitwerk (v2.6.0, rbenv: 3.1.2) [gem]" level="application" />
</component>
<component name="RModuleSettingsStorage">
<LOAD_PATH number="0" />

View File

@ -1 +1 @@
3.0.2
3.1.2

View File

@ -3,10 +3,10 @@
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby '3.0.2'
ruby '3.1.2'
# Bundle edge Rails instead: gem "rails", github: "rails/rails", branch: "main"
gem 'rails', '~> 7.0.1'
gem 'rails', '~> 7.0.3'
# The original asset pipeline for Rails [https://github.com/rails/sprockets-rails]
gem 'sprockets-rails'
@ -15,7 +15,7 @@ gem 'sprockets-rails'
gem 'sqlite3', '~> 1.4'
# Use the Puma web server [https://github.com/puma/puma]
gem 'puma', '~> 5.0'
gem 'puma', '~> 5.6'
# Use JavaScript with ESM import maps [https://github.com/rails/importmap-rails]
gem 'importmap-rails'

View File

@ -1,67 +1,67 @@
GEM
remote: https://rubygems.org/
specs:
actioncable (7.0.1)
actionpack (= 7.0.1)
activesupport (= 7.0.1)
actioncable (7.0.3)
actionpack (= 7.0.3)
activesupport (= 7.0.3)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
actionmailbox (7.0.1)
actionpack (= 7.0.1)
activejob (= 7.0.1)
activerecord (= 7.0.1)
activestorage (= 7.0.1)
activesupport (= 7.0.1)
actionmailbox (7.0.3)
actionpack (= 7.0.3)
activejob (= 7.0.3)
activerecord (= 7.0.3)
activestorage (= 7.0.3)
activesupport (= 7.0.3)
mail (>= 2.7.1)
net-imap
net-pop
net-smtp
actionmailer (7.0.1)
actionpack (= 7.0.1)
actionview (= 7.0.1)
activejob (= 7.0.1)
activesupport (= 7.0.1)
actionmailer (7.0.3)
actionpack (= 7.0.3)
actionview (= 7.0.3)
activejob (= 7.0.3)
activesupport (= 7.0.3)
mail (~> 2.5, >= 2.5.4)
net-imap
net-pop
net-smtp
rails-dom-testing (~> 2.0)
actionpack (7.0.1)
actionview (= 7.0.1)
activesupport (= 7.0.1)
actionpack (7.0.3)
actionview (= 7.0.3)
activesupport (= 7.0.3)
rack (~> 2.0, >= 2.2.0)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0)
actiontext (7.0.1)
actionpack (= 7.0.1)
activerecord (= 7.0.1)
activestorage (= 7.0.1)
activesupport (= 7.0.1)
actiontext (7.0.3)
actionpack (= 7.0.3)
activerecord (= 7.0.3)
activestorage (= 7.0.3)
activesupport (= 7.0.3)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
actionview (7.0.1)
activesupport (= 7.0.1)
actionview (7.0.3)
activesupport (= 7.0.3)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
activejob (7.0.1)
activesupport (= 7.0.1)
activejob (7.0.3)
activesupport (= 7.0.3)
globalid (>= 0.3.6)
activemodel (7.0.1)
activesupport (= 7.0.1)
activerecord (7.0.1)
activemodel (= 7.0.1)
activesupport (= 7.0.1)
activestorage (7.0.1)
actionpack (= 7.0.1)
activejob (= 7.0.1)
activerecord (= 7.0.1)
activesupport (= 7.0.1)
activemodel (7.0.3)
activesupport (= 7.0.3)
activerecord (7.0.3)
activemodel (= 7.0.3)
activesupport (= 7.0.3)
activestorage (7.0.3)
actionpack (= 7.0.3)
activejob (= 7.0.3)
activerecord (= 7.0.3)
activesupport (= 7.0.3)
marcel (~> 1.0)
mini_mime (>= 1.1.0)
activesupport (7.0.1)
activesupport (7.0.3)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
@ -69,10 +69,10 @@ GEM
addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0)
bindex (0.8.1)
bootsnap (1.9.4)
msgpack (~> 1.0)
bootsnap (1.12.0)
msgpack (~> 1.2)
builder (3.2.4)
capybara (3.36.0)
capybara (3.37.1)
addressable
matrix
mini_mime (>= 0.1.3)
@ -82,28 +82,27 @@ GEM
regexp_parser (>= 1.5, < 3.0)
xpath (~> 3.2)
childprocess (4.1.0)
concurrent-ruby (1.1.9)
concurrent-ruby (1.1.10)
crass (1.0.6)
debug (1.4.0)
debug (1.5.0)
irb (>= 1.3.6)
reline (>= 0.2.7)
digest (3.1.0)
erubi (1.10.0)
globalid (1.0.0)
activesupport (>= 5.0)
i18n (1.8.11)
i18n (1.10.0)
concurrent-ruby (~> 1.0)
importmap-rails (1.0.1)
importmap-rails (1.1.2)
actionpack (>= 6.0.0)
railties (>= 6.0.0)
io-console (0.5.11)
io-wait (0.2.1)
irb (1.4.1)
reline (>= 0.3.0)
jbuilder (2.11.5)
actionview (>= 5.0.0)
activesupport (>= 5.0.0)
loofah (2.13.0)
loofah (2.18.0)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
mail (2.7.1)
@ -112,8 +111,8 @@ GEM
matrix (0.4.2)
method_source (1.0.0)
mini_mime (1.1.2)
minitest (5.15.0)
msgpack (1.4.2)
minitest (5.16.0)
msgpack (1.5.2)
net-imap (0.2.3)
digest
net-protocol
@ -122,75 +121,76 @@ GEM
digest
net-protocol
timeout
net-protocol (0.1.2)
io-wait
net-protocol (0.1.3)
timeout
net-smtp (0.3.1)
digest
net-protocol
timeout
nio4r (2.5.8)
nokogiri (1.13.1-x86_64-linux)
nokogiri (1.13.6-x86_64-linux)
racc (~> 1.4)
public_suffix (4.0.6)
puma (5.5.2)
public_suffix (4.0.7)
puma (5.6.4)
nio4r (~> 2.0)
racc (1.6.0)
rack (2.2.3)
rack (2.2.3.1)
rack-test (1.1.0)
rack (>= 1.0, < 3)
rails (7.0.1)
actioncable (= 7.0.1)
actionmailbox (= 7.0.1)
actionmailer (= 7.0.1)
actionpack (= 7.0.1)
actiontext (= 7.0.1)
actionview (= 7.0.1)
activejob (= 7.0.1)
activemodel (= 7.0.1)
activerecord (= 7.0.1)
activestorage (= 7.0.1)
activesupport (= 7.0.1)
rails (7.0.3)
actioncable (= 7.0.3)
actionmailbox (= 7.0.3)
actionmailer (= 7.0.3)
actionpack (= 7.0.3)
actiontext (= 7.0.3)
actionview (= 7.0.3)
activejob (= 7.0.3)
activemodel (= 7.0.3)
activerecord (= 7.0.3)
activestorage (= 7.0.3)
activesupport (= 7.0.3)
bundler (>= 1.15.0)
railties (= 7.0.1)
railties (= 7.0.3)
rails-dom-testing (2.0.3)
activesupport (>= 4.2.0)
nokogiri (>= 1.6)
rails-html-sanitizer (1.4.2)
rails-html-sanitizer (1.4.3)
loofah (~> 2.3)
railties (7.0.1)
actionpack (= 7.0.1)
activesupport (= 7.0.1)
railties (7.0.3)
actionpack (= 7.0.3)
activesupport (= 7.0.3)
method_source
rake (>= 12.2)
thor (~> 1.0)
zeitwerk (~> 2.5)
rake (13.0.6)
redis (4.5.1)
regexp_parser (2.2.0)
redis (4.6.0)
regexp_parser (2.5.0)
reline (0.3.1)
io-console (~> 0.5)
rexml (3.2.5)
rubyzip (2.3.2)
selenium-webdriver (4.1.0)
selenium-webdriver (4.2.1)
childprocess (>= 0.5, < 5.0)
rexml (~> 3.2, >= 3.2.5)
rubyzip (>= 1.2.2)
sprockets (4.0.2)
rubyzip (>= 1.2.2, < 3.0)
websocket (~> 1.0)
sprockets (4.0.3)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
sprockets-rails (3.4.2)
actionpack (>= 5.2)
activesupport (>= 5.2)
sprockets (>= 3.0.0)
sqlite3 (1.4.2)
stimulus-rails (1.0.2)
sqlite3 (1.4.4)
stimulus-rails (1.0.4)
railties (>= 6.0.0)
strscan (3.0.1)
strscan (3.0.3)
thor (1.2.1)
timeout (0.2.0)
turbo-rails (1.0.0)
timeout (0.3.0)
turbo-rails (1.1.1)
actionpack (>= 6.0.0)
activejob (>= 6.0.0)
railties (>= 6.0.0)
tzinfo (2.0.4)
concurrent-ruby (~> 1.0)
@ -203,12 +203,13 @@ GEM
nokogiri (~> 1.6)
rubyzip (>= 1.3.0)
selenium-webdriver (~> 4.0)
websocket (1.2.9)
websocket-driver (0.7.5)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.5)
xpath (3.2.0)
nokogiri (~> 1.8)
zeitwerk (2.5.3)
zeitwerk (2.6.0)
PLATFORMS
x86_64-linux
@ -219,8 +220,8 @@ DEPENDENCIES
debug
importmap-rails
jbuilder
puma (~> 5.0)
rails (~> 7.0.1)
puma (~> 5.6)
rails (~> 7.0.3)
redis (~> 4.0)
selenium-webdriver
sprockets-rails
@ -232,7 +233,7 @@ DEPENDENCIES
webdrivers
RUBY VERSION
ruby 3.0.2p107
ruby 3.1.2p20
BUNDLED WITH
2.2.22
2.3.3

View File

@ -1,24 +1,51 @@
# README
# [pinrails](https://nomipinball.bhh.sh)
This README would normally document whatever steps are necessary to get the
application up and running.
just a silly little site to help run the pinball tournaments at
[the coin slot](https://thecoinslottc.com/).
Things you may want to cover:
currently running on ruby 3.1.2
* Ruby version
bundle install
RAILS_ENV=production bundle exec rails db:migrate
RAILS_ENV=production bundle exec assets:precompile
* System dependencies
## nginx config:
* Configuration
server {
listen 80;
server_name nomipinball.bhh.sh;
return 307 https://$server_name$request_uri;
}
server {
listen 443 ssl;
include snippets/ssl/bhh.sh;
root /srv/pinrails/pinrails/public;
server_name nomipinball.bhh.sh;
try_files $uri $uri/index.html $uri.html @rails_app;
location @rails_app {
include proxy_params;
proxy_pass http://localhost:4000;
}
}
* Database creation
## /etc/systemd/system/pinrails.service
* Database initialization
* How to run the test suite
* Services (job queues, cache servers, search engines, etc.)
* Deployment instructions
* ...
[Unit]
Description=pinrails
Wants=network.target
[Service]
Type=simple
User=pinrails
Group=nogroup
WorkingDirectory=/srv/pinrails/pinrails
Environment=RAILS_ENV=production
Environment=PORT=4000
Environment=RAILS_LOG_TO_STDOUT=true
ExecStart=/srv/pinrails/.rbenv/shims/bundle exec rails server -b 127.0.0.1
[Install]
WantedBy=multi-user.target

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -0,0 +1,500 @@
/* Set the global variables for everything. Change these to use your own fonts and colours. */
:root {
/* Set sans-serif & mono fonts */
--sans-font: -apple-system, BlinkMacSystemFont, "Avenir Next", Avenir,
"Nimbus Sans L", Roboto, Noto, "Segoe UI", Arial, Helvetica,
"Helvetica Neue", sans-serif;
--mono-font: Consolas, Menlo, Monaco, "Andale Mono", "Ubuntu Mono", monospace;
/* Body font size. By default, effectively 18.4px, based on 16px as 'root em' */
--base-fontsize: 1.15rem;
/* Major third scale progression - see https://type-scale.com/ */
--header-scale: 1.25;
/* Line height is set to the "Golden ratio" for optimal legibility */
--line-height: 1.4;
/* Default (light) theme */
--bg: #212121;
--accent-bg: #2b2b2b;
--text: #dcdcdc;
--text-light: #ababab;
--border: #666;
--accent: #ffb300;
--accent-light: #ffecb3;
--code: #f06292;
--preformatted: #ccc;
--marked: #ffdd33;
--disabled: #111;
}
img,
video {
opacity: 0.6;
}
html {
/* Set the font globally */
font-family: var(--sans-font);
}
/* Make the body a nice central block */
body {
color: var(--text);
background: var(--bg);
font-size: var(--base-fontsize);
line-height: var(--line-height);
display: flex;
min-height: 100vh;
flex-direction: column;
flex: 1;
margin: 0 auto;
max-width: 45rem;
padding: 0 0.5rem;
overflow-x: hidden;
word-break: break-word;
overflow-wrap: break-word;
}
/* Make the header bg full width, but the content inline with body */
header {
background: var(--accent-bg);
border-bottom: 1px solid var(--border);
text-align: center;
padding: 2rem 0.5rem;
width: 100vw;
position: relative;
box-sizing: border-box;
left: 50%;
right: 50%;
margin-left: -50vw;
margin-right: -50vw;
}
/* Remove margins for header text */
header h1,
header p {
margin: 0;
}
/* Add a little padding to ensure spacing is correct between content and nav */
main {
padding-top: 1.5rem;
}
/* Fix line height when title wraps */
h1,
h2,
h3 {
line-height: 1.1;
}
/* Format navigation */
nav {
font-size: 1rem;
line-height: 2;
padding: 1rem 0;
}
nav a {
margin: 1rem 1rem 0 0;
border: 1px solid var(--border);
border-radius: 5px;
color: var(--text) !important;
display: inline-block;
padding: 0.1rem 1rem;
text-decoration: none;
transition: 0.4s;
}
nav a.current {
border-radius: 8px;
color: var(--accent) !important;
border-color: var(--accent) !important;
}
nav a:hover {
color: var(--accent) !important;
border-color: var(--accent);
}
nav a.current:hover {
text-decoration: none;
}
footer {
margin-top: 4rem;
padding: 2rem 1rem 1.5rem 1rem;
color: var(--text-light);
font-size: 0.9rem;
text-align: center;
border-top: 1px solid var(--border);
}
/* Format headers */
h1 {
font-size: calc(
var(--base-fontsize) * var(--header-scale) * var(--header-scale) *
var(--header-scale) * var(--header-scale)
);
margin-top: calc(var(--line-height) * 1.5rem);
}
h2 {
font-size: calc(
var(--base-fontsize) * var(--header-scale) * var(--header-scale) *
var(--header-scale)
);
margin-top: calc(var(--line-height) * 1.5rem);
}
h3 {
font-size: calc(
var(--base-fontsize) * var(--header-scale) * var(--header-scale)
);
margin-top: calc(var(--line-height) * 1.5rem);
}
h4 {
font-size: calc(var(--base-fontsize) * var(--header-scale));
margin-top: calc(var(--line-height) * 1.5rem);
}
h5 {
font-size: var(--base-fontsize);
margin-top: calc(var(--line-height) * 1.5rem);
}
h6 {
font-size: calc(var(--base-fontsize) / var(--header-scale));
margin-top: calc(var(--line-height) * 1.5rem);
}
/* Format links & buttons */
a,
a:visited {
color: var(--accent);
}
a:hover {
text-decoration: none;
}
a button,
button,
[role="button"],
input[type="submit"],
input[type="reset"],
input[type="button"] {
border: none;
border-radius: 5px;
background: var(--accent);
font-size: 1rem;
color: var(--bg);
padding: 0.7rem 0.9rem;
margin: 0.5rem 0;
transition: 0.4s;
}
a button[disabled],
button[disabled],
[role="button"][aria-disabled="true"],
input[type="submit"][disabled],
input[type="reset"][disabled],
input[type="button"][disabled],
input[type="checkbox"][disabled],
input[type="radio"][disabled],
select[disabled] {
opacity: 0.5;
cursor: not-allowed;
}
input:disabled,
textarea:disabled,
select:disabled {
cursor: not-allowed;
background-color: var(--disabled);
}
input[type="range"] {
padding: 0;
}
/* Set the cursor to '?' while hovering over an abbreviation */
abbr {
cursor: help;
}
button:focus,
button:enabled:hover,
[role="button"]:focus,
[role="button"]:not([aria-disabled="true"]):hover,
input[type="submit"]:focus,
input[type="submit"]:enabled:hover,
input[type="reset"]:focus,
input[type="reset"]:enabled:hover,
input[type="button"]:focus,
input[type="button"]:enabled:hover,
input[type="checkbox"]:focus,
input[type="checkbox"]:enabled:hover,
input[type="radio"]:focus,
input[type="radio"]:enabled:hover {
filter: brightness(1.4);
cursor: pointer;
}
/* Format the expanding box */
details {
background: var(--accent-bg);
border: 1px solid var(--border);
border-radius: 5px;
margin-bottom: 1rem;
}
summary {
cursor: pointer;
font-weight: bold;
padding: 0.6rem 1rem;
}
details[open] {
padding: 0.6rem 1rem 0.75rem 1rem;
}
details[open] summary {
margin-bottom: 0.5rem;
padding: 0;
}
details[open] > *:last-child {
margin-bottom: 0;
}
/* Format tables */
table {
border-collapse: collapse;
width: 100%;
margin: 1.5rem 0;
}
td,
th {
border: 1px solid var(--border);
text-align: left;
padding: 0.5rem;
}
th {
background: var(--accent-bg);
font-weight: bold;
}
tr:nth-child(even) {
/* Set every other cell slightly darker. Improves readability. */
background: var(--accent-bg);
}
table caption {
font-weight: bold;
margin-bottom: 0.5rem;
}
/* Lists */
ol,
ul {
padding-left: 3rem;
}
/* Format forms */
textarea,
select,
input {
font-size: inherit;
font-family: inherit;
padding: 0.5rem;
margin-bottom: 0.5rem;
color: var(--text);
background: var(--bg);
border: 1px solid var(--border);
border-radius: 5px;
box-shadow: none;
box-sizing: border-box;
width: 60%;
-moz-appearance: none;
-webkit-appearance: none;
appearance: none;
}
/* Add arrow to */
select {
background-image: linear-gradient(45deg, transparent 49%, var(--text) 51%),
linear-gradient(135deg, var(--text) 51%, transparent 49%);
background-position: calc(100% - 20px), calc(100% - 15px);
background-size: 5px 5px, 5px 5px;
background-repeat: no-repeat;
}
select[multiple] {
background-image: none !important;
}
/* checkbox and radio button style */
input[type="checkbox"],
input[type="radio"] {
vertical-align: bottom;
position: relative;
}
input[type="radio"] {
border-radius: 100%;
}
input[type="checkbox"]:checked,
input[type="radio"]:checked {
background: var(--accent);
}
input[type="checkbox"]:checked::after {
/* Creates a rectangle with colored right and bottom borders which is rotated to look like a check mark */
content: " ";
width: 0.1em;
height: 0.25em;
border-radius: 0;
position: absolute;
top: 0.05em;
left: 0.18em;
background: transparent;
border-right: solid var(--bg) 0.08em;
border-bottom: solid var(--bg) 0.08em;
font-size: 1.8em;
transform: rotate(45deg);
}
input[type="radio"]:checked::after {
/* creates a colored circle for the checked radio button */
content: " ";
width: 0.25em;
height: 0.25em;
border-radius: 100%;
position: absolute;
top: 0.125em;
background: var(--bg);
left: 0.125em;
font-size: 32px;
}
/* Make the textarea wider than other inputs */
textarea {
width: 80%;
}
/* Makes input fields wider on smaller screens */
@media only screen and (max-width: 720px) {
textarea,
select,
input {
width: 100%;
}
}
/* Ensures the checkbox and radio inputs do not have a set width like other input fields */
input[type="checkbox"],
input[type="radio"] {
width: auto;
}
/* do not show border around file selector button */
input[type="file"] {
border: 0;
}
/* Without this any HTML using <fieldset> shows ugly borders and has additional padding/margin. (Issue #3) */
fieldset {
border: 0;
padding: 0;
margin: 0;
}
/* Misc body elements */
hr {
color: var(--border);
border-top: 1px;
margin: 1rem auto;
}
mark {
padding: 2px 5px;
border-radius: 4px;
background: var(--marked);
}
main img,
main video {
max-width: 100%;
height: auto;
border-radius: 5px;
}
figure {
margin: 0;
}
figcaption {
font-size: 0.9rem;
color: var(--text-light);
text-align: center;
margin-bottom: 1rem;
}
blockquote {
margin: 2rem 0 2rem 2rem;
padding: 0.4rem 0.8rem;
border-left: 0.35rem solid var(--accent);
opacity: 0.8;
font-style: italic;
}
cite {
font-size: 0.9rem;
color: var(--text-light);
font-style: normal;
}
/* Use mono font for code like elements */
code,
pre,
pre span,
kbd,
samp {
font-size: 1.075rem;
font-family: var(--mono-font);
color: var(--code);
}
kbd {
color: var(--preformatted);
border: 1px solid var(--preformatted);
border-bottom: 3px solid var(--preformatted);
border-radius: 5px;
padding: 0.1rem;
}
pre {
padding: 1rem 1.4rem;
max-width: 100%;
overflow: auto;
color: var(--preformatted);
background: var(--accent-bg);
border: 1px solid var(--border);
border-radius: 5px;
}
/* Fix embedded code within pre */
pre code {
color: var(--preformatted);
background: none;
margin: 0;
padding: 0;
}

File diff suppressed because one or more lines are too long

View File

@ -52,7 +52,7 @@ class MachinesController < ApplicationController
@machine.destroy
respond_to do |format|
format.html { redirect_to machines_url, notice: 'Machine was successfully destroyed.' }
format.html { redirect_to machines_url, status: :see_other, notice: 'Machine was successfully removed.' }
format.json { head :no_content }
end
end

View File

@ -49,7 +49,7 @@ class PlayersController < ApplicationController
@player.destroy
respond_to do |format|
format.html { redirect_to players_url, notice: 'Player was successfully destroyed.' }
format.html { redirect_to players_url, status: :see_other, notice: 'Player was successfully removed.' }
format.json { head :no_content }
end
end

View File

@ -1,4 +1,7 @@
# frozen_string_literal: true
module ApplicationHelper
def is_active(action)
params[:action] == action ? "current" : nil
end
end

View File

@ -1,4 +1,11 @@
# frozen_string_literal: true
class Player < ApplicationRecord
after_initialize :default_values
private
def default_values
self.strikes ||= 0
self.paid = self.paid.nil? ? true : self.paid
end
end

View File

@ -1,23 +1,26 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Knockout</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<head>
<title>Knockout</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
<%= javascript_importmap_tags %>
</head>
<%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
<%= javascript_importmap_tags %>
<%= favicon_link_tag asset_path('favicon.png') %>
<% if content_for? :extra_head %>
<%= yield :extra_head %>
<% end %>
</head>
<body>
<nav>
<%= link_to 'Home', '/' %>
<%= link_to 'Pins', machines_url %>
<%= link_to 'Players', players_url %>
<%= link_to 'Randomize', controller: 'pages', action: 'randomize' %>
</nav>
<%= yield %>
</body>
<body>
<nav>
<%= link_to 'Home', root_path, class: "#{"current" if current_page?(root_path)}" %>
<%= link_to 'Pins', machines_path, class: "#{"current" if current_page?(machines_path)}" %>
<%= link_to 'Players', players_path, class: "#{"current" if current_page?(players_path)}" %>
<%= link_to 'Randomize', { controller: 'pages', action: 'randomize' }, class: "#{"current" if current_page?(controller: 'pages', action: 'randomize')}" %>
</nav>
<%= yield %>
</body>
</html>

View File

@ -1,12 +1,17 @@
<p style="color: green"><%= notice %></p>
<% if not notice.nil? %><p style="color: green"><%= notice %></p>
<% end %>
<h1>Pins</h1>
<div id="machines">
<% @machines.each do |machine| %>
<%= render machine %>
<p id="<%= dom_id machine %>">
<%= link_to machine.name, machine %>
<small><%= machine.edition %></small>
</p>
<% end %>
</div>
<hr>
<p><%= pluralize(@machines.count, 'total pin') %></p>
<%= link_to "Add a pin", new_machine_path %>

View File

@ -1,7 +1,12 @@
<p style="color: green"><%= notice %></p>
<% if not notice.nil? %><p style="color: green"><%= notice %></p>
<% end %>
<h1><%= @machine.name %></h1>
<%= render "form", machine: @machine %>
<div>
<%= button_to "Delete #{@machine.name}", @machine, method: :delete %>
<%= link_to "Delete #{@machine.name} ❌", @machine, data: {
turbo_method: :delete,
turbo_confirm: "Are you sure you want to remove #{@machine.name}?" } %>
</div>

View File

@ -1,2 +1,4 @@
<h1>Knockout</h1>
<p>To start the tournament, add players and make sure that the pins are up to date. Then hit randomize to automatically pick teams!</p>
<p>To start the tournament, add players and make sure that the pins are up to date. Then hit randomize to automatically
pick teams!</p>
<p>The source code for this app can be found <%= link_to 'here', "#{GIT_REPO}/src/commit/#{GIT_SHA}" %>.</p>

View File

@ -1,10 +1,14 @@
<% content_for :extra_head do %>
<meta name="turbo-cache-control" content="no-preview">
<% end %>
<h1>Randomize</h1>
<% @groups.each.with_index do |slice, i| %>
<h2><%= @machines[i].name %> <small><%= @machines[i].edition %></small></h2>
<h2 id="<%= dom_id @machines[i] %>"><%= @machines[i].name %> <small><%= @machines[i].edition %></small></h2>
<ol>
<% slice.each do |player| %>
<li><%= link_to player.name, player_path(player) %></li>
<li id="<%= dom_id player %>"><%= link_to player.name, player_path(player) %></li>
<% end %>
</ol>
<% end %>

View File

@ -1,6 +1,8 @@
<div id="<%= dom_id player %>">
<p>
<% if player.paid %>✓<% else %>&nbsp;<% end %>
<% if player.paid %>✓
<% else %>&nbsp;
<% end %>
<%= link_to player.name, player %>
</p>
</div>

View File

@ -1,12 +1,36 @@
<p style="color: green"><%= notice %></p>
<% if not notice.nil? %><p style="color: green"><%= notice %></p>
<% end %>
<h1>Players</h1>
<div id="players">
<% @players.each do |player| %>
<%= render player %>
<% end %>
</div>
<% if @players.any? %>
<div id="players">
<table>
<thead>
<th>Name</th>
<th>Paid</th>
<th>Strikes</th>
<th>Delete</th>
</thead>
<tbody>
<% @players.each do |player| %>
<tr id="<%= dom_id player %>">
<td><%= link_to player.name, player %></td>
<td>
<% if player.paid %>✓
<% end %></td>
<td><%= player.strikes %></td>
<td><%= link_to "❌", player, data: {
turbo_method: :delete,
turbo_confirm: "Are you sure you want to remove #{player.name}?"
} %></td>
</tr>
<% end %>
</tbody>
</table>
</div>
<% end %>
<p><%= pluralize(@players.count, 'total player') %></p>
<hr>
<%= link_to "Add a player", new_player_path %>

View File

@ -1,7 +1,12 @@
<p style="color: green"><%= notice %></p>
<% if not notice.nil? %><p style="color: green"><%= notice %></p>
<% end %>
<h1><%= @player.name %></h1>
<%= render "form", player: @player %>
<div>
<%= button_to "Delete #{@player.name}", @player, method: :delete %>
<%= link_to "Delete #{@player.name} ❌", @player, data: {
turbo_method: :delete,
turbo_confirm: "Are you sure you want to remove #{@player.name}?" } %>
</div>

View File

@ -0,0 +1,2 @@
GIT_SHA = `git rev-parse HEAD`.chomp
GIT_REPO = 'https://tildegit.org/ben/pinrails'

26
db/schema.rb generated
View File

@ -1,4 +1,3 @@
# frozen_string_literal: true
# This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
@ -11,21 +10,20 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20_220_115_164_820) do
create_table 'machines', force: :cascade do |t|
t.string 'name'
t.string 'edition'
t.datetime 'created_at', precision: 6, null: false
t.datetime 'updated_at', precision: 6, null: false
ActiveRecord::Schema[7.0].define(version: 2022_01_15_164820) do
create_table "machines", force: :cascade do |t|
t.string "name"
t.string "edition"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table 'players', force: :cascade do |t|
t.string 'name'
t.boolean 'paid'
t.integer 'strikes'
t.datetime 'created_at', precision: 6, null: false
t.datetime 'updated_at', precision: 6, null: false
create_table "players", force: :cascade do |t|
t.string "name"
t.boolean "paid"
t.integer "strikes"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end

View File

@ -6,3 +6,27 @@
#
# movies = Movie.create([{ name: "Star Wars" }, { name: "Lord of the Rings" }])
# Character.create(name: "Luke", movie: movies.first)
machines = [
["Avengers: Infinity Quest", "Pro"],
["Deadpool", "Pro"],
["Elvira and the Party Monsters", "Pro"],
["Family Guy", "Pro"],
["Godzilla", "Pro"],
["Goldeneye", "Pro"],
["Iron Maiden", "Pro"],
["Jurassic Park", "Pro"],
["Led Zeppelin", "Pro"],
["Mandalorian", "Pro"],
["Metallica", "Pro"],
["Monster Bash", "Remake"],
["Star Wars", "Pro"],
["Stranger Things", "Pro"],
["Teenage Mutant Ninja Turtles", "Pro"],
["The Beatles", "Gold"],
["The Sopranos", "Pro"],
]
machines.each do |name, edition|
Machine.create(name: name, edition: edition)
end

View File

@ -37,6 +37,6 @@ class MachinesTest < ApplicationSystemTestCase
visit machine_url(@machine)
click_on "Delete #{@machine.name}", match: :first
assert_text 'Machine was successfully destroyed'
assert_text 'Machine was successfully removed'
end
end

View File

@ -39,6 +39,6 @@ class PlayersTest < ApplicationSystemTestCase
visit player_url(@player)
click_on "Delete #{@player.name}", match: :first
assert_text 'Player was successfully destroyed'
assert_text 'Player was successfully removed'
end
end