Add contest param for offline form participation
This commit is contained in:
		| @@ -101,7 +101,7 @@ class ContestsController < ApplicationController | ||||
|  | ||||
|   def offline_new | ||||
|     @contest = Contest.find_by(slug: params[:id]) | ||||
|     unless @contest && @contest.public | ||||
|     unless @contest && @contest.offline_form | ||||
|       skip_authorization | ||||
|       not_found and return | ||||
|     end | ||||
| @@ -127,7 +127,7 @@ class ContestsController < ApplicationController | ||||
|   end | ||||
|  | ||||
|   def contest_params | ||||
|     params.expect(contest: [ :lang, :name, :public, :team, :allow_registration ]) | ||||
|     params.expect(contest: [ :lang, :name, :offline_form, :public, :team, :allow_registration ]) | ||||
|   end | ||||
|  | ||||
|   def filter_contestants_per_category | ||||
|   | ||||
| @@ -6,6 +6,7 @@ | ||||
| #  allow_registration :boolean          default(FALSE) | ||||
| #  lang               :string           default("en") | ||||
| #  name               :string | ||||
| #  offline_form       :boolean          default(FALSE) | ||||
| #  public             :boolean          default(FALSE) | ||||
| #  slug               :string | ||||
| #  team               :boolean          default(FALSE) | ||||
|   | ||||
| @@ -15,6 +15,11 @@ h4.mt-5 = t("contests.form.general") | ||||
|       .form-check.form-switch | ||||
|         = form.check_box :public, class: "form-check-input" | ||||
|         = form.label :public | ||||
|   .row.mb-3 | ||||
|     .col | ||||
|       .form-check.form-switch | ||||
|         = form.check_box :offline_form, class: "form-check-input" | ||||
|         = form.label :offline_form | ||||
|   .row.mb-3 | ||||
|     .col | ||||
|       .form-check.form-switch | ||||
|   | ||||
| @@ -20,6 +20,12 @@ javascript: | ||||
|     - else | ||||
|       a.btn.btn-success.disabled | ||||
|         = t("contests.show.public_scoreboard_disabled") | ||||
|     - if @contest.offline_form | ||||
|       a.ms-3.btn.btn-success href="/public/#{@contest.slug}/offline" | ||||
|         = t("contests.show.open_offline_form") | ||||
|     - else | ||||
|       a.ms-3.btn.btn-success.disabled | ||||
|         = t("contests.show.offline_form_disabled") | ||||
|     button.btn.btn-success.ms-3 onclick="copyExtensionUrlToClipboard()" | ||||
|       css: | ||||
|         button > svg { | ||||
|   | ||||
| @@ -53,6 +53,8 @@ en: | ||||
|       contest: | ||||
|         lang: Language for the public scoreboard | ||||
|         name: Name | ||||
|         offline_form: Enable the offline participation form | ||||
|         offline_form_description: Offline participants will have to fill the form by providing an image taken of the undone puzzle, and validate their finish time with an upload of an image of the completed puzzle | ||||
|         public: Enable the public scoreboard | ||||
|         team: Team contest | ||||
|         team_description: For UI display purposes mainly | ||||
| @@ -162,7 +164,9 @@ en: | ||||
|       add_participant: Add participant | ||||
|       add_puzzle: Add puzzle | ||||
|       copy_extension_url: Copy the URL for connecting from the browser extension | ||||
|       open_offline_form: Open offline form | ||||
|       open_public_scoreboard: Open public scoreboard | ||||
|       offline_form_disabled: The offline form is disabled | ||||
|       public_scoreboard_disabled: The public scoreboard is disabled | ||||
|       url_copied: URL copied to the clipboard | ||||
|   contestants: | ||||
|   | ||||
| @@ -24,6 +24,8 @@ fr: | ||||
|       contest: | ||||
|         lang: Langue pour le classement public | ||||
|         name: Nom | ||||
|         offline_form: Activer le formulaire de participation hors-ligne | ||||
|         offline_form_description: Les participant.e.s hors-ligne pourront participer en prenant une photo du puzzle non fait, puis valider leur temps avec une photo du puzzle une fois complété | ||||
|         public: Activer le classement public | ||||
|         team: Concours par équipes | ||||
|         team_description: Principalement pour des raisons d'affichage | ||||
| @@ -133,7 +135,9 @@ fr: | ||||
|       add_participant: Ajouter un.e participant.e | ||||
|       add_puzzle: Ajouter un puzzle | ||||
|       copy_extension_url: Copier l'URL pour la connexion depuis l'extension web | ||||
|       open_offline_form: Ouvrir le formulaire hors-ligne | ||||
|       open_public_scoreboard: Ouvrir le classement public | ||||
|       offline_form_disabled: Le formulaire hors-ligne n'est pas activé | ||||
|       public_scoreboard_disabled: Le classement public n'est pas activé | ||||
|       url_copied: L’URL a été copiée dans le presse-papier | ||||
|   contestants: | ||||
|   | ||||
							
								
								
									
										5
									
								
								db/migrate/20251030092221_add_offline_form_to_contest.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								db/migrate/20251030092221_add_offline_form_to_contest.rb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| class AddOfflineFormToContest < ActiveRecord::Migration[8.0] | ||||
|   def change | ||||
|     add_column :contests, :offline_form, :boolean, default: false | ||||
|   end | ||||
| end | ||||
							
								
								
									
										3
									
								
								db/schema.rb
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										3
									
								
								db/schema.rb
									
									
									
										generated
									
									
									
								
							| @@ -10,7 +10,7 @@ | ||||
| # | ||||
| # It's strongly recommended that you check this file into your version control system. | ||||
|  | ||||
| ActiveRecord::Schema[8.0].define(version: 2025_10_29_155116) do | ||||
| ActiveRecord::Schema[8.0].define(version: 2025_10_30_092221) do | ||||
|   create_table "active_storage_attachments", force: :cascade do |t| | ||||
|     t.string "name", null: false | ||||
|     t.string "record_type", null: false | ||||
| @@ -92,6 +92,7 @@ ActiveRecord::Schema[8.0].define(version: 2025_10_29_155116) do | ||||
|     t.string "slug" | ||||
|     t.string "lang", default: "en" | ||||
|     t.boolean "public", default: false | ||||
|     t.boolean "offline_form", default: false | ||||
|     t.index ["slug"], name: "index_contests_on_slug", unique: true | ||||
|     t.index ["user_id"], name: "index_contests_on_user_id" | ||||
|   end | ||||
|   | ||||
| @@ -6,6 +6,7 @@ | ||||
| #  allow_registration :boolean          default(FALSE) | ||||
| #  lang               :string           default("en") | ||||
| #  name               :string | ||||
| #  offline_form       :boolean          default(FALSE) | ||||
| #  public             :boolean          default(FALSE) | ||||
| #  slug               :string | ||||
| #  team               :boolean          default(FALSE) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user