UNPKG

dhtmlx-scheduler

Version:

JavaScript event calendar. Allows to manage events and appointments in different views

1,227 lines (1,223 loc) 670 kB
/** @license dhtmlxScheduler v.7.2.3 Standard To use dhtmlxScheduler in non-GPL projects (and get Pro version of the product), please obtain Commercial/Enterprise or Ultimate license on our site https://dhtmlx.com/docs/products/dhtmlxScheduler/#licensing or contact us at sales@dhtmlx.com (c) XB Software Ltd. */ const le = typeof window < "u" ? window : global; function St(e) { let i = [], t = !1, r = null, s = null; function n() { return e.config.drag_highlight && e.markTimespan; } function o(d) { const l = e.getView(d); return l ? l.layout : d; } function _(d) { const { event: l, layout: c, viewName: f, sectionId: m, eventNode: p } = d; (function(v, y) { switch (y) { case "month": v.style.top = "", v.style.left = ""; break; case "timeline": v.style.left = "", v.style.marginLeft = "1px"; break; default: v.style.top = ""; } })(p, c); const h = {}; let u = { start_date: l.start_date, end_date: l.end_date, css: "dhx_scheduler_dnd_marker", html: p }; if (c == "timeline") { const v = e.getView(f); if (v.round_position) { const y = e._get_date_index(v, l.start_date), x = v._trace_x[y]; u.start_date = x; } } return c != "timeline" && c != "month" || (u = { ...u, end_date: e.date.add(l.start_date, 1, "minute") }), m && (h[f] = m, u.sections = h), u; } function a(d) { const { layout: l } = d; let c; switch (l) { case "month": c = function(f) { let m = []; const { event: p, layout: h, viewName: u, sectionId: v } = f, y = []; let x = new Date(p.start_date); for (; x.valueOf() < p.end_date.valueOf(); ) { let k = { start_date: x }; y.push(k), x = e.date.week_start(e.date.add(x, 1, "week")); } let D = e.$container.querySelectorAll(`[${e.config.event_attribute}='${p.id}']`); for (let k = 0; k < D.length; k++) { const S = { event: y[k], layout: h, viewName: u, sectionId: v, eventNode: D[k].cloneNode(!0) }; m.push(_(S)); } return m; }(d); break; case "timeline": case "units": c = function(f) { let m = []; const { event: p, layout: h, viewName: u, eventNode: v } = f; let y = function(x) { const D = e.getView(x); return D.y_property ? D.y_property : D.map_to ? D.map_to : void 0; }(u); if (y) { const x = String(p[y]).split(e.config.section_delimiter).map((k) => String(k)), D = []; for (let k = 0; k < x.length; k++) { D[k] = v.cloneNode(!0); const S = { event: p, layout: h, viewName: u, sectionId: x[k], eventNode: D[k] }; m.push(_(S)); } } return m; }(d); break; default: c = function(f) { const { event: m, layout: p, viewName: h, sectionId: u } = f; let v = [], y = e.$container.querySelectorAll(`[${e.config.event_attribute}='${m.id}']:not(.dhx_cal_select_menu):not(.dhx_drag_marker)`); if (y) for (let x = 0; x < y.length; x++) { let D = y[x].cloneNode(!0); const k = { event: { start_date: /* @__PURE__ */ new Date(+D.getAttribute("data-bar-start")), end_date: /* @__PURE__ */ new Date(+D.getAttribute("data-bar-end")) }, layout: p, viewName: h, sectionId: u, eventNode: D }; v.push(_(k)); } return v; }(d); } c.forEach((f) => { i.push(e.markTimespan(f)); }); } e.attachEvent("onBeforeDrag", function(d, l, c) { return n() && (t = !0, s = e.getEvent(d), r = c.target.closest(`[${e.config.event_attribute}]`), o(e.getState().mode) == "units" && e.config.cascade_event_display && (e.unselect(d), r = c.target.closest(`[${e.config.event_attribute}]`))), !0; }), e.attachEvent("onEventDrag", function(d, l, c) { if (t && n()) { t = !1; const f = e.getState().mode, m = o(f), p = e.getActionData(c).section; s && a({ event: s, layout: m, viewName: f, sectionId: p, eventNode: r }); } }), e.attachEvent("onDragEnd", function(d, l, c) { for (let f = 0; f < i.length; f++) e.unmarkTimespan(i[f]); i = [], r = null, s = null; }); } function Mt(e) { e.config.mark_now = !0, e.config.display_marked_timespans = !0, e.config.overwrite_marked_timespans = !0; var i = "dhx_time_block", t = "default", r = function(n, o, _) { var a = typeof n == "object" ? n : { days: n }; return a.type = i, a.css = "", o && (_ && (a.sections = _), a = function(d, l, c) { return l instanceof Date && c instanceof Date ? (d.start_date = l, d.end_date = c) : (d.days = l, d.zones = c), d; }(a, n, o)), a; }; function s(n, o, _, a, d) { var l = e, c = [], f = { _props: "map_to", matrix: "y_property" }; for (var m in f) { var p = f[m]; if (l[m]) for (var h in l[m]) { var u = l[m][h][p]; n[u] && (c = l._add_timespan_zones(c, e._get_blocked_zones(o[h], n[u], _, a, d))); } } return c = l._add_timespan_zones(c, e._get_blocked_zones(o, "global", _, a, d)); } e.blockTime = function(n, o, _) { var a = r(n, o, _); return e.addMarkedTimespan(a); }, e.unblockTime = function(n, o, _) { var a = r(n, o = o || "fullday", _); return e.deleteMarkedTimespan(a); }, e.checkInMarkedTimespan = function(n, o, _) { o = o || t; for (var a = !0, d = new Date(n.start_date.valueOf()), l = e.date.add(d, 1, "day"), c = e._marked_timespans; d < n.end_date; d = e.date.date_part(l), l = e.date.add(d, 1, "day")) { var f = +e.date.date_part(new Date(d)), m = s(n, c, d.getDay(), f, o); if (m) for (var p = 0; p < m.length; p += 2) { var h = e._get_zone_minutes(d), u = n.end_date > l || n.end_date.getDate() != d.getDate() ? 1440 : e._get_zone_minutes(n.end_date), v = m[p], y = m[p + 1]; if (v < u && y > h && !(a = typeof _ == "function" && _(n, h, u, v, y))) break; } } return !a; }, e.checkLimitViolation = function(n) { if (!n || !e.config.check_limits) return !0; var o = e, _ = o.config, a = []; if (n.rec_type && n._end_date || n.rrule) { const m = n._end_date || n.end_date; return !_.limit_start || !_.limit_end || m.valueOf() >= _.limit_start.valueOf() && n.start_date.valueOf() <= _.limit_end.valueOf(); } a = [n]; for (var d = !0, l = 0; l < a.length; l++) { var c = !0, f = a[l]; f._timed = e.isOneDayEvent(f), (c = !_.limit_start || !_.limit_end || f.start_date.valueOf() >= _.limit_start.valueOf() && f.end_date.valueOf() <= _.limit_end.valueOf()) && (c = !e.checkInMarkedTimespan(f, i, function(m, p, h, u, v) { var y = !0; return p <= v && p >= u && ((v == 1440 || h <= v) && (y = !1), m._timed && o._drag_id && o._drag_mode == "new-size" ? (m.start_date.setHours(0), m.start_date.setMinutes(v)) : y = !1), (h >= u && h <= v || p < u && h > v) && (m._timed && o._drag_id && o._drag_mode == "new-size" ? (m.end_date.setHours(0), m.end_date.setMinutes(u)) : y = !1), y; })), c || (c = o.checkEvent("onLimitViolation") ? o.callEvent("onLimitViolation", [f.id, f]) : c), d = d && c; } return d || (o._drag_id = null, o._drag_mode = null), d; }, e._get_blocked_zones = function(n, o, _, a, d) { var l = []; if (n && n[o]) for (var c = n[o], f = this._get_relevant_blocked_zones(_, a, c, d), m = 0; m < f.length; m++) l = this._add_timespan_zones(l, f[m].zones); return l; }, e._get_relevant_blocked_zones = function(n, o, _, a) { var d; return e.config.overwrite_marked_timespans ? d = _[o] && _[o][a] ? _[o][a] : _[n] && _[n][a] ? _[n][a] : [] : (d = [], _[o] && _[o][a] && (d = d.concat(_[o][a])), _[n] && _[n][a] && (d = d.concat(_[n][a]))), d; }, e._mark_now = function(n) { var o = "dhx_now_time"; this._els[o] || (this._els[o] = []); var _ = e._currentDate(), a = this.config; if (e._remove_mark_now(), !n && a.mark_now && _ < this._max_date && _ > this._min_date && _.getHours() >= a.first_hour && _.getHours() < a.last_hour) { var d = this.locate_holder_day(_); this._els[o] = e._append_mark_now(d, _); } }, e._append_mark_now = function(n, o) { var _ = "dhx_now_time", a = e._get_zone_minutes(o), d = { zones: [a, a + 1], css: _, type: _ }; if (!this._table_view) { if (this._props && this._props[this._mode]) { var l, c, f = this._props[this._mode], m = f.size || f.options.length; f.days > 1 ? (f.size && f.options.length && (n = (f.position + n) / f.options.length * f.size), l = n, c = n + m) : c = (l = 0) + m; for (var p = [], h = l; h < c; h++) { var u = h; d.days = u; var v = e._render_marked_timespan(d, null, u)[0]; p.push(v); } return p; } return d.days = n, e._render_marked_timespan(d, null, n); } if (this._mode == "month") return d.days = +e.date.date_part(o), e._render_marked_timespan(d, null, null); }, e._remove_mark_now = function() { for (var n = "dhx_now_time", o = this._els[n], _ = 0; _ < o.length; _++) { var a = o[_], d = a.parentNode; d && d.removeChild(a); } this._els[n] = []; }, e._marked_timespans = { global: {} }, e._get_zone_minutes = function(n) { return 60 * n.getHours() + n.getMinutes(); }, e._prepare_timespan_options = function(n) { var o = [], _ = []; if (n.days == "fullweek" && (n.days = [0, 1, 2, 3, 4, 5, 6]), n.days instanceof Array) { for (var a = n.days.slice(), d = 0; d < a.length; d++) { var l = e._lame_clone(n); l.days = a[d], o.push.apply(o, e._prepare_timespan_options(l)); } return o; } if (!n || !(n.start_date && n.end_date && n.end_date > n.start_date || n.days !== void 0 && n.zones) && !n.type) return o; n.zones == "fullday" && (n.zones = [0, 1440]), n.zones && n.invert_zones && (n.zones = e.invertZones(n.zones)), n.id = e.uid(), n.css = n.css || "", n.type = n.type || t; var c = n.sections; if (c) { for (var f in c) if (c.hasOwnProperty(f)) { var m = c[f]; for (m instanceof Array || (m = [m]), d = 0; d < m.length; d++) (D = e._lame_copy({}, n)).sections = {}, D.sections[f] = m[d], _.push(D); } } else _.push(n); for (var p = 0; p < _.length; p++) { var h = _[p], u = h.start_date, v = h.end_date; if (u && v) for (var y = e.date.date_part(new Date(u)), x = e.date.add(y, 1, "day"); y < v; ) { var D; delete (D = e._lame_copy({}, h)).start_date, delete D.end_date, D.days = y.valueOf(); var k = u > y ? e._get_zone_minutes(u) : 0, S = v > x || v.getDate() != y.getDate() ? 1440 : e._get_zone_minutes(v); D.zones = [k, S], o.push(D), y = x, x = e.date.add(x, 1, "day"); } else h.days instanceof Date && (h.days = e.date.date_part(h.days).valueOf()), h.zones = n.zones.slice(), o.push(h); } return o; }, e._get_dates_by_index = function(n, o, _) { var a = []; o = e.date.date_part(new Date(o || e._min_date)), _ = new Date(_ || e._max_date); for (var d = o.getDay(), l = n - d >= 0 ? n - d : 7 - o.getDay() + n, c = e.date.add(o, l, "day"); c < _; c = e.date.add(c, 1, "week")) a.push(c); return a; }, e._get_css_classes_by_config = function(n) { var o = []; return n.type == i && (o.push(i), n.css && o.push(i + "_reset")), o.push("dhx_marked_timespan", n.css), o.join(" "); }, e._get_block_by_config = function(n) { var o = document.createElement("div"); return n.html && (typeof n.html == "string" ? o.innerHTML = n.html : o.appendChild(n.html)), o; }, e._render_marked_timespan = function(n, o, _) { var a = [], d = e.config, l = this._min_date, c = this._max_date, f = !1; if (!d.display_marked_timespans) return a; if (!_ && _ !== 0) { if (n.days < 7) _ = n.days; else { var m = new Date(n.days); if (f = +m, !(+c > +m && +l <= +m)) return a; _ = m.getDay(); } var p = l.getDay(); p > _ ? _ = 7 - (p - _) : _ -= p; } var h = n.zones, u = e._get_css_classes_by_config(n); if (e._table_view && e._mode == "month") { var v = [], y = []; if (o) v.push(o), y.push(_); else { y = f ? [f] : e._get_dates_by_index(_); for (var x = 0; x < y.length; x++) v.push(this._scales[y[x]]); } for (x = 0; x < v.length; x++) { o = v[x], _ = y[x]; var D = this.locate_holder_day(_, !1) % this._cols.length; if (!this._ignores[D]) { var k = e._get_block_by_config(n); k.className = u, k.style.top = "0px", k.style.height = "100%"; for (var S = 0; S < h.length; S += 2) { var M = h[x]; if ((E = h[x + 1]) <= M) return []; (N = k.cloneNode(!0)).style.left = "0px", N.style.width = "100%", o.appendChild(N), a.push(N); } } } } else { var g = _; if (this._ignores[this.locate_holder_day(_, !1)]) return a; if (this._props && this._props[this._mode] && n.sections && n.sections[this._mode]) { var b = this._props[this._mode]; g = b.order[n.sections[this._mode]]; var w = b.order[n.sections[this._mode]]; b.days > 1 ? g = g * (b.size || b.options.length) + w : (g = w, b.size && g > b.position + b.size && (g = 0)); } for (o = o || e.locate_holder(g), x = 0; x < h.length; x += 2) { var E, N; if (M = Math.max(h[x], 60 * d.first_hour), (E = Math.min(h[x + 1], 60 * d.last_hour)) <= M) { if (x + 2 < h.length) continue; return []; } (N = e._get_block_by_config(n)).className = u; var T = 24 * this.config.hour_size_px + 1, A = 36e5; N.style.top = Math.round((60 * M * 1e3 - this.config.first_hour * A) * this.config.hour_size_px / A) % T + "px", N.style.height = Math.max(Math.round(60 * (E - M) * 1e3 * this.config.hour_size_px / A) % T, 1) + "px", o.appendChild(N), a.push(N); } } return a; }, e._mark_timespans = function() { var n = this._els.dhx_cal_data[0], o = []; if (e._table_view && e._mode == "month") for (var _ in this._scales) { var a = /* @__PURE__ */ new Date(+_); o.push.apply(o, e._on_scale_add_marker(this._scales[_], a)); } else { a = new Date(e._min_date); for (var d = 0, l = n.childNodes.length; d < l; d++) { var c = n.childNodes[d]; c.firstChild && e._getClassName(c.firstChild).indexOf("dhx_scale_hour") > -1 || (o.push.apply(o, e._on_scale_add_marker(c, a)), a = e.date.add(a, 1, "day")); } } return o; }, e.markTimespan = function(n) { if (!this._els) throw new Error("`scheduler.markTimespan` can't be used before scheduler initialization. Place `scheduler.markTimespan` call after `scheduler.init`."); var o = !1; this._els.dhx_cal_data || (e.get_elements(), o = !0); var _ = e._marked_timespans_ids, a = e._marked_timespans_types, d = e._marked_timespans; e.deleteMarkedTimespan(), e.addMarkedTimespan(n); var l = e._mark_timespans(); return o && (e._els = []), e._marked_timespans_ids = _, e._marked_timespans_types = a, e._marked_timespans = d, l; }, e.unmarkTimespan = function(n) { if (n) for (var o = 0; o < n.length; o++) { var _ = n[o]; _.parentNode && _.parentNode.removeChild(_); } }, e._addMarkerTimespanConfig = function(n) { var o = "global", _ = e._marked_timespans, a = n.id, d = e._marked_timespans_ids; d[a] || (d[a] = []); var l = n.days, c = n.sections, f = n.type; if (n.id = a, c) { for (var m in c) if (c.hasOwnProperty(m)) { _[m] || (_[m] = {}); var p = c[m], h = _[m]; h[p] || (h[p] = {}), h[p][l] || (h[p][l] = {}), h[p][l][f] || (h[p][l][f] = [], e._marked_timespans_types || (e._marked_timespans_types = {}), e._marked_timespans_types[f] || (e._marked_timespans_types[f] = !0)); var u = h[p][l][f]; n._array = u, u.push(n), d[a].push(n); } } else _[o][l] || (_[o][l] = {}), _[o][l][f] || (_[o][l][f] = []), e._marked_timespans_types || (e._marked_timespans_types = {}), e._marked_timespans_types[f] || (e._marked_timespans_types[f] = !0), u = _[o][l][f], n._array = u, u.push(n), d[a].push(n); }, e._marked_timespans_ids = {}, e.addMarkedTimespan = function(n) { var o = e._prepare_timespan_options(n); if (o.length) { for (var _ = o[0].id, a = 0; a < o.length; a++) e._addMarkerTimespanConfig(o[a]); return _; } }, e._add_timespan_zones = function(n, o) { var _ = n.slice(); if (o = o.slice(), !_.length) return o; for (var a = 0; a < _.length; a += 2) for (var d = _[a], l = _[a + 1], c = a + 2 == _.length, f = 0; f < o.length; f += 2) { var m = o[f], p = o[f + 1]; if (p > l && m <= l || m < d && p >= d) _[a] = Math.min(d, m), _[a + 1] = Math.max(l, p), a -= 2; else { if (!c) continue; var h = d > m ? 0 : 2; _.splice(a + h, 0, m, p); } o.splice(f--, 2); break; } return _; }, e._subtract_timespan_zones = function(n, o) { for (var _ = n.slice(), a = 0; a < _.length; a += 2) for (var d = _[a], l = _[a + 1], c = 0; c < o.length; c += 2) { var f = o[c], m = o[c + 1]; if (m > d && f < l) { var p = !1; d >= f && l <= m && _.splice(a, 2), d < f && (_.splice(a, 2, d, f), p = !0), l > m && _.splice(p ? a + 2 : a, p ? 0 : 2, m, l), a -= 2; break; } } return _; }, e.invertZones = function(n) { return e._subtract_timespan_zones([0, 1440], n.slice()); }, e._delete_marked_timespan_by_id = function(n) { var o = e._marked_timespans_ids[n]; if (o) { for (var _ = 0; _ < o.length; _++) for (var a = o[_], d = a._array, l = 0; l < d.length; l++) if (d[l] == a) { d.splice(l, 1); break; } } }, e._delete_marked_timespan_by_config = function(n) { var o, _ = e._marked_timespans, a = n.sections, d = n.days, l = n.type || t; if (a) { for (var c in a) if (a.hasOwnProperty(c) && _[c]) { var f = a[c]; _[c][f] && (o = _[c][f]); } } else o = _.global; if (o) { if (d !== void 0) o[d] && o[d][l] && (e._addMarkerTimespanConfig(n), e._delete_marked_timespans_list(o[d][l], n)); else for (var m in o) if (o[m][l]) { var p = e._lame_clone(n); n.days = m, e._addMarkerTimespanConfig(p), e._delete_marked_timespans_list(o[m][l], n); } } }, e._delete_marked_timespans_list = function(n, o) { for (var _ = 0; _ < n.length; _++) { var a = n[_], d = e._subtract_timespan_zones(a.zones, o.zones); if (d.length) a.zones = d; else { n.splice(_, 1), _--; for (var l = e._marked_timespans_ids[a.id], c = 0; c < l.length; c++) if (l[c] == a) { l.splice(c, 1); break; } } } }, e.deleteMarkedTimespan = function(n) { if (arguments.length || (e._marked_timespans = { global: {} }, e._marked_timespans_ids = {}, e._marked_timespans_types = {}), typeof n != "object") e._delete_marked_timespan_by_id(n); else { n.start_date && n.end_date || (n.days !== void 0 || n.type || (n.days = "fullweek"), n.zones || (n.zones = "fullday")); var o = []; if (n.type) o.push(n.type); else for (var _ in e._marked_timespans_types) o.push(_); for (var a = e._prepare_timespan_options(n), d = 0; d < a.length; d++) for (var l = a[d], c = 0; c < o.length; c++) { var f = e._lame_clone(l); f.type = o[c], e._delete_marked_timespan_by_config(f); } } }, e._get_types_to_render = function(n, o) { var _ = n ? e._lame_copy({}, n) : {}; for (var a in o || {}) o.hasOwnProperty(a) && (_[a] = o[a]); return _; }, e._get_configs_to_render = function(n) { var o = []; for (var _ in n) n.hasOwnProperty(_) && o.push.apply(o, n[_]); return o; }, e._on_scale_add_marker = function(n, o) { if (!e._table_view || e._mode == "month") { var _ = o.getDay(), a = o.valueOf(), d = this._mode, l = e._marked_timespans, c = [], f = []; if (this._props && this._props[d]) { var m = this._props[d], p = m.options, h = p[e._get_unit_index(m, o)]; if (m.days > 1) { var u = Math.round((o - e._min_date) / 864e5), v = m.size || p.length; o = e.date.add(e._min_date, Math.floor(u / v), "day"), o = e.date.date_part(o); } else o = e.date.date_part(new Date(this._date)); if (_ = o.getDay(), a = o.valueOf(), l[d] && l[d][h.key]) { var y = l[d][h.key], x = e._get_types_to_render(y[_], y[a]); c.push.apply(c, e._get_configs_to_render(x)); } } var D = l.global; if (e.config.overwrite_marked_timespans) { var k = D[a] || D[_]; c.push.apply(c, e._get_configs_to_render(k)); } else D[a] && c.push.apply(c, e._get_configs_to_render(D[a])), D[_] && c.push.apply(c, e._get_configs_to_render(D[_])); for (var S = 0; S < c.length; S++) f.push.apply(f, e._render_marked_timespan(c[S], n, o)); return f; } }, e.attachEvent("onScaleAdd", function() { e._on_scale_add_marker.apply(e, arguments); }), e.dblclick_dhx_marked_timespan = function(n, o) { e.callEvent("onScaleDblClick", [e.getActionData(n).date, o, n]), e.config.dblclick_create && e.addEventNow(e.getActionData(n).date, null, n); }; } function Nt(e) { var i = {}, t = !1; function r(a, d) { d = typeof d == "function" ? d : function() { }, i[a] || (i[a] = this[a], this[a] = d); } function s(a) { i[a] && (this[a] = i[a], i[a] = null); } function n(a) { for (var d in a) r.call(this, d, a[d]); } function o() { for (var a in i) s.call(this, a); } function _(a) { try { a(); } catch (d) { window.console.error(d); } } return e.$stateProvider.registerProvider("batchUpdate", function() { return { batch_update: t }; }, !1), function(a, d) { if (t) return void _(a); var l, c = this._dp && this._dp.updateMode != "off"; c && (l = this._dp.updateMode, this._dp.setUpdateMode("off")); const f = { setModeDate: { date: null, mode: null }, needRender: !1, needUpdateView: !1, repaintEvents: {} }, m = (h, u) => { h && (f.setModeDate.date = h), u && (f.setModeDate.mode = u); }; var p = { render: (h, u) => { f.needRender = !0, m(h, u); }, setCurrentView: (h, u) => { f.needRender = !0, m(h, u); }, updateView: (h, u) => { f.needUpdateView = !0, m(h, u); }, render_data: () => f.needRender = !0, render_view_data: (h) => { h && h.length ? h.forEach((u) => f.repaintEvents[u.id] = !0) : f.needRender = !0; } }; if (n.call(this, p), t = !0, this.callEvent("onBeforeBatchUpdate", []), _(a), this.callEvent("onAfterBatchUpdate", []), o.call(this), t = !1, !d) if (f.needRender) e.render(f.setModeDate.date, f.setModeDate.mode); else if (f.needUpdateView) e.updateView(f.setModeDate.date, f.setModeDate.mode); else for (const h in f.repaintEvents) e.updateEvent(h); c && (this._dp.setUpdateMode(l), this._dp.sendData()); }; } class Tt { constructor(i) { const { url: t, token: r } = i; this._url = t, this._token = r, this._mode = 1, this._seed = 1, this._queue = [], this.data = {}, this.api = {}, this._events = {}; } headers() { return { Accept: "application/json", "Content-Type": "application/json", "Remote-Token": this._token }; } fetch(i, t) { const r = { credentials: "include", headers: this.headers() }; return t && (r.method = "POST", r.body = t), fetch(i, r).then((s) => s.json()); } load(i) { return i && (this._url = i), this.fetch(this._url).then((t) => this.parse(t)); } parse(i) { const { key: t, websocket: r } = i; t && (this._token = i.key); for (const s in i.data) this.data[s] = i.data[s]; for (const s in i.api) { const n = this.api[s] = {}, o = i.api[s]; for (const _ in o) n[_] = this._wrapper(s + "." + _); } return r && this.connect(), this; } connect() { const i = this._socket; i && (this._socket = null, i.onclose = function() { }, i.close()), this._mode = 2, this._socket = function(t, r, s, n) { let o = r; o[0] === "/" && (o = document.location.protocol + "//" + document.location.host + r), o = o.replace(/^http(s|):/, "ws$1:"); const _ = o.indexOf("?") != -1 ? "&" : "?"; o = `${o}${_}token=${s}&ws=1`; const a = new WebSocket(o); return a.onclose = () => setTimeout(() => t.connect(), 2e3), a.onmessage = (d) => { const l = JSON.parse(d.data); switch (l.action) { case "result": t.result(l.body, []); break; case "event": t.fire(l.body.name, l.body.value); break; case "start": n(); break; default: t.onError(l.data); } }, a; }(this, this._url, this._token, () => (this._mode = 3, this._send(), this._resubscribe(), this)); } _wrapper(i) { return (function() { const t = [].slice.call(arguments); let r = null; const s = new Promise((n, o) => { r = { data: { id: this._uid(), name: i, args: t }, status: 1, resolve: n, reject: o }, this._queue.push(r); }); return this.onCall(r, s), this._mode === 3 ? this._send(r) : setTimeout(() => this._send(), 1), s; }).bind(this); } _uid() { return (this._seed++).toString(); } _send(i) { if (this._mode == 2) return void setTimeout(() => this._send(), 100); const t = i ? [i] : this._queue.filter((s) => s.status === 1); if (!t.length) return; const r = t.map((s) => (s.status = 2, s.data)); this._mode !== 3 ? this.fetch(this._url, JSON.stringify(r)).catch((s) => this.onError(s)).then((s) => this.result(s, r)) : this._socket.send(JSON.stringify({ action: "call", body: r })); } result(i, t) { const r = {}; if (i) for (let s = 0; s < i.length; s++) r[i[s].id] = i[s]; else for (let s = 0; s < t.length; s++) r[t[s].id] = { id: t[s].id, error: "Network Error", data: null }; for (let s = this._queue.length - 1; s >= 0; s--) { const n = this._queue[s], o = r[n.data.id]; o && (this.onResponse(n, o), o.error ? n.reject(o.error) : n.resolve(o.data), this._queue.splice(s, 1)); } } on(i, t) { const r = this._uid(); let s = this._events[i]; const n = !!s; return n || (s = this._events[i] = []), s.push({ id: r, handler: t }), n || this._mode != 3 || this._socket.send(JSON.stringify({ action: "subscribe", name: i })), { name: i, id: r }; } _resubscribe() { if (this._mode == 3) for (const i in this._events) this._socket.send(JSON.stringify({ action: "subscribe", name: i })); } detach(i) { if (!i) { if (this._mode == 3) for (const n in this._events) this._socket.send(JSON.stringify({ action: "unsubscribe", key: n })); return void (this._events = {}); } const { id: t, name: r } = i, s = this._events[r]; if (s) { const n = s.filter((o) => o.id != t); n.length ? this._events[r] = n : (delete this._events[r], this._mode == 3 && this._socket.send(JSON.stringify({ action: "unsubscribe", name: r }))); } } fire(i, t) { const r = this._events[i]; if (r) for (let s = 0; s < r.length; s++) r[s].handler(t); } onError(i) { return null; } onCall(i, t) { } onResponse(i, t) { } } class At { constructor(i, t) { const r = new Tt({ url: i, token: t }); r.fetch = function(s, n) { const o = { headers: this.headers() }; return n && (o.method = "POST", o.body = n), fetch(s, o).then((_) => _.json()); }, this._ready = r.load().then((s) => this._remote = s); } ready() { return this._ready; } on(i, t) { this.ready().then((r) => { if (typeof i == "string") r.on(i, t); else for (const s in i) r.on(s, i[s]); }); } } function Ct(e) { function i(r, s) { switch (r) { case "add-event": (function(n) { if (e.getEvent(n.id)) return void console.warn(`Event with ID ${n.id} already exists. Skipping add.`); n.start_date = e.templates.parse_date(n.start_date), n.end_date = e.templates.parse_date(n.end_date), n.original_start && (n.original_start = e.templates.parse_date(n.original_start)), t(() => { e.addEvent(n); }); })(s); break; case "update-event": (function(n) { const o = n.id; if (!e.getEvent(o)) return void console.warn(`Event with ID ${o} does not exist. Skipping update.`); const _ = e.getEvent(o); t(() => { for (let a in n) a !== "start_date" && a !== "end_date" && (_[a] = n[a]); _.start_date = e.templates.parse_date(n.start_date), _.end_date = e.templates.parse_date(n.end_date), n.original_start && (n.original_start = e.templates.parse_date(n.original_start)), e.callEvent("onEventChanged", [o, _]), e.updateEvent(o), o !== n.id && e.changeEventId(o, n.id); }); })(s); break; case "delete-event": (function(n) { const o = n.id; if (!e.getEvent(o)) return void (n.event_pid && t(() => { e.addEvent(n); })); t(() => { const _ = e.getEvent(o); if (_) { if (_.rec_type || _.rrule) { e._roll_back_dates(_); const a = e._get_rec_markers(o); for (const d in a) e.getEvent(d) && e.deleteEvent(d, !0); } if (e.getState().lightbox_id == o && (this._new_event = this._lightbox_id, n.id = this._lightbox_id, this._events[this._lightbox_id] = n, e.callEvent("onLiveUpdateCollision", [o, null, "delete", n]) === !1)) return void e.endLightbox(!1, e._lightbox); e.deleteEvent(o, !0); } }); })(s); } } function t(r) { e._dp ? e._dp.ignore(r) : r(); } return { events: function(r) { if (!r || !r.event || !r.event.id) return void console.error("Invalid message format:", r); const { type: s, event: n } = r; if (!e._dp._in_progress[n.id]) { if (s === "add-event") { for (const o in e._dp._in_progress) if (e._dp.getState(o) === "inserted") return void e._dp.attachEvent("onFullSync", function() { e.getEvent(n.id) || i(s, n); }, { once: !0 }); } i(s, n); } } }; } function Ot(e) { (function(i) { const t = {}; i.attachEvent("onConfirmedBeforeEventDelete", function(r) { return t[r] = !0, !0; }), i.attachEvent("onEventDeleted", function(r, s) { if (!t[r]) return; delete t[r]; let n = i.copy(s); i.config.undo_deleted && !i.getState().new_event && i.message({ text: `<div class="dhx_info_message"> <span class="undo_popup_text">Event deleted</span> <button class="undo_button" data-deleted-event-id="${s.id}">Undo</button> </div>`, expire: 1e4, type: "popup_after_delete", callback: function(o) { o.target.closest(`[data-deleted-event-id="${s.id}"]`) && (n.rrule && n.duration && (n.end_date = new Date(n.start_date.valueOf() + 1e3 * n.duration), i.addEvent(n)), i.addEvent(n), i.render()); } }); }); })(e), St(e), Mt(e), function(i) { i.batchUpdate = Nt(i); }(e), function(i) { i.ext || (i.ext = {}), i.ext.liveUpdates = { RemoteEvents: At, remoteUpdates: Ct(i) }; }(e); } var Lt = Date.now(); function Te(e) { return !(!e || typeof e != "object") && !!(e.getFullYear && e.getMonth && e.getDate); } const ne = { uid: function() { return Lt++; }, mixin: function(e, i, t) { for (var r in i) (e[r] === void 0 || t) && (e[r] = i[r]); return e; }, copy: function e(i) { var t, r, s; if (i && typeof i == "object") switch (!0) { case Te(i): r = new Date(i); break; case (s = i, Array.isArray ? Array.isArray(s) : s && s.length !== void 0 && s.pop && s.push): for (r = new Array(i.length), t = 0; t < i.length; t++) r[t] = e(i[t]); break; case function(n) { return n && typeof n == "object" && Function.prototype.toString.call(n.constructor) === "function String() { [native code] }"; }(i): r = new String(i); break; case function(n) { return n && typeof n == "object" && Function.prototype.toString.call(n.constructor) === "function Number() { [native code] }"; }(i): r = new Number(i); break; case function(n) { return n && typeof n == "object" && Function.prototype.toString.call(n.constructor) === "function Boolean() { [native code] }"; }(i): r = new Boolean(i); break; default: for (t in r = {}, i) { const n = typeof i[t]; n === "string" || n === "number" || n === "boolean" ? r[t] = i[t] : Te(i[t]) ? r[t] = new Date(i[t]) : Object.prototype.hasOwnProperty.apply(i, [t]) && (r[t] = e(i[t])); } } return r || i; }, defined: function(e) { return e !== void 0; }, isDate: Te, delay: function(e, i) { var t, r = function() { r.$cancelTimeout(), r.$pending = !0; var s = Array.prototype.slice.call(arguments); t = setTimeout(function() { e.apply(this, s), r.$pending = !1; }, i); }; return r.$pending = !1, r.$cancelTimeout = function() { clearTimeout(t), r.$pending = !1; }, r.$execute = function() { var s = Array.prototype.slice.call(arguments); e.apply(this, s), r.$cancelTimeout(); }, r; } }; function $t(e) { function i(p) { var h = document.createElement("div"); return (p || "").split(" ").forEach(function(u) { h.classList.add(u); }), h; } var t = function() { return i("dhx_cal_navbar_rows_container"); }, r = function() { return i("dhx_cal_navbar_row"); }, s = function(p) { var h = i("dhx_cal_tab"); return h.setAttribute("name", p.view + "_tab"), h.setAttribute("data-tab", p.view), e.config.fix_tab_position && (p.$firstTab ? h.classList.add("dhx_cal_tab_first") : p.$lastTab ? h.classList.add("dhx_cal_tab_last") : p.view !== "week" && h.classList.add("dhx_cal_tab_standalone"), p.$segmentedTab && h.classList.add("dhx_cal_tab_segmented")), h; }, n = function() { return i("dhx_cal_date"); }, o = function(p) { return i("dhx_cal_nav_button dhx_cal_nav_button_custom dhx_cal_tab"); }, _ = function(p) { return i("dhx_cal_" + p.view + "_button dhx_cal_nav_button"); }, a = function() { return i("dhx_cal_line_spacer"); }, d = function(p) { var h = i("dhx_minical_icon"); return p.click || h.$_eventAttached || e.event(h, "click", function() { e.isCalendarVisible() ? e.destroyCalendar() : e.renderCalendar({ position: this, date: e.getState().date, navigation: !0, handler: function(u, v) { e.setCurrentView(u), e.destroyCalendar(); } }); }), h; }; function l(p) { var h = function(y) { var x; if (y.view) switch (y.view) { case "today": case "next": case "prev": x = _; break; case "date": x = n; break; case "spacer": x = a; break; case "button": x = o; break; case "minicalendar": x = d; break; default: x = s; } else y.rows ? x = t : y.cols && (x = r); return x; }(p); if (h) { var u = h(p); if (p.css && u.classList.add(p.css), p.width && ((v = p.width) === 1 * v && (v += "px"), u.style.width = v), p.height && ((v = p.height) === 1 * v && (v += "px"), u.style.height = v), p.click && e.event(u, "click", p.click), p.html && (u.innerHTML = p.html), p.align) { var v = ""; p.align == "right" ? v = "flex-end" : p.align == "left" && (v = "flex-start"), u.style.justifyContent = v; } return u; } } function c(p) { return typeof p == "string" && (p = { view: p }), p.view || p.rows || p.cols || (p.view = "button"), p; } function f(p) { var h, u = document.createDocumentFragment(); h = Array.isArray(p) ? p : [p]; for (var v = 0; v < h.length; v++) { var y, x = c(h[v]); x.view === "day" && h[v + 1] && ((y = c(h[v + 1])).view !== "week" && y.view !== "month" || (x.$firstTab = !0, x.$segmentedTab = !0)), x.view === "week" && h[v - 1] && ((y = c(h[v + 1])).view !== "week" && y.view !== "month" || (x.$segmentedTab = !0)), x.view === "month" && h[v - 1] && ((y = c(h[v - 1])).view !== "week" && y.view !== "day" || (x.$lastTab = !0, x.$segmentedTab = !0)); var D = l(x); u.appendChild(D), (x.cols || x.rows) && D.appendChild(f(x.cols || x.rows)); } return u; } e._init_nav_bar = function(p) { var h = this.$container.querySelector(".dhx_cal_navline"); return h || ((h = document.createElement("div")).className = "dhx_cal_navline dhx_cal_navline_flex", e._update_nav_bar(p, h), h); }; var m = null; e._update_nav_bar = function(p, h) { if (p) { var u = !1, v = p.height || e.xy.nav_height; m !== null && m === v || (u = !0), u && (e.xy.nav_height = v), h.innerHTML = "", h.appendChild(f(p)), e.unset_actions(), e._els = [], e.get_elements(), e.set_actions(), h.style.display = v === 0 ? "none" : "", m = v; } }; } function Ht(e) { function i(n) { return n.isConnected !== void 0 ? n.isConnected : document.body.contains(n); } function t(n) { return { w: n.innerWidth || document.documentElement.clientWidth, h: n.innerHeight || document.documentElement.clientHeight }; } function r(n, o) { var _, a = t(o); n.event(o, "resize", function() { clearTimeout(_), _ = setTimeout(function() { if (i(n.$container) && !n.$destroyed) { var d, l, c = t(o); l = c, ((d = a).w != l.w || d.h != l.h) && (a = c, s(n)); } }, 150); }); } function s(n) { n.$initialized && !n.$destroyed && n.$root && i(n.$root) && n.callEvent("onSchedulerResize", []) && (n.updateView(), n.callEvent("onAfterSchedulerResize", [])); } (function(n) { var o = n.$container; if (window.getComputedStyle(o).getPropertyValue("position") == "static" && (o.style.position = "relative"), window.ResizeObserver) { let a = !0; const d = new ResizeObserver(function(l) { a ? a = !1 : s(n); }); d.observe(o), n.attachEvent("onDestroy", function() { d.unobserve(o); }); } else { var _ = document.createElement("iframe"); _.className = "scheduler_container_resize_watcher", _.tabIndex = -1, n.config.wai_aria_attributes && (_.setAttribute("role", "none"), _.setAttribute("aria-hidden", !0)), window.Sfdc || window.$A || window.Aura ? function(a) { var d = a.$root.offsetHeight, l = a.$root.offsetWidth; (function c() { a.$destroyed || (a.$root && (a.$root.offsetHeight == d && a.$root.offsetWidth == l || s(a), d = a.$root.offsetHeight, l = a.$root.offsetWidth), setTimeout(c, 200)); })(); }(n) : (o.appendChild(_), _.contentWindow ? r(n, _.contentWindow) : (o.removeChild(_), r(n, window))); } })(e); } class zt { constructor() { this._silent_mode = !1, this.listeners = {}; } _silentStart() { this._silent_mode = !0; } _silentEnd() { this._silent_mode = !1; } } function Ve(e) { const i = new zt(); e.attachEvent = function(t, r, s) { t = "ev_" + t.toLowerCase(), i.listeners[t] || (i.listeners[t] = function(o) { let _ = {}, a = 0; const d = function() { let l = !0; for (const c in _) { const f = _[c].apply(o, arguments); l = l && f; } return l; }; return d.addEvent = function(l, c) { if (typeof l == "function") { let f; if (c && c.id ? f = c.id : (f = a, a++), c && c.once) { const m = l; l = function() { m(), d.removeEvent(f); }; } return _[f] = l, f; } return !1; }, d.removeEvent = function(l) { delete _[l]; }, d.clear = function() { _ = {}; }, d; }(this)), s && s.thisObject && (r = r.bind(s.thisObject)); let n = t + ":" + i.listeners[t].addEvent(r, s); return s && s.id && (n = s.id), n; }, e.attachAll = function(t) { this.attachEvent("listen_all", t); }, e.callEvent = function(t, r) { if (i._silent_mode) return !0; const s = "ev_" + t.toLowerCase(), n = i.listeners; return n.ev_listen_all && n.ev_listen_all.apply(this, [t].concat(r)), !n[s] || n[s].apply(this, r); }, e.checkEvent = function(t) { return !!i.listeners["ev_" + t.toLowerCase()]; }, e.detachEvent = function(t) { if (t) { let r = i.listeners; for (const n in r) r[n].removeEvent(t); const s = t.split(":"); if (r = i.listeners, s.length === 2) { const n = s[0], o = s[1]; r[n] && r[n].removeEvent(o); } } }, e.detachAllEvents = function() { for (const t in i.listeners) i.listeners[t].clear(); }; } const Ke = { event: function(e, i, t) { e.addEventListener ? e.addEventListener(i, t, !1) : e.attachEvent && e.attachEvent("on" + i, t); }, eventRemove: function(e, i, t) { e.removeEventListener ? e.removeEventListener(i, t, !1) : e.detachEvent && e.detachEvent("on" + i, t); } }; function qt(e) { var i = function() { var t = function(r, s) { r = r || Ke.event, s = s || Ke.eventRemove; var n = [], o = { attach: function(_, a, d, l) { n.push({ element: _, event: a, callback: d, capture: l }), r(_, a, d, l); }, detach: function(_, a, d, l) { s(_, a, d, l); for (var c = 0; c < n.length; c++) { var f = n[c]; f.element === _ && f.event === a && f.callback === d && f.capture === l && (n.splice(c, 1), c--); } }, detachAll: function() { for (var _ = n.slice(), a = 0; a < _.length; a++) { var d = _[a]; o.detach(d.element, d.event, d.callback, d.capture), o.detach(d.element, d.event, d.callback, void 0), o.detach(d.element, d.event, d.callback, !1), o.detach(d.element, d.event, d.callback, !0); } n.splice(0, n.length); }, extend: function() { return t(this.event, this.eventRemove); } }; return o; }; return t(); }(); e.event = i.attach, e.eventRemove = i.detach, e._eventRemoveAll = i.detachAll, e._createDomEventScope = i.extend, e._trim = function(t) { return (String.prototype.trim || function() { return this.replace(/^\s+|\s+$/g, ""); }).apply(t); }, e._isDate = function(t) { return !(!t || typeof t != "object") && !!(t.getFullYear && t.getMonth && t.getDate); }, e._isObject = function(t) { return t && typeof t == "object"; }; } function ft(e) { if (!e) return ""; var i = e.className || ""; return i.baseVal && (i = i.baseVal), i.indexOf || (i = ""), i || ""; } function pt(e, i, t) { t === void 0 && (t = !0); for (var r = e.target || e.srcElement, s = ""; r; ) { if (s = ft(r)) { var n = s.indexOf(i); if (n >= 0) { if (!t) return r; var o = n === 0 || !(s.charAt(n - 1) || "").trim(), _ = n + i.length >= s.length || !s.charAt(n + i.length).trim(); if (o && _) return r; } } r = r.parentNode; } return null; } function jt(e) { var i = !1, t = !1; if (window.getComputedStyle) { var r = window.getComputedStyle(e, null); i = r.display, t = r.visibility; } else e.currentStyle && (i = e.currentStyle.display, t = e.currentStyle.visibility); var s = !1, n = pt({ target: e }, "dhx_form_repeat", !1); return n && (s = n.style.height == "0px"), s = s || !e.offsetHeight, i != "none" && t != "hidden" && !s; } function Rt(e) { return !isNaN(e.getAttribute("tabindex")) && 1 * e.getAttribute("tabindex") >= 0; } function It(e) { return !{ a: !0, area: !0 }[e.nodeName.loLowerCase()] || !!e.getAttribute("href"); } function Pt(e) { return !{ input: !0, select: !0, textarea: !0, button: !0, object: !0 }[e.nodeName.toLowerCase()] || !e.hasAttribute("disabled"); } function vt() { return document.head.createShadowRoot || document.head.attachShadow; } function Ge(e) { if (!e || !vt()) return document.body; for (; e.parentNode && (e = e.parentNode); ) if (e instanceof ShadowRoot) return e.host; return document.body; } const ue = { getAbsoluteLeft: function(e) { return this.getOffset(e).left; }, getAbsoluteTop: function(e) { return this.getOffset(e).top; }, getOffsetSum: function(e) { for (var i = 0, t = 0; e; ) i += parseInt(e.offsetTop), t += parseInt(e.offsetLeft), e = e.offsetParent; return { top: i, left: t }; }, getOffsetRect: function(e) { var i = e.getBoundingClientRect(), t = 0, r = 0; if (/Mobi/.test(navigator.userAgent)) { var s = document.createElement("div"); s.style.position = "absolute", s.style.left = "0px", s.style.top = "0px", s.style.width = "1px", s.style.height = "1px", document.body.appendChild(s); var n = s.getBoundingClientRect(); t = i.top - n.top, r = i.left - n.left, s.parentNode.removeChild(s); } else { var o = document.body, _ = document.documentElement, a = window.pageYOffset || _.scrollTop || o.scrollTop, d = window.pageXOffset || _.scrollLeft || o.scrollLeft, l = _.clientTop || o.clientTop || 0, c = _.clientLeft || o.clientLeft || 0; t = i.top + a - l, r = i.left + d - c; } return { top: Math.round(t), left: Math.round(r) }; }, getOffset: function(e) { return e.getBoundingClientRect ? this.getOffsetRect(e) : this.getOffsetSum(e); }, closest: function(e, i) { return e && i ? $e(e, i) : null; }, insertAfter: function(e, i) { i.nextSibling ? i.parentNode.insertBefore(e, i.nextSibling) : i.parentNode.appendChild(e); }, remove: function(e) { e && e.parentNode && e.parentNode.removeChild(e); }, isChildOf: function(e, i) { return i.contains(e); }, getFocusableNodes: function(e) { for (var i = e.querySelectorAll(["a[href]", "area[href]", "input", "select", "textarea", "button", "iframe", "object", "embed", "[tabindex]", "[contenteditable]"].join(", ")), t = Array.prototype.slice.call(i, 0), r = 0; r < t.length; r++) t[r].$position = r; for (t.sort(function(n, o) { return n.tabIndex === 0 && o.tabIndex !== 0 ? 1 : n.tabIndex !== 0 && o.tabIndex === 0 ? -1 : n.tabIndex === o.tabIndex ? n.$position - o.$position : n.tabIndex < o.tabIndex ? -1 : 1; }), r = 0; r < t.length; r++) { var s = t[r]; (Rt(s) || Pt(s) || It(s)) && jt(s) || (t.splice(r, 1), r--); } return t; }, getClassName: ft, locateCss: pt, getRootNode: Ge, hasShadowParent: function(e) { return !!Ge(e); }, isShadowDomSupported: vt, getActiveElement: function() { var e = document.activeElement; return e.shadowRoot && (e = e.shadowRoot.activeElement), e === document.body && document.getSelection && (e = document.getSelection().focusNode || document.body), e; }, getRelativeEventPosition: function(e, i) { var t = document.documentElement, r = function(s) { var n = 0, o = 0, _ = 0, a = 0; if (s.getBoundingClientRect) { var d = s.getBoundingClientRect(), l = document.body, c = document.documentElement || document.body.parentNode || document.body, f = window.pageYOffset || c.scrollTop || l.scrollTop, m = window.pageXOffset || c.scrollLeft || l.scrollLeft, p = c.clientTop || l.clientTop || 0, h = c.clientLeft || l.clientLeft || 0; n = d.top + f - p, o = d.left + m - h, _ = document.body.offsetWidth - d.right, a = document.body.offsetHeight - d.bottom; } else { for (; s; ) n += parseInt(s.offsetTop, 10), o += parseInt(s.offsetLeft, 10), s = s.offsetParent; _ = document.body.offsetWidth - s.offsetWidth - o, a = document.body.offsetHeight - s.offsetHeight - n; } return { y: Math.round(n), x: Math.round(o), width: s.offsetWidth, height: s.offsetHeight, right: Math.round(_), bottom: Math.round(a) }; }(i); return { x: e.clientX - t.clientLeft - r.x + i.scrollLeft, y: e.clientY - t.clientTop - r.y + i.scrollTop }; }, getTargetNode: function(e) { var i; return e.tagName ? i = e : (i = (e = e || window.event).target || e.srcElement).shadowRoot && e.composedPath && (i = e.composedPath()[0]), i; }, getNodePosition: function(e) { var i = 0, t = 0, r = 0, s = 0; if (e.getBoundingClientRect) { var n = e.getBoundingClientRect(), o = document.body, _ = document.documentElement || document.body.parentNode || document.body, a = window.pageYOffset || _.scrollTop || o.scrollTop, d = window.pageXOffset || _.scrollLeft || o.scroll