/** * Диалог «На какой срок…» для skip/replace/adjustment плана на день. */ (function (global) { function escapeHtml(value) { return String(value ?? "") .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """); } function weekEndIso(planDate) { const parts = String(planDate || "").split("-"); const d = new Date(Number(parts[0]), Number(parts[1]) - 1, Number(parts[2])); const jsDay = d.getDay(); const pyWeekday = jsDay === 0 ? 6 : jsDay - 1; d.setDate(d.getDate() + (6 - pyWeekday)); const y = d.getFullYear(); const m = String(d.getMonth() + 1).padStart(2, "0"); const day = String(d.getDate()).padStart(2, "0"); return `${y}-${m}-${day}`; } function todayIso() { const d = new Date(); return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`; } function dismissOverlays(host, keepSelectors) { host.querySelectorAll(".zt-k-hub-plan-overlay").forEach((el) => { if (keepSelectors.some((sel) => el.matches(sel))) return; el.remove(); }); } /** * @param {object} options * @param {string} options.planDate YYYY-MM-DD * @param {string} [options.title] * @param {HTMLElement} [options.overlayHost] куда монтировать overlay * @param {string[]} [options.keepOverlays] селекторы overlay, которые не закрывать * @param {function} [options.onError] * @param {function} [options.beforeAppend] (overlay) => void — dismiss other overlays */ function promptSkipDuration(options) { const planDate = options.planDate || todayIso(); const title = options.title || "На какой срок исключить?"; const onError = options.onError || function () {}; const host = options.overlayHost || document.body; const keepOverlays = options.keepOverlays || []; return new Promise((resolve) => { const weekEnd = weekEndIso(planDate); const overlay = document.createElement("div"); overlay.className = "zt-k-hub-plan-overlay zt-k-hub-plan-skip-duration"; overlay.innerHTML = '
${escapeHtml(title)}
` + '" + '