const socket = io(); function makeProgressBar(props) { let html = `<svg viewBox="0 0 ${props.size} ${props.size}" class="progress-circle" width="${props.size}" height="${props.size}"> <!-- Фон круга --> <circle class="circle-bg" cx="${props.size/2}" cy="${props.size/2}" r="${props.size/3}" fill="none" stroke="${props.trackColor}" stroke-width="${props.strokeWidth}" /> <!-- Прогресс --> <circle class="circle-progress" cx="${props.size/2}" cy="${props.size/2}" r="${props.size/3}" fill="none" stroke="${props.fillColor}" stroke-width="${props.strokeWidth}" stroke-dasharray="100, 100" stroke-linecap="round" /> </svg>`; return html; } function initSingleCircleProgressBar(view) { if(view.alreadyInitProgressBars) { return ; } $(view).html(makeProgressBar({ "trackColor": view.dataset.barColor + "33", "fillColor": view.dataset.barColor, "strokeWidth": view.dataset.barStroke, "size": view.dataset.barSize })); setProgressBarVal(view, view.dataset.value); const targetElement = view; const observer = new MutationObserver((mutationsList) => { for (const mutation of mutationsList) { if (mutation.type === "attributes" && mutation.attributeName.startsWith("data-")) { const changedAttr = mutation.attributeName; const newValue = targetElement.getAttribute(changedAttr); setProgressBarVal(targetElement, newValue); } } }); observer.observe(targetElement, { attributes: true, attributeFilter: ["data-value"], }); view.alreadyInitProgressBars = true; } function initCircleProgressBars() { $(".circle-progress-bar[data-value]").each(function(){ initSingleCircleProgressBar(view); }); } function setProgressBarVal(target, percent) { const circle = target.querySelector(".circle-progress"); const radius = circle.r.baseVal.value; const circumference = 2 * Math.PI * radius; const offset = circumference - (percent / 100) * circumference; circle.style.strokeDasharray = `${circumference - offset} ${circumference}`; } $(document).ready(function() { $(".duration-to-minutes[data-duration-in-seconds]").each(function() { const durationInSec = parseInt($(this).data("duration-in-seconds")); const durationInMinutes = Math.floor(durationInSec / 60); const leftSeconds = Math.floor(durationInSec - durationInMinutes * 60); $(this).text(`${durationInMinutes}m ${leftSeconds}s`); }); initCircleProgressBars(); });