diff --git a/Gemfile b/Gemfile index 9195796..4eba183 100644 --- a/Gemfile +++ b/Gemfile @@ -45,6 +45,7 @@ gem "dartsass-rails" gem "bootstrap", "~> 5.3.3" gem "friendly_id", "~> 5.5.0" gem "csv" +gem "damerau-levenshtein" group :development, :test do # See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem diff --git a/Gemfile.lock b/Gemfile.lock index 61fab0a..127efc1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -104,6 +104,7 @@ GEM connection_pool (2.5.3) crass (1.0.6) csv (3.3.5) + damerau-levenshtein (1.3.3) dartsass-rails (0.5.1) railties (>= 6.0.0) sass-embedded (~> 1.63) @@ -438,6 +439,7 @@ DEPENDENCIES brakeman capybara csv + damerau-levenshtein dartsass-rails debug factory_bot_rails diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb index acc18ee..c9a5848 100644 --- a/app/controllers/messages_controller.rb +++ b/app/controllers/messages_controller.rb @@ -74,7 +74,6 @@ class MessagesController < ApplicationController @action_name = t("helpers.buttons.back") @action_path = contest_path(@contest) - @message = Message.find(params[:message_id]) @completion = Completion.new() @completion.display_time_from_start = @message.display_time @@ -96,7 +95,19 @@ class MessagesController < ApplicationController end def set_data - @contestants = @contest.contestants.order(:name) + @message = Message.find(params[:message_id]) @puzzles = @contest.puzzles + @contestants = @contest.contestants.order(:name) + if @contestants.size > 0 + @closest_contestant = @contestants.first + closest_distance = 10000 + @contestants.each do |contestant| + distance = DamerauLevenshtein.distance(@message.author, contestant.name) + if distance < closest_distance + closest_distance = distance + @closest_contestant = contestant + end + end + end end end diff --git a/app/views/completions/_form.html.slim b/app/views/completions/_form.html.slim index a5af54b..8e840f6 100644 --- a/app/views/completions/_form.html.slim +++ b/app/views/completions/_form.html.slim @@ -22,6 +22,10 @@ .form-floating = form.select :contestant_id, @contestants.map { |contestant| [contestant.form_name, contestant.id] }, {}, class: "form-select" = form.label :contestant_id + - if @closest_contestant + javascript: + el = document.querySelector('select[name="completion[contestant_id]"]'); + el.value = "#{@closest_contestant.id}" - if @puzzles.size > 1 .row.mb-3 .col