diff --git a/main.js b/main.js index 2c9f562..0c83f54 100644 --- a/main.js +++ b/main.js @@ -90,7 +90,7 @@ desc constructor(row = null) { - if (row == null) return + if (row == null) return let columns = [...row.querySelectorAll('td, th')].map(el => el.cloneNode(true)) if (columns.length === 1) { @@ -102,7 +102,7 @@ if (elementsToRemove) { columns[1].removeChild(elementsToRemove) } - + this.content = columns[1].innerHTML .replaceAll("
", "") .replaceAll(/\s*Перейти к легенде.*$/gs, "") @@ -121,7 +121,7 @@ toDiv(altName = null, altDesc = null) { let div = document.createElement('div') let desc = altDesc ?? this.desc - desc = desc ? "
" + + desc = desc ? "
" + "" + "
" : "" div.innerHTML = "" + "
" + (this.content ?? "") + "
" + @@ -240,7 +240,7 @@ function isRouteMapPage() { return isRouteManagement() && getAction() === "map" } - + async function updatePoint(formData) { return await fetch(`https://runcity.geo.rictum.ru/api/competitions/${getCompetition()}/update`, { method: 'POST', @@ -308,14 +308,14 @@ return ref } - let makeCoordinatesLinks = (function() { + let makeCoordinatesLinks = (function () { var executed = false return function () { if (executed) return executed = true - + let linksContainer = document.createElement("div") - + linksContainer.appendChild(copyCoordinates()) linksContainer.appendChild(makeRef(yandexMaps, "https://upload.wikimedia.org/wikipedia/commons/7/72/Yandex_Maps_icon.svg", ZOOM)) linksContainer.appendChild(makeRef(googleMaps, "https://upload.wikimedia.org/wikipedia/commons/a/aa/Google_Maps_icon_%282020%29.svg", METERS)) @@ -443,7 +443,7 @@ while (n--) { u8arr[n] = bstr.charCodeAt(n) } - return new File([u8arr], filename, {type:mime}) + return new File([u8arr], filename, { type: mime }) } function getHtmlElementByFileType(file) { @@ -474,14 +474,14 @@ let from = variant == "l" ? "history" : "legend" let to = variant == "l" ? "legend" : "history" let type = attachmentIndex == 1 ? "photo" : "files" - + return [document.querySelector(`.${from}-${type}-container`), document.querySelector(`.${to}-${type}-container`)] } function makeHandleFilesFunc() { let storedFiles = [] - return function() { + return function () { let dt = new DataTransfer() if (storedFiles.length) { @@ -532,16 +532,16 @@ let index = [...fileContainer.parentElement.children].indexOf(fileContainer) if (!confirm("Точно?")) return - + storedFiles.splice(storedFiles.length - this.files.length + index, 1) - + let rdt = new DataTransfer() for (const file of this.files) { rdt.items.add(file) } rdt.items.remove(index) this.files = rdt.files - + fileContainer.parentElement.removeChild(fileContainer) }) fileButtonsContainer.appendChild(deleteButton) @@ -556,7 +556,7 @@ displayedFile.src = e.target.result downloadLink.setAttribute("href", displayedFile.src) - storedFiles.push({data: displayedFile.src, name: file.name}) + storedFiles.push({ data: displayedFile.src, name: file.name }) } reader.readAsDataURL(file) } @@ -565,9 +565,9 @@ } } - let prettifyFiles = (function() { + let prettifyFiles = (function () { var executed = false - return function(insertedFileRows) { + return function (insertedFileRows) { if (executed) return executed = true @@ -580,11 +580,11 @@ pseudoInput.setAttribute("for", element.id) pseudoInput.textContent = "+" element.parentElement.insertBefore(pseudoInput, element) - + let fileListContainer = document.createElement("div") fileListContainer.classList.add("file-list-container") element.parentElement.parentElement.appendChild(fileListContainer) - + element.addEventListener("change", makeHandleFilesFunc(), false) }) @@ -607,11 +607,11 @@ let toInputs = [...to.querySelectorAll("input, textarea")] for (const [fromEl, value] of values) { - let currentToInput = toInputs.find(toEl => + let currentToInput = toInputs.find(toEl => toEl.type !== 'file' && - toEl.type === fromEl.type && - toEl.name === fromEl.name && - toEl.id === fromEl.id && + toEl.type === fromEl.type && + toEl.name === fromEl.name && + toEl.id === fromEl.id && (toEl.type !== "radio" || toEl.value === fromEl.value) ) @@ -666,9 +666,9 @@ } function moveNewFilesOnVariantChange() { - document.querySelectorAll(`input[name^="new_file_type"]`).forEach(el => el.addEventListener("change", function() { + document.querySelectorAll(`input[name^="new_file_type"]`).forEach(el => el.addEventListener("change", function () { let attachmentIndex = getAttachmentIndex(this) - + let [from, to] = getContainersByVariant(this.value, attachmentIndex) let newFiles = [...from.querySelectorAll(`.file-container-new`)] for (const newFile of newFiles) { @@ -693,7 +693,7 @@ function prettifyEditCpForm(form, was, became, insertedFileRows) { moveInputValues(form, was, became) prettifyFiles(insertedFileRows) - + moveNewFilesOnVariantChange() $("#cps_main").select2() makeCoordinatesLinks() @@ -720,7 +720,7 @@ alwaysPrettifyCheckbox.type = "checkbox" alwaysPrettifyCheckbox.id = "always-prettify-" + index alwaysPrettifyCheckbox.name = "always-prettify-" + index - alwaysPrettifyCheckbox.addEventListener("change", function() { + alwaysPrettifyCheckbox.addEventListener("change", function () { let otherCheckboxes = document.querySelectorAll(`input[name^="always-prettify-"]`) for (let checkbox of otherCheckboxes) { if (checkbox.id !== this.id) { @@ -805,7 +805,7 @@ new Swiper('.swiper', { initialSlide: files.findIndex(el => el.dataset.origin && el.dataset.origin === src || el.src === src), - + navigation: { nextEl: '.swiper-button-next', prevEl: '.swiper-button-prev', @@ -816,16 +816,16 @@ } function bindArrowsForGallery(leftButtonQuery, rightButtonQuery) { - document.addEventListener("keydown", function(e) { + document.addEventListener("keydown", function (e) { if (!document.querySelector("dialog").open) return - switch(e.key) { + switch (e.key) { case "ArrowLeft": $(leftButtonQuery).click() - break + break case "ArrowRight": $(rightButtonQuery).click() - break + break default: return } @@ -888,14 +888,14 @@ localStorage.setItem(localStorageItems.JUST_CREATED, cpNumber) localStorage.setItem(localStorageItems.LATTITUDE, lattitude) localStorage.setItem(localStorageItems.LONGITUDE, longitude) - + document.querySelector(`input[name="save_go"]`).click() }) }) return saveAndNewButton } - + function createSendButtons() { if (document.querySelector(".pseudo-save")) return @@ -917,7 +917,7 @@ if (saveButton.name == "save_exit") { localStorage.setItem(localStorageItems.REDIRECT_EXIT, true) } - + saveAndStayButtons[0].click() })) @@ -933,7 +933,7 @@ let prevCreated = localStorage.getItem(localStorageItems.PREV_CREATED) let needUpdateId = localStorage.getItem(localStorageItems.NEED_UPDATE_ID) let exit = localStorage.getItem(localStorageItems.REDIRECT_EXIT) - + if (needUpdateId) { let formData = new FormData() formData.set("cp[id]", urlParams().get("cp_id")) @@ -941,18 +941,18 @@ formData.set("update_id", true) updatePoint(formData).then(() => localStorage.removeItem(localStorageItems.NEED_UPDATE_ID)) } - + if (exit) { localStorage.removeItem(localStorageItems.REDIRECT_EXIT) - + location.href = location.href.replace(location.search, '') return } - + if (justCreated !== null) { localStorage.setItem(localStorageItems.PREV_CREATED, justCreated) localStorage.removeItem(localStorageItems.JUST_CREATED) - + location.href = location.href.replace(location.search, "?action=edit") return } @@ -960,7 +960,7 @@ document.querySelector(`input[name="cp[number]"]`).value = parseInt(localStorage.getItem(localStorageItems.PREV_CREATED)) + 1 document.querySelector(`input[name="cp[lattitude]"]`).value = localStorage.getItem(localStorageItems.LATTITUDE) document.querySelector(`input[name="cp[longitude]"]`).value = localStorage.getItem(localStorageItems.LONGITUDE) - + localStorage.removeItem(localStorageItems.PREV_CREATED) localStorage.removeItem(localStorageItems.LATTITUDE) localStorage.removeItem(localStorageItems.LONGITUDE) @@ -995,7 +995,7 @@ link.innerText = label if (blanks.includes(label)) { - link.setAttribute("target", "_blank") + link.setAttribute("target", "_blank") } menuItem.appendChild(link) @@ -1017,14 +1017,14 @@ mainLinksFormatted[label] = `/${competition}/${href}` } menuContainer.append(createMenuFromLinks(mainLinksFormatted, ["Легенда"])) - + let catId = urlParams().get("cat_id") if (catId !== null) { let catLinksFormatted = {} for (const [label, href] of Object.entries(catLinks)) { catLinksFormatted[label] = href(catId) } - + menuContainer.append(createMenuFromLinks(catLinksFormatted)) } @@ -1142,7 +1142,7 @@ function makeContainer() { let container = document.createElement('div') container.id = "new" - + return container } @@ -1151,7 +1151,7 @@ { index: 2, name: "№", desc: "" }, { index: 8, name: "Название" } ]) - + let copyLink = document.createElement("div") copyLink.innerHTML = new Property(rows[2]).desc headerContainer.append(copyLink) @@ -1178,9 +1178,9 @@ let topButtonsContainer = createFrom(rows, "buttons", [ { index: 0 } ]) - + let bottomButtonsContainer = topButtonsContainer.cloneNode(true) - + document.querySelectorAll("#props tr:is(:first-child, :last-child) th").forEach((el, index) => { let rowContentWrapper = document.createElement("div") rowContentWrapper.classList.add("buttons-row__content-wrapper") @@ -1188,20 +1188,20 @@ let child = el.firstChild rowContentWrapper.appendChild(child) } - + let prettifyButton = document.createElement("button") prettifyButton.type = "button" prettifyButton.textContent = "Сделать красиво" prettifyButton.addEventListener("click", () => { prettifyEditCpForm(form, oldTable, container, insertedFileRows) }) - + rowContentWrapper.appendChild(prettifyButton) rowContentWrapper.appendChild(createAlwaysPrettifyInput(index)) - + el.appendChild(rowContentWrapper) }) - + ;[topButtonsContainer, bottomButtonsContainer].forEach((el, index) => { let unglifyButton = document.createElement("button") unglifyButton.type = "button" @@ -1209,7 +1209,7 @@ unglifyButton.addEventListener("click", () => { uglifyEditCpForm(form, container, oldTable) }) - + let topRowContentWrapper = el.querySelector("div > div > div") topRowContentWrapper.appendChild(unglifyButton) topRowContentWrapper.appendChild(createAlwaysPrettifyInput(index)) @@ -1244,23 +1244,23 @@ function makeLegend(rows) { let legendContainer = document.createElement("div") legendContainer.classList.add("legend-container") - + /* LEGEND DESC */ - + let legendDescContainer = document.createElement("div") legendDescContainer.classList.add("legend-container__desc") - + let legendDescHeader = document.createElement("div") legendDescHeader.classList.add("legend-container__desc-header") - - + + const LEGEND_RU_LABEL = "Русский" const LEGEND_EN_LABEL = "Английский" let legendLang = document.createElement("div") legendLang.classList.add("legend-desc__lang") legendLang.textContent = LEGEND_RU_LABEL legendDescHeader.appendChild(legendLang) - + let legendEnSwitchContainer = createFrom(rows, "legend-switch-container", [ { index: 48 } ]) @@ -1280,7 +1280,7 @@ enInput.value = ruInputs[i].value } }) - + let legendRuSwitchContainer = createFrom(rows, "legend-switch-container hidden", [ { index: 39 } ]) @@ -1290,37 +1290,37 @@ legendLang.textContent = LEGEND_RU_LABEL }) legendDescHeader.appendChild(legendRuSwitchContainer) - + legendDescHeader.appendChild(copyDescButton) - + let legendRuDescContainer = createFrom(rows, "legend-desc", [ { index: 40, desc: "" }, { index: 41, desc: "" }, { index: 42, desc: "" }, { index: 43, desc: "" } ]) - + let legendRuHiddenDescContainer = createFrom(rows, "legend-desc collapsible collapsed", [ { index: 44, desc: "" }, { index: 45, desc: "" }, { index: 46, desc: "" }, { index: 47, desc: "" }, ]) - + let legendEnDescContainer = createFrom(rows, "legend-desc hidden", [ { index: 49, desc: "" }, { index: 50, desc: "" }, { index: 51, desc: "" }, { index: 52, desc: "" } ]) - + let legendEnHiddenDescContainer = createFrom(rows, "legend-desc collapsible collapsed hidden", [ { index: 53, desc: "" }, { index: 54, desc: "" }, { index: 55, desc: "" }, { index: 56, desc: "" } ]) - + let hider = document.createElement("div") let hiderButton = document.createElement("button") hiderButton.classList.add("collapse-button") @@ -1332,7 +1332,7 @@ }) }) hider.appendChild(hiderButton) - + legendDescContainer.appendChild(legendDescHeader) legendDescContainer.appendChild(legendRuDescContainer) legendDescContainer.appendChild(legendRuHiddenDescContainer) @@ -1352,22 +1352,22 @@ function makeLegendFiles(rows) { let legendFilesContainer = document.createElement("div") legendFilesContainer.classList.add("legend-container__files") - + let imagesForLegendContainer = createFrom(rows, "files-container legend-photo-container", [ { index: 23, name: "Фото в легенде" } ]) legendFilesContainer.appendChild(imagesForLegendContainer) - + let imagesForHistoryContainer = createFrom(rows, "files-container history-photo-container", [ { name: "Фото для ИС" } ]) legendFilesContainer.appendChild(imagesForHistoryContainer) - + let audioForLegendContainer = createFrom(rows, "files-container legend-files-container", [ { index: 27, name: "Файлы в легенде" } ]) legendFilesContainer.appendChild(audioForLegendContainer) - + let audioForHistoryContainer = createFrom(rows, "files-container history-files-container", [ { name: "Файлы для ИС" } ]) @@ -1404,13 +1404,13 @@ let dialog = document.createElement("dialog") dialog.id = "dialog" document.body.appendChild(dialog) - + dialog.addEventListener("click", e => { if (e.target == dialog) { e.target.close() } }) - + dialog.addEventListener("close", e => { e.target.innerHTML = "" }) @@ -1424,7 +1424,7 @@ contentWrapper.appendChild(document.querySelector("form")) contentWrapper.appendChild(document.querySelector("#map-wrapper")) content.appendChild(contentWrapper) - + let panToCenter = document.createElement("button") panToCenter.type = "button" panToCenter.textContent = "В центр" @@ -1826,17 +1826,17 @@ formatMap() /* DIALOG */ - + makeDialog() /* PRETTIFY CHECKBOX */ - + checkIfAlwaysPrettify(form, oldTable, container, insertedFileRows) } function isAllPointsSouthOfLat(lat) { - map.eachLayer(function(layer) { - if (layer instanceof L.Marker) { + map.eachLayer(function (layer) { + if (layer instanceof L.Marker) { let latLng = layer.getLatLng() if (latLng.lat > lat) { return false @@ -1849,7 +1849,7 @@ if (map !== undefined && L !== undefined) { let coords = mapsCenterByCompetition[getCompetition()] if (coords == null) return - + if (isAllPointsSouthOfLat(lat)) { map.setView(new L.LatLng(coords.ifSouthern.lat, coords.ifSouthern.lon), 13) } @@ -1859,7 +1859,7 @@ } } - function prettifyRouteBuildPage() { + function changeColumnWidthForRouteBuildPage() { let styles = ` #content table table { td:nth-child(2) { @@ -1884,14 +1884,25 @@ } ` addStylesToHead(styles) + } + function hideDescriptionFromRouteBuildPage() { document.querySelectorAll(`#content > form > table > tbody > tr:is(:nth-child(3), :nth-child(6)) `).forEach(el => el.remove()) + } + + function hideStartRowFromRouteBuildPage() { document.querySelector(`#content table table tr:nth-child(2) `).remove() } + function prettifyRouteBuildPage() { + changeColumnWidthForRouteBuildPage() + hideDescriptionFromRouteBuildPage() + hideStartRowFromRouteBuildPage() + } + function matchNumberFromSelect(select) { return [...document.querySelector(select).options].reduce( - (res, el) => ({ ...res, [el.textContent.match(/(?<=^\s*#)\d+/g)?.[0]]: el.value }), + (res, el) => ({ ...res, [el.textContent.match(/(?<=^\s*#)\d+/g)?.[0]]: el.value }), {} ) } @@ -1904,13 +1915,7 @@ document.querySelector(`${select} option:last-child`).scrollIntoView() } - function prettifyRouteEditPage() { - document.querySelectorAll(`textarea:is([name="track[comment_int]"], [name="track[comment_ext]"])`).forEach(el => { - el.rows = 1 - }) - - document.querySelectorAll(`table tr:is(:nth-child(3), :nth-child(4), :nth-child(5))`).forEach(el => el.classList.add("hidden")) - + function createPointsInpitForRouteEditPage() { let addPointsContainer = document.createElement("div") let pointInput = document.createElement("input") @@ -1950,7 +1955,7 @@ option.selected = false scrollSelectToBottom("#cps_in") }) - + let removeButton = document.createElement("button") removeButton.type = "button" removeButton.textContent = "Убрать" @@ -2001,6 +2006,16 @@ `) } + function prettifyRouteEditPage() { + document.querySelectorAll(`textarea:is([name="track[comment_int]"], [name="track[comment_ext]"])`).forEach(el => { + el.rows = 1 + }) + + document.querySelectorAll(`table tr:is(:nth-child(3), :nth-child(4), :nth-child(5))`).forEach(el => el.classList.add("hidden")) + + createPointsInpitForRouteEditPage() + } + function toggleStagePageRows(rows) { let showIndex = [0, 3] let to = rows.findIndex(el => el.querySelector("th")?.textContent.trim() == "Бонусы") @@ -2011,7 +2026,7 @@ toggleRows(rows, to, rows.length, 1, []) } - function prettifyRouteStagesPage() { + function hideUselessRowsFromRouteStagesPage() { let styles = ` tr.collapsed { display: block; @@ -2126,7 +2141,7 @@ pretty = false location.reload() }) - + header.querySelector("#enable-button").after(disableButton) } @@ -2143,7 +2158,7 @@ alwaysEnableCheckbox.type = "checkbox" alwaysEnableCheckbox.id = "always-enable" alwaysEnableCheckbox.name = "always-enable" - alwaysEnableCheckbox.addEventListener("change", function() { + alwaysEnableCheckbox.addEventListener("change", function () { if (this.checked) removeDisabledPage() else @@ -2161,7 +2176,7 @@ function prettify() { if (pretty) return - + pretty = true addDisableButton() @@ -2169,18 +2184,18 @@ addCommonStyles() /* SWITCH FOR DIFFERENT PAGES */ - + addStickyMenu() - + if (isCpEditPage()) { prettifyEditCpPage() } - + if (isRouteListPage()) { addStageLink() hideNonTesters() } - + if (isRouteBuildPage()) { prettifyRouteBuildPage() } @@ -2188,15 +2203,15 @@ if (isRouteEditPage()) { prettifyRouteEditPage() } - + if (isRouteStagesPage()) { - prettifyRouteStagesPage() + hideUselessRowsFromRouteStagesPage() } } function prettifyIfEnabled() { if (isPageDisabled()) return - + prettify() } @@ -2214,11 +2229,11 @@ bindDeleteButton() return } - - prettifyIfEnabled() + + prettifyIfEnabled() /* MAPS */ - + addClearBoth() if (hasMap()) {