118 lines
2.9 KiB
JavaScript
118 lines
2.9 KiB
JavaScript
// ==UserScript==
|
|
// @name Runcity Questionary
|
|
// @namespace http://tampermonkey.net/
|
|
// @version 2024-11-18
|
|
// @description Prettify pages & store data on server
|
|
// @author You
|
|
// @match https://www.runcity.org/ru/events/*/online/
|
|
// @icon https://www.google.com/s2/favicons?sz=64&domain=runcity.org
|
|
// @grant none
|
|
// @require https://code.jquery.com/jquery-3.7.1.min.js
|
|
// @require https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js
|
|
// @require https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js
|
|
// ==/UserScript==
|
|
|
|
(function () {
|
|
'use strict'
|
|
|
|
/* COPY FROM MAIN */
|
|
|
|
class Tag {
|
|
static make(name, params) {
|
|
let element = document.createElement(name)
|
|
for (const [name, value] of Object.entries(params)) {
|
|
if (name == "on") {
|
|
for (const [event, listener] of Object.entries(value)) {
|
|
element.addEventListener(event, listener)
|
|
}
|
|
}
|
|
else if (name == "classes") {
|
|
element.classList.add(...value.split(" "))
|
|
}
|
|
else if (name == "children") {
|
|
element.append(...value)
|
|
}
|
|
else if (name.startsWith("_")) {
|
|
element.setAttribute(name.substring(1), value)
|
|
}
|
|
else
|
|
element[name] = value
|
|
}
|
|
|
|
return element
|
|
}
|
|
|
|
static div(params) {
|
|
return this.make("div", params)
|
|
}
|
|
|
|
static span(params) {
|
|
return this.make("span", params)
|
|
}
|
|
|
|
static button(params) {
|
|
return this.make("button", params)
|
|
}
|
|
|
|
static input(params) {
|
|
return this.make("input", params)
|
|
}
|
|
}
|
|
|
|
function addStylesToHead(styles) {
|
|
let styleSheet = document.createElement("style")
|
|
styleSheet.textContent = styles
|
|
document.head.append(styleSheet)
|
|
}
|
|
|
|
/* END COPY FROM MAIN */
|
|
|
|
function addEmptyCheckForSubmitButton() {
|
|
let saveButton = document.querySelector(`.check-answers-saved`)
|
|
let inputs = document.querySelectorAll(`input.cp_team_answer`)
|
|
|
|
inputs.forEach(el => el.addEventListener("focus", e => el.classList.remove("empty-input")))
|
|
|
|
let pseudoSaveButton = Tag.div({
|
|
id: "pseudo-save",
|
|
on: {
|
|
click: function (e) {
|
|
e.stopPropagation()
|
|
|
|
let canSend = true
|
|
for (const input of inputs) {
|
|
if (input.value.trim() == "") {
|
|
input.classList.add("empty-input")
|
|
canSend = false
|
|
}
|
|
}
|
|
|
|
if (canSend) {
|
|
saveButton.click()
|
|
}
|
|
}
|
|
}
|
|
})
|
|
saveButton.append(pseudoSaveButton)
|
|
|
|
addStylesToHead(`
|
|
.check-answers-saved {
|
|
position: relative;
|
|
|
|
#pseudo-save {
|
|
position: absolute;
|
|
top: 0;
|
|
bottom: 0;
|
|
left: 0;
|
|
right: 0;
|
|
}
|
|
}
|
|
|
|
.empty-input {
|
|
border-color: red !important;
|
|
}
|
|
`)
|
|
}
|
|
|
|
addEmptyCheckForSubmitButton()
|
|
})(); |