javascript: async function copyExtensionUrlToClipboard() { await navigator.clipboard.writeText("#{message_url}?token=#{@contest.generate_token_for(:token)}"); alert("#{t("contests.show.url_copied")}"); } .row.mb-4 .col - if @contest.public a.btn.btn-success href="/public/#{@contest.slug}" = t("contests.show.open_public_scoreboard") - else a.btn.btn-success.disabled = t("contests.show.public_scoreboard_disabled") - if @contest.offline_form && @contest.puzzles.length < 2 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 { margin-right: 2px; margin-top: -3px; } =< t("contests.show.copy_extension_url") .row .col ul.nav.nav-tabs.mb-4 li.nav-item a.nav-link class=active_page(contest_contestants_path(@contest)) href=contest_contestants_path(@contest) = t("contestants.plural").capitalize li.nav-item a.nav-link class=active_page(contest_puzzles_path(@contest)) href=contest_puzzles_path(@contest) = t("puzzles.plural").capitalize li.nav-item a.nav-link class=active_page(contest_messages_path(@contest)) href=contest_messages_path(@contest) = t("messages.plural").capitalize li.nav-item a.nav-link class=active_page("/contests/#{@contest.id}/settings/general") href="/contests/#{@contest.id}/settings/general" = t("contests.form.general") li.nav-item a.nav-link class=active_page("/contests/#{@contest.id}/settings/offline") href="/contests/#{@contest.id}/settings/offline" = t("contests.form.offline") li.nav-item a.nav-link class=active_page("/contests/#{@contest.id}/settings/categories") href="/contests/#{@contest.id}/settings/categories" = t("contests.form.categories")