From 0ee9b6ad694692df8d17e15bce02284ebb70f517 Mon Sep 17 00:00:00 2001 From: Safwan Samsudeen Date: Thu, 25 Apr 2024 20:28:59 +0530 Subject: [PATCH] feat: auto change view mode, fix multiple bugs --- dist/frappe-gantt.css | 30 ++++++--- dist/frappe-gantt.js | 119 ++++++++++++++++++++++++++-------- dist/frappe-gantt.js.map | 2 +- dist/frappe-gantt.min.css | 2 +- dist/frappe-gantt.min.js | 2 +- dist/frappe-gantt.min.js.map | 2 +- src/gantt.scss | 34 +++++++--- src/index.js | 120 +++++++++++++++++++++++++++-------- 8 files changed, 239 insertions(+), 72 deletions(-) diff --git a/dist/frappe-gantt.css b/dist/frappe-gantt.css index da7787c..e423a3c 100644 --- a/dist/frappe-gantt.css +++ b/dist/frappe-gantt.css @@ -82,16 +82,30 @@ position: absolute; width: fit-content; } -.gantt-container #today-button { - position: sticky; - left: 10px; - top: 5px; - background-color: #2c94ec; - border: none; - color: #fff; +.gantt-container .upper-text { + position: absolute; + width: fit-content; +} +.gantt-container .current-upper { + position: fixed; +} +.gantt-container .side-header { + position: fixed; + padding: 0 10px; + background: white; +} +.gantt-container .today-button, +.gantt-container .viewmode-select { + background-color: #fff; + border: 1px solid black; + color: #111; padding: 4px 10px; font-size: 14px; - border-radius: 2px; + border-radius: 5px; +} +.gantt-container .viewmode-select { + padding: 3px 5px; + margin-right: 4px; } .gantt { diff --git a/dist/frappe-gantt.js b/dist/frappe-gantt.js index da950cd..8e24161 100644 --- a/dist/frappe-gantt.js +++ b/dist/frappe-gantt.js @@ -1277,7 +1277,6 @@ var Gantt = (function () { task._end = date_utils.parse(task.end); let diff = date_utils.diff(task._end, task._start, "year"); if (diff < 0) { - console.log(task._end, task._start); throw Error("start of task can't be after end of task: in task #, " + (i + 1)) } // make task invalid if duration too large @@ -1565,19 +1564,59 @@ var Gantt = (function () { } make_grid_header() { + const curHeader = document.querySelector('.grid-header'); + if (curHeader) { + curHeader.remove(); + } let $header = document.createElement("div"); - $header.style.height = this.options.header_height + 10 + "px"; $header.style.width = this.dates.length * this.options.column_width + "px"; $header.classList.add('grid-header'); this.$header = $header; - this.$svg.parentElement.appendChild($header); + this.$container.appendChild($header); + let $upper_header = document.createElement("div"); + $upper_header.classList.add('upper-header'); + this.$upper_header = $upper_header; + this.$header.appendChild($upper_header); + + let $lower_header = document.createElement("div"); + $lower_header.classList.add('lower-header'); + this.$lower_header = $lower_header; + this.$header.appendChild($lower_header); + + let $side_header = document.createElement('div'); + $side_header.classList.add('side-header'); + + + // Create view mode change select + const $select = document.createElement("select"); + $select.classList.add('viewmode-select'); + + for (const key in VIEW_MODE) { + const $option = document.createElement("option"); + $option.value = VIEW_MODE[key]; + $option.textContent = VIEW_MODE[key]; + $select.appendChild($option); + } + $select.value = this.options.view_mode; + $select.addEventListener("change", (function () { + this.change_view_mode($select.value); + }).bind(this)); + $side_header.appendChild($select); + + // Create today button let $today_button = document.createElement('button'); - $today_button.id = 'today-button'; + $today_button.classList.add('today-button'); $today_button.textContent = 'Today'; $today_button.onclick = this.scroll_today.bind(this); - this.$header.appendChild($today_button); + $side_header.appendChild($today_button); + + this.$header.appendChild($side_header); + const { left, y } = $header.getBoundingClientRect(); + const width = Math.min(this.$header.clientWidth, this.$container.clientWidth); + $side_header.style.left = left + this.$container.scrollLeft + width - $side_header.clientWidth + 'px'; + $side_header.style.top = y + 5 + 'px'; } make_grid_ticks() { @@ -1721,21 +1760,23 @@ var Gantt = (function () { } make_dates() { + this.upper_texts_x = {}; for (let date of this.get_dates_to_draw()) { let $lower_text = document.createElement('div'); $lower_text.classList.add('lower-text'); $lower_text.style.left = date.lower_x + 'px'; $lower_text.style.top = date.lower_y + 'px'; $lower_text.innerText = date.lower_text; - this.$header.appendChild($lower_text); + this.$lower_header.appendChild($lower_text); if (date.upper_text) { + this.upper_texts_x[date.upper_text] = date.upper_x; let $upper_text = document.createElement('div'); - $upper_text.classList.add('lower-text'); + $upper_text.classList.add('upper-text'); $upper_text.style.left = date.upper_x + 'px'; $upper_text.style.top = date.upper_y + 'px'; $upper_text.innerText = date.upper_text; - this.$header.appendChild($upper_text); + this.$upper_header.appendChild($upper_text); // remove out-of-bound dates if (date.upper_x > this.layers.grid.getBBox().width) { @@ -1755,9 +1796,8 @@ var Gantt = (function () { return dates; } - get_date_info(date, last_date_info, i) { + get_date_info(date, last_date_info) { let last_date = last_date_info ? last_date_info.date : date_utils.add(date, 1, "day"); - const date_text = { Hour_lower: date_utils.format(date, "HH", this.options.language), "Quarter Day_lower": date_utils.format(date, "HH", this.options.language), @@ -1787,7 +1827,7 @@ var Gantt = (function () { : date_utils.format(date, "D", this.options.language) : "", Day_upper: - date.getMonth() !== last_date.getMonth() + date.getMonth() !== last_date.getMonth() || !last_date_info ? date_utils.format(date, "MMMM", this.options.language) : "", Week_upper: @@ -1809,26 +1849,25 @@ var Gantt = (function () { ? last_date_info.base_pos_x + last_date_info.column_width : 0, lower_y: this.options.header_height - 15, - upper_y: this.options.header_height - 35, + upper_y: this.options.header_height - 40, }; const x_pos = { - Hour_lower: this.options.column_width / 2, - Hour_upper: this.options.column_width * 12, - "Quarter Day_lower": this.options.column_width / 2, - "Quarter Day_upper": this.options.column_width * 2, - "Half Day_lower": this.options.column_width / 2, - "Half Day_upper": this.options.column_width, - Day_lower: this.options.column_width / 2, - Day_upper: (this.options.column_width * 30) / 2, + Hour_lower: column_width / 2, + Hour_upper: column_width * 12, + "Quarter Day_lower": column_width / 2, + "Quarter Day_upper": column_width * 2, + "Half Day_lower": column_width / 2, + "Half Day_upper": column_width, + Day_lower: column_width / 2, + Day_upper: column_width / 2, Week_lower: 0, - Week_upper: (this.options.column_width * 4) / 2, + Week_upper: (column_width * 4) / 2, Month_lower: column_width / 2, - Month_upper: (column_width * 12) / 2, - Year_lower: this.options.column_width / 2, - Year_upper: (this.options.column_width * 30) / 2, + Month_upper: column_width / 2, + Year_lower: column_width / 2, + Year_upper: (column_width * 30) / 2, }; - console.log(base_pos.x, x_pos[`${this.options.view_mode}_lower`],); return { date, column_width, @@ -1910,7 +1949,7 @@ var Gantt = (function () { (hours_before_first_task / this.options.step) * this.options.column_width - this.options.column_width; - console.log(parent_element.scrollTo({ left: scroll_pos, behavior: 'smooth' })); + parent_element.scrollTo({ left: scroll_pos, behavior: 'smooth' }); } scroll_today() { @@ -1990,6 +2029,34 @@ var Gantt = (function () { dx = e.currentTarget.scrollLeft - x_on_scroll_start; } + const daysSinceStart = e.currentTarget.scrollLeft / this.options.column_width * this.options.step / 24; + let format_str = "D MMM"; + if (["Year", "Month"].includes(this.options.view_mode)) format_str = 'YYYY'; + else if (["Day", "Week"].includes(this.options.view_mode)) format_str = 'MMMM'; + else if (this.view_is('Half Day')) format_str = 'D'; + else if (this.view_is('Hour')) format_str = "D MMMM"; + + + let currentUpper = date_utils.format( + date_utils.add(this.gantt_start, daysSinceStart, 'day'), + format_str + ); + const upperTexts = Array.from(document.querySelectorAll('.upper-text')); + const $el = upperTexts.find(el => el.textContent === currentUpper); + if ($el && !$el.classList.contains('current-upper')) { + const $current = document.querySelector('.current-upper'); + if ($current) { + $current.classList.remove('current-upper'); + $current.style.left = this.upper_texts_x[$current.textContent] + 'px'; + $current.style.top = this.options.header_height - 40 + 'px'; + } + + $el.classList.add('current-upper'); + let dimensions = this.$svg.getBoundingClientRect(); + $el.style.left = dimensions.x + this.$container.scrollLeft + 10 + 'px'; + $el.style.top = dimensions.y + this.options.header_height - 40 + 'px'; + } + Array.prototype.forEach.call(elements, function (el, i) { ids.push(el.getAttribute('data-id')); }); diff --git a/dist/frappe-gantt.js.map b/dist/frappe-gantt.js.map index 44165d8..0d78642 100644 --- a/dist/frappe-gantt.js.map +++ b/dist/frappe-gantt.js.map @@ -1 +1 @@ -{"version":3,"file":"frappe-gantt.js","sources":["../src/date_utils.js","../src/svg_utils.js","../src/bar.js","../src/arrow.js","../src/popup.js","../src/index.js"],"sourcesContent":["const YEAR = \"year\";\nconst MONTH = \"month\";\nconst DAY = \"day\";\nconst HOUR = \"hour\";\nconst MINUTE = \"minute\";\nconst SECOND = \"second\";\nconst MILLISECOND = \"millisecond\";\n\nconst SHORTENED = {\n January: \"Jan\",\n February: \"Feb\",\n March: \"Mar\",\n April: \"Apr\",\n May: \"May\",\n June: \"Jun\",\n July: \"Jul\",\n August: \"Aug\",\n September: \"Sep\",\n October: \"Oct\",\n November: \"Nov\",\n December: \"Dec\"\n};\n\nexport default {\n parse_duration(duration) {\n const regex = /([0-9])+(y|m|d|h|min|s|ms)/gm;\n const matches = regex.exec(duration);\n\n if (matches !== null) {\n if (matches[2] === \"y\") {\n return { duration: parseInt(matches[1]), scale: `year` };\n } else if (matches[2] === \"m\") {\n return { duration: parseInt(matches[1]), scale: `month` };\n } else if (matches[2] === \"d\") {\n return { duration: parseInt(matches[1]), scale: `day` };\n } else if (matches[2] === \"h\") {\n return { duration: parseInt(matches[1]), scale: `hour` };\n } else if (matches[2] === \"min\") {\n return { duration: parseInt(matches[1]), scale: `minute` };\n } else if (matches[2] === \"s\") {\n return { duration: parseInt(matches[1]), scale: `second` };\n } else if (matches[2] === \"ms\") {\n return { duration: parseInt(matches[1]), scale: `millisecond` };\n }\n }\n },\n parse(date, date_separator = \"-\", time_separator = /[.:]/) {\n if (date instanceof Date) {\n return date;\n }\n if (typeof date === \"string\") {\n let date_parts, time_parts;\n const parts = date.split(\" \");\n date_parts = parts[0]\n .split(date_separator)\n .map((val) => parseInt(val, 10));\n time_parts = parts[1] && parts[1].split(time_separator);\n\n // month is 0 indexed\n date_parts[1] = date_parts[1] ? date_parts[1] - 1 : 0;\n\n let vals = date_parts;\n\n if (time_parts && time_parts.length) {\n if (time_parts.length === 4) {\n time_parts[3] = \"0.\" + time_parts[3];\n time_parts[3] = parseFloat(time_parts[3]) * 1000;\n }\n vals = vals.concat(time_parts);\n }\n return new Date(...vals);\n }\n },\n\n to_string(date, with_time = false) {\n if (!(date instanceof Date)) {\n throw new TypeError(\"Invalid argument type\");\n }\n const vals = this.get_date_values(date).map((val, i) => {\n if (i === 1) {\n // add 1 for month\n val = val + 1;\n }\n\n if (i === 6) {\n return padStart(val + \"\", 3, \"0\");\n }\n\n return padStart(val + \"\", 2, \"0\");\n });\n const date_string = `${vals[0]}-${vals[1]}-${vals[2]}`;\n const time_string = `${vals[3]}:${vals[4]}:${vals[5]}.${vals[6]}`;\n\n return date_string + (with_time ? \" \" + time_string : \"\");\n },\n\n format(date, format_string = \"YYYY-MM-DD HH:mm:ss.SSS\", lang = \"en\") {\n const dateTimeFormat = new Intl.DateTimeFormat(lang, {\n month: \"long\",\n });\n const month_name = dateTimeFormat.format(date);\n const month_name_capitalized =\n month_name.charAt(0).toUpperCase() + month_name.slice(1);\n\n const values = this.get_date_values(date).map((d) => padStart(d, 2, 0));\n const format_map = {\n YYYY: values[0],\n MM: padStart(+values[1] + 1, 2, 0),\n DD: values[2],\n HH: values[3],\n mm: values[4],\n ss: values[5],\n SSS: values[6],\n D: values[2],\n MMMM: month_name_capitalized,\n MMM: SHORTENED[month_name_capitalized],\n };\n\n let str = format_string;\n const formatted_values = [];\n\n Object.keys(format_map)\n .sort((a, b) => b.length - a.length) // big string first\n .forEach((key) => {\n if (str.includes(key)) {\n str = str.replaceAll(key, `$${formatted_values.length}`);\n formatted_values.push(format_map[key]);\n }\n });\n\n formatted_values.forEach((value, i) => {\n str = str.replaceAll(`$${i}`, value);\n });\n\n return str;\n },\n\n diff(date_a, date_b, scale = DAY) {\n let milliseconds, seconds, hours, minutes, days, months, years;\n\n milliseconds = date_a - date_b;\n seconds = milliseconds / 1000;\n minutes = seconds / 60;\n hours = minutes / 60;\n days = hours / 24;\n months = days / 30;\n years = months / 12;\n\n if (!scale.endsWith(\"s\")) {\n scale += \"s\";\n }\n\n return Math.floor(\n {\n milliseconds,\n seconds,\n minutes,\n hours,\n days,\n months,\n years,\n }[scale],\n );\n },\n\n today() {\n const vals = this.get_date_values(new Date()).slice(0, 3);\n return new Date(...vals);\n },\n\n now() {\n return new Date();\n },\n\n add(date, qty, scale) {\n qty = parseInt(qty, 10);\n const vals = [\n date.getFullYear() + (scale === YEAR ? qty : 0),\n date.getMonth() + (scale === MONTH ? qty : 0),\n date.getDate() + (scale === DAY ? qty : 0),\n date.getHours() + (scale === HOUR ? qty : 0),\n date.getMinutes() + (scale === MINUTE ? qty : 0),\n date.getSeconds() + (scale === SECOND ? qty : 0),\n date.getMilliseconds() + (scale === MILLISECOND ? qty : 0),\n ];\n return new Date(...vals);\n },\n\n start_of(date, scale) {\n const scores = {\n [YEAR]: 6,\n [MONTH]: 5,\n [DAY]: 4,\n [HOUR]: 3,\n [MINUTE]: 2,\n [SECOND]: 1,\n [MILLISECOND]: 0,\n };\n\n function should_reset(_scale) {\n const max_score = scores[scale];\n return scores[_scale] <= max_score;\n }\n\n const vals = [\n date.getFullYear(),\n should_reset(YEAR) ? 0 : date.getMonth(),\n should_reset(MONTH) ? 1 : date.getDate(),\n should_reset(DAY) ? 0 : date.getHours(),\n should_reset(HOUR) ? 0 : date.getMinutes(),\n should_reset(MINUTE) ? 0 : date.getSeconds(),\n should_reset(SECOND) ? 0 : date.getMilliseconds(),\n ];\n\n return new Date(...vals);\n },\n\n clone(date) {\n return new Date(...this.get_date_values(date));\n },\n\n get_date_values(date) {\n return [\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds(),\n ];\n },\n\n get_days_in_month(date) {\n const no_of_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\n const month = date.getMonth();\n\n if (month !== 1) {\n return no_of_days[month];\n }\n\n // Feb\n const year = date.getFullYear();\n if ((year % 4 === 0 && year % 100 != 0) || year % 400 === 0) {\n return 29;\n }\n return 28;\n },\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart\nfunction padStart(str, targetLength, padString) {\n str = str + \"\";\n targetLength = targetLength >> 0;\n padString = String(typeof padString !== \"undefined\" ? padString : \" \");\n if (str.length > targetLength) {\n return String(str);\n } else {\n targetLength = targetLength - str.length;\n if (targetLength > padString.length) {\n padString += padString.repeat(targetLength / padString.length);\n }\n return padString.slice(0, targetLength) + String(str);\n }\n}\n","export function $(expr, con) {\n return typeof expr === \"string\"\n ? (con || document).querySelector(expr)\n : expr || null;\n}\n\nexport function createSVG(tag, attrs) {\n const elem = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n for (let attr in attrs) {\n if (attr === \"append_to\") {\n const parent = attrs.append_to;\n parent.appendChild(elem);\n } else if (attr === \"innerHTML\") {\n elem.innerHTML = attrs.innerHTML;\n } else if (attr === 'clipPath') {\n elem.setAttribute('clip-path', 'url(#' + attrs[attr] + ')');\n } else {\n elem.setAttribute(attr, attrs[attr]);\n }\n }\n return elem;\n}\n\nexport function animateSVG(svgElement, attr, from, to) {\n const animatedSvgElement = getAnimationElement(svgElement, attr, from, to);\n\n if (animatedSvgElement === svgElement) {\n // triggered 2nd time programmatically\n // trigger artificial click event\n const event = document.createEvent(\"HTMLEvents\");\n event.initEvent(\"click\", true, true);\n event.eventName = \"click\";\n animatedSvgElement.dispatchEvent(event);\n }\n}\n\nfunction getAnimationElement(\n svgElement,\n attr,\n from,\n to,\n dur = \"0.4s\",\n begin = \"0.1s\",\n) {\n const animEl = svgElement.querySelector(\"animate\");\n if (animEl) {\n $.attr(animEl, {\n attributeName: attr,\n from,\n to,\n dur,\n begin: \"click + \" + begin, // artificial click\n });\n return svgElement;\n }\n\n const animateElement = createSVG(\"animate\", {\n attributeName: attr,\n from,\n to,\n dur,\n begin,\n calcMode: \"spline\",\n values: from + \";\" + to,\n keyTimes: \"0; 1\",\n keySplines: cubic_bezier(\"ease-out\"),\n });\n svgElement.appendChild(animateElement);\n\n return svgElement;\n}\n\nfunction cubic_bezier(name) {\n return {\n ease: \".25 .1 .25 1\",\n linear: \"0 0 1 1\",\n \"ease-in\": \".42 0 1 1\",\n \"ease-out\": \"0 0 .58 1\",\n \"ease-in-out\": \".42 0 .58 1\",\n }[name];\n}\n\n$.on = (element, event, selector, callback) => {\n if (!callback) {\n callback = selector;\n $.bind(element, event, callback);\n } else {\n $.delegate(element, event, selector, callback);\n }\n};\n\n$.off = (element, event, handler) => {\n element.removeEventListener(event, handler);\n};\n\n$.bind = (element, event, callback) => {\n event.split(/\\s+/).forEach(function (event) {\n element.addEventListener(event, callback);\n });\n};\n\n$.delegate = (element, event, selector, callback) => {\n element.addEventListener(event, function (e) {\n const delegatedTarget = e.target.closest(selector);\n if (delegatedTarget) {\n e.delegatedTarget = delegatedTarget;\n callback.call(this, e, delegatedTarget);\n }\n });\n};\n\n$.closest = (selector, element) => {\n if (!element) return null;\n\n if (element.matches(selector)) {\n return element;\n }\n\n return $.closest(selector, element.parentNode);\n};\n\n$.attr = (element, attr, value) => {\n if (!value && typeof attr === \"string\") {\n return element.getAttribute(attr);\n }\n\n if (typeof attr === \"object\") {\n for (let key in attr) {\n $.attr(element, key, attr[key]);\n }\n return;\n }\n\n element.setAttribute(attr, value);\n};\n","import date_utils from \"./date_utils\";\nimport { $, createSVG, animateSVG } from \"./svg_utils\";\n\nexport default class Bar {\n constructor(gantt, task) {\n this.set_defaults(gantt, task);\n this.prepare();\n this.draw();\n this.bind();\n }\n\n set_defaults(gantt, task) {\n this.action_completed = false;\n this.gantt = gantt;\n this.task = task;\n }\n\n prepare() {\n this.prepare_values();\n this.prepare_helpers();\n }\n\n prepare_values() {\n this.invalid = this.task.invalid;\n this.height = this.gantt.options.bar_height;\n this.image_size = this.height - 5;\n this.compute_x();\n this.compute_y();\n this.compute_duration();\n this.corner_radius = this.gantt.options.bar_corner_radius;\n this.width = this.gantt.options.column_width * this.duration;\n this.progress_width =\n this.gantt.options.column_width *\n this.duration *\n (this.task.progress / 100) || 0;\n this.group = createSVG(\"g\", {\n class: \"bar-wrapper\" + (this.task.custom_class ? \" \" + this.task.custom_class : \"\") + (this.task.important ? ' important' : ''),\n \"data-id\": this.task.id,\n });\n this.bar_group = createSVG(\"g\", {\n class: \"bar-group\",\n append_to: this.group,\n });\n this.handle_group = createSVG(\"g\", {\n class: \"handle-group\",\n append_to: this.group,\n });\n }\n\n prepare_helpers() {\n SVGElement.prototype.getX = function () {\n return +this.getAttribute(\"x\");\n };\n SVGElement.prototype.getY = function () {\n return +this.getAttribute(\"y\");\n };\n SVGElement.prototype.getWidth = function () {\n return +this.getAttribute(\"width\");\n };\n SVGElement.prototype.getHeight = function () {\n return +this.getAttribute(\"height\");\n };\n SVGElement.prototype.getEndX = function () {\n return this.getX() + this.getWidth();\n };\n }\n\n prepare_expected_progress_values() {\n this.compute_expected_progress();\n this.expected_progress_width =\n this.gantt.options.column_width *\n this.duration *\n (this.expected_progress / 100) || 0;\n }\n\n draw() {\n this.draw_bar();\n this.draw_progress_bar();\n if (this.gantt.options.show_expected_progress) {\n this.prepare_expected_progress_values();\n this.draw_expected_progress_bar();\n }\n this.draw_label();\n this.draw_resize_handles();\n\n if (this.task.thumbnail) {\n this.draw_thumbnail();\n }\n }\n\n draw_bar() {\n this.$bar = createSVG(\"rect\", {\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"bar\",\n append_to: this.bar_group,\n });\n\n animateSVG(this.$bar, \"width\", 0, this.width);\n\n if (this.invalid) {\n this.$bar.classList.add(\"bar-invalid\");\n }\n }\n\n draw_expected_progress_bar() {\n if (this.invalid) return;\n this.$expected_bar_progress = createSVG(\"rect\", {\n x: this.x,\n y: this.y,\n width: this.expected_progress_width,\n height: this.height,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"bar-expected-progress\",\n append_to: this.bar_group,\n });\n\n animateSVG(\n this.$expected_bar_progress,\n \"width\",\n 0,\n this.expected_progress_width,\n );\n }\n\n draw_progress_bar() {\n if (this.invalid) return;\n this.$bar_progress = createSVG(\"rect\", {\n x: this.x,\n y: this.y,\n width: this.progress_width,\n height: this.height,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"bar-progress\",\n append_to: this.bar_group,\n });\n const x = (date_utils.diff(this.task._start, this.gantt.gantt_start, 'hour') /\n this.gantt.options.step) *\n this.gantt.options.column_width;\n\n this.$date_highlight = createSVG(\"rect\", {\n x,\n y: this.gantt.options.header_height - 17,\n width: this.width,\n height: this.height * 0.8,\n rx: 12,\n class: \"date-highlight\",\n append_to: this.bar_group,\n });\n\n\n animateSVG(this.$bar_progress, \"width\", 0, this.progress_width);\n }\n\n draw_label() {\n let x_coord = this.x + this.$bar.getWidth() / 2;\n\n if (this.task.thumbnail) {\n x_coord = this.x + this.image_size + 5;\n }\n\n createSVG(\"text\", {\n x: x_coord,\n y: this.y + this.height / 2,\n innerHTML: this.task.name,\n class: \"bar-label\",\n append_to: this.bar_group,\n });\n // labels get BBox in the next tick\n requestAnimationFrame(() => this.update_label_position());\n }\n draw_thumbnail() {\n let x_offset = 10, y_offset = 2;\n let defs, clipPath;\n\n defs = createSVG('defs', {\n append_to: this.bar_group\n });\n\n createSVG('rect', {\n id: 'rect_' + this.task.id,\n x: this.x + x_offset,\n y: this.y + y_offset,\n width: this.image_size,\n height: this.image_size,\n rx: '15',\n class: 'img_mask',\n append_to: defs\n });\n\n clipPath = createSVG('clipPath', {\n id: 'clip_' + this.task.id,\n append_to: defs\n });\n\n createSVG('use', {\n href: '#rect_' + this.task.id,\n append_to: clipPath\n });\n\n createSVG('image', {\n x: this.x + x_offset,\n y: this.y + y_offset,\n width: this.image_size,\n height: this.image_size,\n class: 'bar-img',\n href: this.task.thumbnail,\n clipPath: 'clip_' + this.task.id,\n append_to: this.bar_group\n });\n }\n\n draw_resize_handles() {\n if (this.invalid || this.gantt.options.readonly) return;\n\n const bar = this.$bar;\n const handle_width = 8;\n\n createSVG(\"rect\", {\n x: bar.getX() + bar.getWidth() + handle_width - 4,\n y: bar.getY() + 1,\n width: handle_width,\n height: this.height - 2,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"handle right\",\n append_to: this.handle_group,\n });\n\n createSVG(\"rect\", {\n x: bar.getX() - handle_width - 4,\n y: bar.getY() + 1,\n width: handle_width,\n height: this.height - 2,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"handle left\",\n append_to: this.handle_group,\n });\n\n this.$handle_progress = createSVG(\"polygon\", {\n points: this.get_progress_polygon_points().join(\",\"),\n class: \"handle progress\",\n append_to: this.handle_group,\n });\n }\n\n get_progress_polygon_points() {\n const bar_progress = this.$bar_progress;\n return [\n bar_progress.getEndX() - 6,\n bar_progress.getY() + bar_progress.getHeight() + 8,\n bar_progress.getEndX() + 6,\n bar_progress.getY() + bar_progress.getHeight() + 8,\n bar_progress.getEndX(),\n bar_progress.getY() + bar_progress.getHeight() + 0.5,\n ];\n }\n\n bind() {\n if (this.invalid) return;\n this.setup_click_event();\n }\n\n setup_click_event() {\n let in_action = false;\n $.on(this.group, \"mouseover\", (e) => this.gantt.trigger_event(\"hover\", [this.task, e.screenX, e.screenY, e]))\n $.on(this.group, \"mouseenter\", (e) => this.show_popup(e.offsetX))\n $.on(this.group, \"mouseleave\", () => this.gantt.hide_popup())\n\n\n $.on(this.group, \"focus \" + this.gantt.options.popup_trigger, (e) => {\n this.gantt.trigger_event(\"click\", [this.task]);\n });\n\n $.on(this.group, \"dblclick\", (e) => {\n if (this.action_completed) {\n // just finished a move action, wait for a few seconds\n return;\n }\n\n this.gantt.trigger_event(\"double_click\", [this.task]);\n });\n }\n\n show_popup(x) {\n if (this.gantt.bar_being_dragged) return;\n\n const start_date = date_utils.format(\n this.task._start,\n \"MMM D\",\n this.gantt.options.language,\n );\n const end_date = date_utils.format(\n date_utils.add(this.task._end, -1, \"second\"),\n \"MMM D\",\n this.gantt.options.language,\n );\n const subtitle = `${start_date} - ${end_date}
Progress: ${this.task.progress}`;\n\n this.gantt.show_popup({\n x,\n target_element: this.$bar,\n title: this.task.name,\n subtitle: subtitle,\n task: this.task,\n });\n }\n\n update_bar_position({ x = null, width = null }) {\n const bar = this.$bar;\n if (x) {\n // get all x values of parent task\n const xs = this.task.dependencies.map((dep) => {\n return this.gantt.get_bar(dep).$bar.getX();\n });\n // child task must not go before parent\n const valid_x = xs.reduce((prev, curr) => {\n return x >= curr;\n }, x);\n if (!valid_x) {\n width = null;\n return;\n }\n this.update_attr(bar, \"x\", x);\n this.update_attr(this.$date_highlight, \"x\", x);\n }\n if (width) {\n this.update_attr(bar, \"width\", width);\n this.update_attr(this.$date_highlight, \"width\", width);\n }\n this.update_label_position();\n this.update_handle_position();\n if (this.gantt.options.show_expected_progress) {\n this.date_changed();\n this.compute_duration();\n this.update_expected_progressbar_position();\n }\n this.update_progressbar_position();\n this.update_arrow_position();\n }\n\n update_label_position_on_horizontal_scroll({ x, sx }) {\n const container = document.querySelector('.gantt-container');\n const label = this.group.querySelector('.bar-label');\n const img = this.group.querySelector('.bar-img') || '';\n const img_mask = this.bar_group.querySelector('.img_mask') || '';\n\n let barWidthLimit = this.$bar.getX() + this.$bar.getWidth();\n let newLabelX = label.getX() + x;\n let newImgX = img && img.getX() + x || 0;\n let imgWidth = img && img.getBBox().width + 7 || 7;\n let labelEndX = newLabelX + label.getBBox().width + 7;\n let viewportCentral = sx + container.clientWidth / 2;\n\n if (label.classList.contains('big')) return;\n\n if (labelEndX < barWidthLimit && x > 0 && labelEndX < viewportCentral) {\n label.setAttribute('x', newLabelX);\n if (img) {\n img.setAttribute('x', newImgX);\n img_mask.setAttribute('x', newImgX);\n }\n } else if ((newLabelX - imgWidth) > this.$bar.getX() && x < 0 && labelEndX > viewportCentral) {\n label.setAttribute('x', newLabelX);\n if (img) {\n img.setAttribute('x', newImgX);\n img_mask.setAttribute('x', newImgX);\n }\n\n }\n }\n\n date_changed() {\n let changed = false;\n const { new_start_date, new_end_date } = this.compute_start_end_date();\n\n if (Number(this.task._start) !== Number(new_start_date)) {\n changed = true;\n this.task._start = new_start_date;\n }\n\n if (Number(this.task._end) !== Number(new_end_date)) {\n changed = true;\n this.task._end = new_end_date;\n }\n\n if (!changed) return;\n\n this.gantt.trigger_event(\"date_change\", [\n this.task,\n new_start_date,\n date_utils.add(new_end_date, -1, \"second\"),\n ]);\n }\n\n progress_changed() {\n const new_progress = this.compute_progress();\n this.task.progress = new_progress;\n this.gantt.trigger_event(\"progress_change\", [this.task, new_progress]);\n }\n\n set_action_completed() {\n this.action_completed = true;\n setTimeout(() => (this.action_completed = false), 1000);\n }\n\n compute_start_end_date() {\n const bar = this.$bar;\n const x_in_units = bar.getX() / this.gantt.options.column_width;\n const new_start_date = date_utils.add(\n this.gantt.gantt_start,\n x_in_units * this.gantt.options.step,\n \"hour\",\n );\n const width_in_units = bar.getWidth() / this.gantt.options.column_width;\n const new_end_date = date_utils.add(\n new_start_date,\n width_in_units * this.gantt.options.step,\n \"hour\",\n );\n\n return { new_start_date, new_end_date };\n }\n\n compute_progress() {\n const progress =\n (this.$bar_progress.getWidth() / this.$bar.getWidth()) * 100;\n return parseInt(progress, 10);\n }\n\n compute_expected_progress() {\n this.expected_progress =\n date_utils.diff(date_utils.today(), this.task._start, \"hour\") /\n this.gantt.options.step;\n this.expected_progress =\n ((this.expected_progress < this.duration\n ? this.expected_progress\n : this.duration) *\n 100) /\n this.duration;\n }\n\n compute_x() {\n const { step, column_width } = this.gantt.options;\n const task_start = this.task._start;\n const gantt_start = this.gantt.gantt_start;\n\n const diff = date_utils.diff(task_start, gantt_start, \"hour\");\n let x = (diff / step) * column_width;\n\n if (this.gantt.view_is(\"Month\")) {\n const diff = date_utils.diff(task_start, gantt_start, \"day\");\n x = (diff * column_width) / 30;\n }\n this.x = x;\n }\n\n compute_y() {\n this.y =\n this.gantt.options.header_height +\n this.gantt.options.padding +\n this.task._index * (this.height + this.gantt.options.padding);\n }\n\n compute_duration() {\n this.duration =\n date_utils.diff(this.task._end, this.task._start, \"hour\") /\n this.gantt.options.step;\n }\n\n get_snap_position(dx) {\n let odx = dx,\n rem,\n position;\n\n if (this.gantt.view_is(\"Week\")) {\n rem = dx % (this.gantt.options.column_width / 7);\n position =\n odx -\n rem +\n (rem < this.gantt.options.column_width / 14\n ? 0\n : this.gantt.options.column_width / 7);\n } else if (this.gantt.view_is(\"Month\")) {\n rem = dx % (this.gantt.options.column_width / 30);\n position =\n odx -\n rem +\n (rem < this.gantt.options.column_width / 60\n ? 0\n : this.gantt.options.column_width / 30);\n } else {\n rem = dx % this.gantt.options.column_width;\n position =\n odx -\n rem +\n (rem < this.gantt.options.column_width / 2\n ? 0\n : this.gantt.options.column_width);\n }\n return position;\n }\n\n update_attr(element, attr, value) {\n value = +value;\n if (!isNaN(value)) {\n element.setAttribute(attr, value);\n }\n return element;\n }\n\n update_expected_progressbar_position() {\n if (this.invalid) return;\n this.$expected_bar_progress.setAttribute(\"x\", this.$bar.getX());\n this.compute_expected_progress();\n this.$expected_bar_progress.setAttribute(\n \"width\",\n this.gantt.options.column_width *\n this.duration *\n (this.expected_progress / 100) || 0,\n );\n }\n\n update_progressbar_position() {\n if (this.invalid || this.gantt.options.readonly) return;\n this.$bar_progress.setAttribute(\"x\", this.$bar.getX());\n this.$bar_progress.setAttribute(\n \"width\",\n this.$bar.getWidth() * (this.task.progress / 100),\n );\n }\n\n update_label_position() {\n const img_mask = this.bar_group.querySelector('.img_mask') || '';\n const bar = this.$bar,\n label = this.group.querySelector(\".bar-label\"),\n img = this.group.querySelector('.bar-img');\n\n\n let padding = 5;\n let x_offset_label_img = this.image_size + 10;\n const labelWidth = label.getBBox().width\n const barWidth = bar.getWidth()\n if (labelWidth > barWidth) {\n label.classList.add(\"big\");\n if (img) {\n img.setAttribute('x', bar.getX() + bar.getWidth() + padding);\n img_mask.setAttribute('x', bar.getX() + bar.getWidth() + padding);\n label.setAttribute('x', bar.getX() + bar.getWidth() + x_offset_label_img);\n } else {\n label.setAttribute('x', bar.getX() + bar.getWidth() + padding);\n }\n } else {\n label.classList.remove(\"big\");\n if (img) {\n img.setAttribute('x', bar.getX() + padding);\n img_mask.setAttribute('x', bar.getX() + padding);\n label.setAttribute('x', bar.getX() + barWidth / 2 + x_offset_label_img);\n } else {\n label.setAttribute('x', bar.getX() + barWidth / 2 - labelWidth / 2);\n }\n }\n }\n\n update_handle_position() {\n if (this.invalid || this.gantt.options.readonly) return;\n const bar = this.$bar;\n this.handle_group\n .querySelector(\".handle.left\")\n .setAttribute(\"x\", bar.getX() - 12);\n this.handle_group\n .querySelector(\".handle.right\")\n .setAttribute(\"x\", bar.getEndX() + 4);\n const handle = this.group.querySelector(\".handle.progress\");\n handle && handle.setAttribute(\"points\", this.get_progress_polygon_points());\n }\n\n update_arrow_position() {\n this.arrows = this.arrows || [];\n for (let arrow of this.arrows) {\n arrow.update();\n }\n }\n}\n\nfunction isFunction(functionToCheck) {\n let getType = {};\n return (\n functionToCheck &&\n getType.toString.call(functionToCheck) === \"[object Function]\"\n );\n}\n","import { createSVG } from \"./svg_utils\";\n\nexport default class Arrow {\n constructor(gantt, from_task, to_task) {\n this.gantt = gantt;\n this.from_task = from_task;\n this.to_task = to_task;\n\n this.calculate_path();\n this.draw();\n }\n\n calculate_path() {\n let start_x =\n this.from_task.$bar.getX() + this.from_task.$bar.getWidth() / 2;\n\n const condition = () =>\n this.to_task.$bar.getX() < start_x + this.gantt.options.padding &&\n start_x > this.from_task.$bar.getX() + this.gantt.options.padding;\n\n while (condition()) {\n start_x -= 10;\n }\n\n const start_y =\n this.gantt.options.header_height +\n this.gantt.options.bar_height +\n (this.gantt.options.padding + this.gantt.options.bar_height) *\n this.from_task.task._index +\n this.gantt.options.padding;\n\n const end_x = this.to_task.$bar.getX() - this.gantt.options.padding / 2 - 7;\n const end_y =\n this.gantt.options.header_height +\n this.gantt.options.bar_height / 2 +\n (this.gantt.options.padding + this.gantt.options.bar_height) *\n this.to_task.task._index +\n this.gantt.options.padding;\n\n const from_is_below_to =\n this.from_task.task._index > this.to_task.task._index;\n const curve = this.gantt.options.arrow_curve;\n const clockwise = from_is_below_to ? 1 : 0;\n const curve_y = from_is_below_to ? -curve : curve;\n const offset = from_is_below_to\n ? end_y + this.gantt.options.arrow_curve\n : end_y - this.gantt.options.arrow_curve;\n\n this.path = `\n M ${start_x} ${start_y}\n V ${offset}\n a ${curve} ${curve} 0 0 ${clockwise} ${curve} ${curve_y}\n L ${end_x} ${end_y}\n m -5 -5\n l 5 5\n l -5 5`;\n\n if (\n this.to_task.$bar.getX() <\n this.from_task.$bar.getX() + this.gantt.options.padding\n ) {\n const down_1 = this.gantt.options.padding / 2 - curve;\n const down_2 =\n this.to_task.$bar.getY() + this.to_task.$bar.getHeight() / 2 - curve_y;\n const left = this.to_task.$bar.getX() - this.gantt.options.padding;\n\n this.path = `\n M ${start_x} ${start_y}\n v ${down_1}\n a ${curve} ${curve} 0 0 1 -${curve} ${curve}\n H ${left}\n a ${curve} ${curve} 0 0 ${clockwise} -${curve} ${curve_y}\n V ${down_2}\n a ${curve} ${curve} 0 0 ${clockwise} ${curve} ${curve_y}\n L ${end_x} ${end_y}\n m -5 -5\n l 5 5\n l -5 5`;\n }\n }\n\n draw() {\n this.element = createSVG(\"path\", {\n d: this.path,\n \"data-from\": this.from_task.task.id,\n \"data-to\": this.to_task.task.id,\n });\n }\n\n update() {\n this.calculate_path();\n this.element.setAttribute(\"d\", this.path);\n }\n}\n","export default class Popup {\n constructor(parent, custom_html) {\n this.parent = parent;\n this.custom_html = custom_html;\n this.make();\n }\n\n make() {\n this.parent.innerHTML = `\n
\n
\n
\n `;\n\n this.hide();\n\n this.title = this.parent.querySelector(\".title\");\n this.subtitle = this.parent.querySelector(\".subtitle\");\n this.pointer = this.parent.querySelector(\".pointer\");\n }\n\n show(options) {\n if (!options.target_element) {\n throw new Error(\"target_element is required to show popup\");\n }\n const target_element = options.target_element;\n\n if (this.custom_html) {\n let html = this.custom_html(options.task);\n html += '
';\n this.parent.innerHTML = html;\n this.pointer = this.parent.querySelector(\".pointer\");\n } else {\n // set data\n this.title.innerHTML = options.title;\n this.subtitle.innerHTML = options.subtitle;\n }\n\n // set position\n let position_meta;\n if (target_element instanceof HTMLElement) {\n position_meta = target_element.getBoundingClientRect();\n } else if (target_element instanceof SVGElement) {\n position_meta = options.target_element.getBBox();\n }\n\n this.parent.style.left = options.x - this.parent.clientWidth / 2 + \"px\";\n this.parent.style.top = position_meta.y + position_meta.height + 10 + \"px\";\n\n this.pointer.style.left = this.parent.clientWidth / 2 + \"px\";\n this.pointer.style.top = \"-15px\";\n\n // show\n this.parent.style.opacity = 1;\n }\n\n hide() {\n this.parent.style.opacity = 0;\n this.parent.style.left = 0;\n }\n}\n","import date_utils from \"./date_utils\";\nimport { $, createSVG } from \"./svg_utils\";\nimport Bar from \"./bar\";\nimport Arrow from \"./arrow\";\nimport Popup from \"./popup\";\n\nimport \"./gantt.scss\";\n\nconst VIEW_MODE = {\n HOUR: \"Hour\",\n QUARTER_DAY: \"Quarter Day\",\n HALF_DAY: \"Half Day\",\n DAY: \"Day\",\n WEEK: \"Week\",\n MONTH: \"Month\",\n YEAR: \"Year\",\n};\n\nconst VIEW_MODE_PADDING = {\n HOUR: [\"7d\", \"7d\"],\n QUARTER_DAY: [\"7d\", \"7d\"],\n HALF_DAY: [\"7d\", \"7d\"],\n DAY: [\"1m\", \"1m\"],\n WEEK: [\"1m\", \"1m\"],\n MONTH: [\"1m\", \"1m\"],\n YEAR: [\"2y\", \"2y\"],\n};\n\nexport default class Gantt {\n constructor(wrapper, tasks, options) {\n this.setup_wrapper(wrapper);\n this.setup_options(options);\n this.setup_tasks(tasks);\n // initialize with default view mode\n this.change_view_mode();\n this.bind_events();\n }\n\n setup_wrapper(element) {\n let svg_element, wrapper_element;\n\n // CSS Selector is passed\n if (typeof element === \"string\") {\n element = document.querySelector(element);\n }\n\n // get the SVGElement\n if (element instanceof HTMLElement) {\n wrapper_element = element;\n svg_element = element.querySelector(\"svg\");\n } else if (element instanceof SVGElement) {\n svg_element = element;\n } else {\n throw new TypeError(\n \"Frappé Gantt only supports usage of a string CSS selector,\" +\n \" HTML DOM element or SVG DOM element for the 'element' parameter\",\n );\n }\n\n // svg element\n if (!svg_element) {\n // create it\n this.$svg = createSVG(\"svg\", {\n append_to: wrapper_element,\n class: \"gantt\",\n });\n } else {\n this.$svg = svg_element;\n this.$svg.classList.add(\"gantt\");\n }\n\n // wrapper element\n this.$container = document.createElement(\"div\");\n this.$container.classList.add(\"gantt-container\");\n\n const parent_element = this.$svg.parentElement;\n parent_element.appendChild(this.$container);\n this.$container.appendChild(this.$svg);\n\n // popup wrapper\n this.popup_wrapper = document.createElement(\"div\");\n this.popup_wrapper.classList.add(\"popup-wrapper\");\n this.$container.appendChild(this.popup_wrapper);\n }\n\n setup_options(options) {\n const default_options = {\n header_height: 50,\n column_width: 30,\n step: 24,\n view_modes: [...Object.values(VIEW_MODE)],\n bar_height: 30,\n bar_corner_radius: 3,\n arrow_curve: 5,\n padding: 18,\n view_mode: \"Day\",\n date_format: \"YYYY-MM-DD\",\n popup_trigger: \"click\",\n custom_popup_html: null,\n language: \"en\",\n readonly: false,\n highlight_weekend: true,\n scroll_today: true,\n lines: 'both',\n auto_move_label: true,\n };\n this.options = Object.assign({}, default_options, options);\n if (!options.view_mode_padding) options.view_mode_padding = {}\n for (let [key, value] of Object.entries(options.view_mode_padding)) {\n if (typeof value === \"string\") {\n // Configure for single value given\n options.view_mode_padding[key] = [value, value];\n }\n }\n\n this.options.view_mode_padding = {\n ...VIEW_MODE_PADDING,\n ...options.view_mode_padding,\n };\n }\n\n setup_tasks(tasks) {\n // prepare tasks\n this.tasks = tasks.map((task, i) => {\n // convert to Date objects\n task._start = date_utils.parse(task.start);\n if (task.end === undefined && task.duration !== undefined) {\n task.end = task._start;\n let durations = task.duration.split(\" \");\n\n durations.forEach((tmpDuration) => {\n let { duration, scale } = date_utils.parse_duration(tmpDuration);\n task.end = date_utils.add(task.end, duration, scale);\n });\n }\n task._end = date_utils.parse(task.end);\n let diff = date_utils.diff(task._end, task._start, \"year\");\n if (diff < 0) {\n console.log(task._end, task._start)\n throw Error(\"start of task can't be after end of task: in task #, \" + (i + 1))\n }\n // make task invalid if duration too large\n if (date_utils.diff(task._end, task._start, \"year\") > 10) {\n task.end = null;\n }\n\n\n // cache index\n task._index = i;\n\n // invalid dates\n if (!task.start && !task.end) {\n const today = date_utils.today();\n task._start = today;\n task._end = date_utils.add(today, 2, \"day\");\n }\n\n if (!task.start && task.end) {\n task._start = date_utils.add(task._end, -2, \"day\");\n }\n\n if (task.start && !task.end) {\n task._end = date_utils.add(task._start, 2, \"day\");\n }\n\n // if hours is not set, assume the last day is full day\n // e.g: 2018-09-09 becomes 2018-09-09 23:59:59\n const task_end_values = date_utils.get_date_values(task._end);\n if (task_end_values.slice(3).every((d) => d === 0)) {\n task._end = date_utils.add(task._end, 24, \"hour\");\n }\n\n // invalid flag\n if (!task.start || !task.end) {\n task.invalid = true;\n }\n\n // dependencies\n if (typeof task.dependencies === \"string\" || !task.dependencies) {\n let deps = [];\n if (task.dependencies) {\n deps = task.dependencies\n .split(\",\")\n .map((d) => d.trim().replaceAll(' ', '_'))\n .filter((d) => d);\n }\n task.dependencies = deps;\n }\n\n // uids\n if (!task.id) {\n task.id = generate_id(task);\n } else if (typeof task.id === 'string') {\n task.id = task.id.replaceAll(' ', '_')\n } else {\n task.id = `${task.id}`\n }\n\n return task;\n });\n\n this.setup_dependencies();\n }\n\n setup_dependencies() {\n this.dependency_map = {};\n for (let t of this.tasks) {\n for (let d of t.dependencies) {\n this.dependency_map[d] = this.dependency_map[d] || [];\n this.dependency_map[d].push(t.id);\n }\n }\n }\n\n refresh(tasks) {\n this.setup_tasks(tasks);\n this.change_view_mode();\n }\n\n change_view_mode(mode = this.options.view_mode) {\n this.update_view_scale(mode);\n this.setup_dates();\n this.render();\n // fire viewmode_change event\n this.trigger_event(\"view_change\", [mode]);\n }\n\n update_view_scale(view_mode) {\n this.options.view_mode = view_mode;\n if (view_mode === VIEW_MODE.HOUR) {\n this.options.step = 24 / 24;\n this.options.column_width = 38;\n } else if (view_mode === VIEW_MODE.DAY) {\n this.options.step = 24;\n this.options.column_width = 38;\n } else if (view_mode === VIEW_MODE.HALF_DAY) {\n this.options.step = 24 / 2;\n this.options.column_width = 38;\n } else if (view_mode === VIEW_MODE.QUARTER_DAY) {\n this.options.step = 24 / 4;\n this.options.column_width = 38;\n } else if (view_mode === VIEW_MODE.WEEK) {\n this.options.step = 24 * 7;\n this.options.column_width = 140;\n } else if (view_mode === VIEW_MODE.MONTH) {\n this.options.step = 24 * 30;\n this.options.column_width = 120;\n } else if (view_mode === VIEW_MODE.YEAR) {\n this.options.step = 24 * 365;\n this.options.column_width = 120;\n }\n }\n\n setup_dates() {\n this.setup_gantt_dates();\n this.setup_date_values();\n }\n\n setup_gantt_dates() {\n this.gantt_start = this.gantt_end = null;\n\n for (let task of this.tasks) {\n // set global start and end date\n if (!this.gantt_start || task._start < this.gantt_start) {\n this.gantt_start = task._start;\n }\n if (!this.gantt_end || task._end > this.gantt_end) {\n this.gantt_end = task._end;\n }\n }\n let gantt_start, gantt_end;\n if (!this.gantt_start) gantt_start = new Date();\n else gantt_start = date_utils.start_of(this.gantt_start, \"day\");\n if (!this.gantt_end) gantt_end = new Date();\n else gantt_end = date_utils.start_of(this.gantt_end, \"day\");\n\n // add date padding on both sides\n let viewKey;\n for (let [key, value] of Object.entries(VIEW_MODE)) {\n if (value === this.options.view_mode) {\n viewKey = key;\n }\n }\n const [padding_start, padding_end] = this.options.view_mode_padding[\n viewKey\n ].map(date_utils.parse_duration);\n gantt_start = date_utils.add(\n gantt_start,\n -padding_start.duration,\n padding_start.scale,\n );\n\n let format_string;\n if (this.view_is(VIEW_MODE.YEAR)) {\n format_string = \"YYYY\"\n } else if (this.view_is(VIEW_MODE.MONTH)) {\n format_string = \"YYYY-MM\"\n } else if (this.view_is(VIEW_MODE.DAY)) {\n format_string = \"YYYY-MM-DD\"\n } else {\n format_string = \"YYYY-MM-DD HH\"\n }\n this.gantt_start = date_utils.parse(date_utils.format(gantt_start, format_string));\n this.gantt_start.setHours(0, 0, 0, 0)\n this.gantt_end = date_utils.add(\n gantt_end,\n padding_end.duration,\n padding_end.scale,\n );\n }\n\n setup_date_values() {\n this.dates = [];\n let cur_date = null;\n\n while (cur_date === null || cur_date < this.gantt_end) {\n if (!cur_date) {\n cur_date = date_utils.clone(this.gantt_start);\n } else {\n if (this.view_is(VIEW_MODE.YEAR)) {\n cur_date = date_utils.add(cur_date, 1, \"year\");\n } else if (this.view_is(VIEW_MODE.MONTH)) {\n cur_date = date_utils.add(cur_date, 1, \"month\");\n } else {\n cur_date = date_utils.add(cur_date, this.options.step, \"hour\");\n }\n }\n this.dates.push(cur_date);\n }\n }\n\n bind_events() {\n if (this.options.readonly) return\n this.bind_grid_click();\n this.bind_bar_events();\n }\n\n render() {\n this.clear();\n this.setup_layers();\n this.make_grid();\n this.make_dates();\n this.make_bars();\n this.make_arrows();\n this.map_arrows_on_bars();\n this.set_width();\n this.set_scroll_position();\n if (this.options.scroll_today) this.scroll_today()\n }\n\n setup_layers() {\n this.layers = {};\n const layers = [\"grid\", \"arrow\", \"progress\", \"bar\", \"details\"];\n // make group layers\n for (let layer of layers) {\n this.layers[layer] = createSVG(\"g\", {\n class: layer,\n append_to: this.$svg,\n });\n }\n }\n\n make_grid() {\n this.make_grid_background();\n this.make_grid_rows();\n this.make_grid_header();\n this.make_grid_ticks();\n this.make_grid_highlights();\n }\n\n make_grid_background() {\n const grid_width = this.dates.length * this.options.column_width;\n const grid_height =\n this.options.header_height +\n this.options.padding +\n (this.options.bar_height + this.options.padding) * this.tasks.length;\n\n createSVG(\"rect\", {\n x: 0,\n y: 0,\n width: grid_width,\n height: grid_height,\n class: \"grid-background\",\n append_to: this.$svg,\n });\n\n $.attr(this.$svg, {\n height: grid_height + this.options.padding + 100,\n width: \"100%\",\n });\n }\n\n make_grid_rows() {\n const rows_layer = createSVG(\"g\", { append_to: this.layers.grid });\n const lines_layer = createSVG(\"g\", { append_to: this.layers.grid });\n\n const row_width = this.dates.length * this.options.column_width;\n const row_height = this.options.bar_height + this.options.padding;\n\n let row_y = this.options.header_height + this.options.padding / 2;\n\n for (let task of this.tasks) {\n createSVG(\"rect\", {\n x: 0,\n y: row_y,\n width: row_width,\n height: row_height,\n class: \"grid-row\",\n append_to: rows_layer,\n });\n if (this.options.lines === 'both' || this.options.lines === 'horizontal') {\n createSVG(\"line\", {\n x1: 0,\n y1: row_y + row_height,\n x2: row_width,\n y2: row_y + row_height,\n class: \"row-line\",\n append_to: lines_layer,\n });\n }\n\n row_y += this.options.bar_height + this.options.padding;\n }\n }\n\n make_grid_header() {\n let $header = document.createElement(\"div\");\n\n $header.style.height = this.options.header_height + 10 + \"px\";\n $header.style.width = this.dates.length * this.options.column_width + \"px\";\n $header.classList.add('grid-header')\n this.$header = $header\n this.$svg.parentElement.appendChild($header)\n\n let $today_button = document.createElement('button')\n $today_button.id = 'today-button'\n $today_button.textContent = 'Today'\n $today_button.onclick = this.scroll_today.bind(this)\n this.$header.appendChild($today_button)\n }\n\n make_grid_ticks() {\n if (this.options.lines !== 'both' && this.options.lines !== 'vertical') return\n let tick_x = 0;\n let tick_y = this.options.header_height + this.options.padding / 2;\n let tick_height =\n (this.options.bar_height + this.options.padding) * this.tasks.length;\n\n for (let date of this.dates) {\n let tick_class = \"tick\";\n // thick tick for monday\n if (this.view_is(VIEW_MODE.DAY) && date.getDate() === 1) {\n tick_class += \" thick\";\n }\n // thick tick for first week\n if (\n this.view_is(VIEW_MODE.WEEK) &&\n date.getDate() >= 1 &&\n date.getDate() < 8\n ) {\n tick_class += \" thick\";\n }\n // thick ticks for quarters\n if (this.view_is(VIEW_MODE.MONTH) && date.getMonth() % 3 === 0) {\n tick_class += \" thick\";\n }\n\n createSVG(\"path\", {\n d: `M ${tick_x} ${tick_y} v ${tick_height}`,\n class: tick_class,\n append_to: this.layers.grid,\n });\n\n if (this.view_is(VIEW_MODE.MONTH)) {\n tick_x +=\n (date_utils.get_days_in_month(date) * this.options.column_width) / 30;\n } else {\n tick_x += this.options.column_width;\n }\n }\n }\n\n highlightWeekends() {\n if (!this.view_is('Day') && !this.view_is('Half Day')) return\n for (let d = new Date(this.gantt_start); d <= this.gantt_end; d.setDate(d.getDate() + 1)) {\n if (d.getDay() === 0 || d.getDay() === 6) {\n const x = (date_utils.diff(d, this.gantt_start, 'hour') /\n this.options.step) *\n this.options.column_width;\n const height = (this.options.bar_height + this.options.padding) * this.tasks.length;\n createSVG('rect', {\n x,\n y: this.options.header_height + this.options.padding / 2,\n width: (this.view_is('Day') ? 1 : 2) * this.options.column_width,\n height,\n class: 'holiday-highlight',\n append_to: this.layers.grid,\n });\n }\n }\n }\n\n //compute the horizontal x distance\n computeGridHighlightDimensions(view_mode) {\n let xDist = 0;\n\n if (this.view_is(VIEW_MODE.DAY)) {\n return (\n (date_utils.diff(date_utils.today(), this.gantt_start, \"hour\") /\n this.options.step) *\n this.options.column_width\n );\n }\n\n for (let date of this.dates) {\n const todayDate = new Date();\n const startDate = new Date(date);\n const endDate = new Date(date);\n switch (view_mode) {\n case VIEW_MODE.WEEK:\n endDate.setDate(date.getDate() + 7);\n break;\n case VIEW_MODE.MONTH:\n endDate.setMonth(date.getMonth() + 1);\n break;\n case VIEW_MODE.YEAR:\n endDate.setFullYear(date.getFullYear() + 1);\n break;\n }\n if (todayDate >= startDate && todayDate <= endDate) {\n break;\n } else {\n xDist += this.options.column_width;\n }\n }\n return xDist;\n }\n\n make_grid_highlights() {\n if (this.options.highlight_weekend) this.highlightWeekends()\n // highlight today's | week's | month's | year's\n if (\n this.view_is(VIEW_MODE.DAY) ||\n this.view_is(VIEW_MODE.WEEK) ||\n this.view_is(VIEW_MODE.MONTH) ||\n this.view_is(VIEW_MODE.YEAR)\n ) {\n const x = this.computeGridHighlightDimensions(this.options.view_mode);\n const y = 0;\n const width = this.options.column_width;\n const height =\n (this.options.bar_height + this.options.padding) * this.tasks.length +\n this.options.header_height +\n this.options.padding / 2;\n\n let className = \"\";\n switch (this.options.view_mode) {\n case VIEW_MODE.DAY:\n className = \"today-highlight\";\n break;\n case VIEW_MODE.WEEK:\n className = \"week-highlight\";\n break;\n case VIEW_MODE.MONTH:\n className = \"month-highlight\";\n break;\n case VIEW_MODE.YEAR:\n className = \"year-highlight\";\n break;\n }\n createSVG(\"rect\", {\n x,\n y,\n width,\n height,\n class: className,\n append_to: this.layers.grid,\n });\n }\n }\n\n make_dates() {\n for (let date of this.get_dates_to_draw()) {\n let $lower_text = document.createElement('div');\n $lower_text.classList.add('lower-text')\n $lower_text.style.left = date.lower_x + 'px'\n $lower_text.style.top = date.lower_y + 'px'\n $lower_text.innerText = date.lower_text\n this.$header.appendChild($lower_text)\n\n if (date.upper_text) {\n let $upper_text = document.createElement('div');\n $upper_text.classList.add('lower-text')\n $upper_text.style.left = date.upper_x + 'px'\n $upper_text.style.top = date.upper_y + 'px'\n $upper_text.innerText = date.upper_text\n this.$header.appendChild($upper_text)\n\n // remove out-of-bound dates\n if (date.upper_x > this.layers.grid.getBBox().width) {\n $upper_text.remove();\n }\n }\n }\n }\n\n get_dates_to_draw() {\n let last_date = null;\n const dates = this.dates.map((date, i) => {\n const d = this.get_date_info(date, last_date, i);\n last_date = d;\n return d;\n });\n return dates;\n }\n\n get_date_info(date, last_date_info, i) {\n let last_date = last_date_info ? last_date_info.date : date_utils.add(date, 1, \"day\")\n\n const date_text = {\n Hour_lower: date_utils.format(date, \"HH\", this.options.language),\n \"Quarter Day_lower\": date_utils.format(date, \"HH\", this.options.language),\n \"Half Day_lower\": date_utils.format(date, \"HH\", this.options.language),\n Day_lower:\n date.getDate() !== last_date.getDate()\n ? date_utils.format(date, \"D\", this.options.language)\n : \"\",\n Week_lower:\n date.getMonth() !== last_date.getMonth()\n ? date_utils.format(date, \"D MMM\", this.options.language)\n : date_utils.format(date, \"D\", this.options.language),\n Month_lower: date_utils.format(date, \"MMMM\", this.options.language),\n Year_lower: date_utils.format(date, \"YYYY\", this.options.language),\n Hour_upper:\n date.getDate() !== last_date.getDate()\n ? date_utils.format(date, \"D MMMM\", this.options.language)\n : \"\",\n \"Quarter Day_upper\":\n date.getDate() !== last_date.getDate()\n ? date_utils.format(date, \"D MMM\", this.options.language)\n : \"\",\n \"Half Day_upper\":\n date.getDate() !== last_date.getDate()\n ? date.getMonth() !== last_date.getMonth()\n ? date_utils.format(date, \"D MMM\", this.options.language)\n : date_utils.format(date, \"D\", this.options.language)\n : \"\",\n Day_upper:\n date.getMonth() !== last_date.getMonth()\n ? date_utils.format(date, \"MMMM\", this.options.language)\n : \"\",\n Week_upper:\n date.getMonth() !== last_date.getMonth()\n ? date_utils.format(date, \"MMMM\", this.options.language)\n : \"\",\n Month_upper:\n date.getFullYear() !== last_date.getFullYear()\n ? date_utils.format(date, \"YYYY\", this.options.language)\n : \"\",\n Year_upper:\n date.getFullYear() !== last_date.getFullYear()\n ? date_utils.format(date, \"YYYY\", this.options.language)\n : \"\",\n };\n let column_width = this.view_is(VIEW_MODE.MONTH) ? (date_utils.get_days_in_month(date) * this.options.column_width) / 30 : this.options.column_width;\n const base_pos = {\n x: last_date_info\n ? last_date_info.base_pos_x + last_date_info.column_width\n : 0,\n lower_y: this.options.header_height - 15,\n upper_y: this.options.header_height - 35,\n };\n\n const x_pos = {\n Hour_lower: this.options.column_width / 2,\n Hour_upper: this.options.column_width * 12,\n \"Quarter Day_lower\": this.options.column_width / 2,\n \"Quarter Day_upper\": this.options.column_width * 2,\n \"Half Day_lower\": this.options.column_width / 2,\n \"Half Day_upper\": this.options.column_width,\n Day_lower: this.options.column_width / 2,\n Day_upper: (this.options.column_width * 30) / 2,\n Week_lower: 0,\n Week_upper: (this.options.column_width * 4) / 2,\n Month_lower: column_width / 2,\n Month_upper: (column_width * 12) / 2,\n Year_lower: this.options.column_width / 2,\n Year_upper: (this.options.column_width * 30) / 2,\n };\n console.log(base_pos.x, x_pos[`${this.options.view_mode}_lower`],)\n return {\n date,\n column_width,\n base_pos_x: base_pos.x,\n upper_text: date_text[`${this.options.view_mode}_upper`],\n lower_text: date_text[`${this.options.view_mode}_lower`],\n upper_x: base_pos.x + x_pos[`${this.options.view_mode}_upper`],\n upper_y: base_pos.upper_y,\n lower_x: base_pos.x + x_pos[`${this.options.view_mode}_lower`],\n lower_y: base_pos.lower_y,\n };\n }\n\n make_bars() {\n this.bars = this.tasks.map((task) => {\n const bar = new Bar(this, task);\n this.layers.bar.appendChild(bar.group);\n return bar;\n });\n }\n\n make_arrows() {\n this.arrows = [];\n for (let task of this.tasks) {\n let arrows = [];\n arrows = task.dependencies\n .map((task_id) => {\n const dependency = this.get_task(task_id);\n if (!dependency) return;\n const arrow = new Arrow(\n this,\n this.bars[dependency._index], // from_task\n this.bars[task._index], // to_task\n );\n this.layers.arrow.appendChild(arrow.element);\n return arrow;\n })\n .filter(Boolean); // filter falsy values\n this.arrows = this.arrows.concat(arrows);\n }\n }\n\n map_arrows_on_bars() {\n for (let bar of this.bars) {\n bar.arrows = this.arrows.filter((arrow) => {\n return (\n arrow.from_task.task.id === bar.task.id ||\n arrow.to_task.task.id === bar.task.id\n );\n });\n }\n }\n\n set_width() {\n const cur_width = this.$svg.getBoundingClientRect().width;\n const actual_width = this.$svg.querySelector('.grid .grid-row') ? this.$svg\n .querySelector('.grid .grid-row')\n .getAttribute('width') : 0;\n if (cur_width < actual_width) {\n this.$svg.setAttribute(\"width\", actual_width);\n }\n }\n\n set_scroll_position(date) {\n if (!date) {\n date = this.gantt_start\n }\n\n const parent_element = this.$svg.parentElement;\n if (!parent_element) return;\n\n const hours_before_first_task = date_utils.diff(\n this.get_oldest_starting_date(),\n date,\n \"hour\",\n );\n\n const scroll_pos =\n (hours_before_first_task / this.options.step) *\n this.options.column_width -\n this.options.column_width;\n console.log(parent_element.scrollTo({ left: scroll_pos, behavior: 'smooth' }))\n }\n\n scroll_today() {\n const oldest = this.get_oldest_starting_date().getTime()\n const t = new Date() - oldest\n this.set_scroll_position(new Date(this.gantt_start.getTime() - t))\n }\n\n bind_grid_click() {\n $.on(\n this.$svg,\n this.options.popup_trigger,\n \".grid-row, .grid-header\",\n () => {\n this.unselect_all();\n this.hide_popup();\n },\n );\n }\n\n bind_bar_events() {\n let is_dragging = false;\n let x_on_start = 0;\n let x_on_scroll_start = 0;\n let y_on_start = 0;\n let is_resizing_left = false;\n let is_resizing_right = false;\n let parent_bar_id = null;\n let bars = []; // instanceof Bar\n this.bar_being_dragged = null;\n\n function action_in_progress() {\n return is_dragging || is_resizing_left || is_resizing_right;\n }\n\n $.on(this.$svg, \"mousedown\", \".bar-wrapper, .handle\", (e, element) => {\n const bar_wrapper = $.closest(\".bar-wrapper\", element);\n bars.forEach((bar) => bar.group.classList.remove(\"active\"));\n\n if (element.classList.contains(\"left\")) {\n is_resizing_left = true;\n } else if (element.classList.contains(\"right\")) {\n is_resizing_right = true;\n } else if (element.classList.contains(\"bar-wrapper\")) {\n is_dragging = true;\n }\n\n bar_wrapper.classList.add(\"active\");\n this.popup.parent.classList.add('hidden')\n\n x_on_start = e.offsetX;\n y_on_start = e.offsetY;\n\n parent_bar_id = bar_wrapper.getAttribute(\"data-id\");\n const ids = [\n parent_bar_id,\n ...this.get_all_dependent_tasks(parent_bar_id),\n ];\n bars = ids.map((id) => this.get_bar(id));\n\n this.bar_being_dragged = parent_bar_id;\n\n bars.forEach((bar) => {\n const $bar = bar.$bar;\n $bar.ox = $bar.getX();\n $bar.oy = $bar.getY();\n $bar.owidth = $bar.getWidth();\n $bar.finaldx = 0;\n });\n });\n $.on(this.$container, 'scroll', e => {\n let elements = document.querySelectorAll('.bar-wrapper');\n let localBars = [];\n const ids = [];\n let dx;\n if (x_on_scroll_start) {\n dx = e.currentTarget.scrollLeft - x_on_scroll_start;\n }\n\n Array.prototype.forEach.call(elements, function (el, i) {\n ids.push(el.getAttribute('data-id'));\n });\n\n if (dx) {\n localBars = ids.map(id => this.get_bar(id));\n if (this.options.auto_move_label) {\n localBars.forEach(bar => {\n bar.update_label_position_on_horizontal_scroll({ x: dx, sx: e.currentTarget.scrollLeft });\n });\n }\n }\n\n x_on_scroll_start = e.currentTarget.scrollLeft;\n });\n\n $.on(this.$svg, \"mousemove\", (e) => {\n if (!action_in_progress()) return;\n const dx = e.offsetX - x_on_start;\n const dy = e.offsetY - y_on_start;\n\n bars.forEach((bar) => {\n const $bar = bar.$bar;\n $bar.finaldx = this.get_snap_position(dx);\n this.hide_popup();\n if (is_resizing_left) {\n if (parent_bar_id === bar.task.id) {\n bar.update_bar_position({\n x: $bar.ox + $bar.finaldx,\n width: $bar.owidth - $bar.finaldx,\n });\n } else {\n bar.update_bar_position({\n x: $bar.ox + $bar.finaldx,\n });\n }\n } else if (is_resizing_right) {\n if (parent_bar_id === bar.task.id) {\n bar.update_bar_position({\n width: $bar.owidth + $bar.finaldx,\n });\n }\n } else if (is_dragging && !this.options.readonly) {\n bar.update_bar_position({ x: $bar.ox + $bar.finaldx });\n }\n });\n });\n\n document.addEventListener(\"mouseup\", (e) => {\n\n is_dragging = false;\n is_resizing_left = false;\n is_resizing_right = false;\n });\n\n $.on(this.$svg, \"mouseup\", (e) => {\n this.bar_being_dragged = null;\n bars.forEach((bar) => {\n const $bar = bar.$bar;\n if (!$bar.finaldx) return;\n bar.date_changed();\n bar.set_action_completed();\n });\n });\n\n this.bind_bar_progress();\n }\n\n bind_bar_progress() {\n let x_on_start = 0;\n let y_on_start = 0;\n let is_resizing = null;\n let bar = null;\n let $bar_progress = null;\n let $bar = null;\n\n $.on(this.$svg, \"mousedown\", \".handle.progress\", (e, handle) => {\n is_resizing = true;\n x_on_start = e.offsetX;\n y_on_start = e.offsetY;\n\n const $bar_wrapper = $.closest(\".bar-wrapper\", handle);\n const id = $bar_wrapper.getAttribute(\"data-id\");\n bar = this.get_bar(id);\n\n $bar_progress = bar.$bar_progress;\n $bar = bar.$bar;\n\n $bar_progress.finaldx = 0;\n $bar_progress.owidth = $bar_progress.getWidth();\n $bar_progress.min_dx = -$bar_progress.getWidth();\n $bar_progress.max_dx = $bar.getWidth() - $bar_progress.getWidth();\n });\n\n $.on(this.$svg, \"mousemove\", (e) => {\n if (!is_resizing) return;\n let dx = e.offsetX - x_on_start;\n let dy = e.offsetY - y_on_start;\n\n if (dx > $bar_progress.max_dx) {\n dx = $bar_progress.max_dx;\n }\n if (dx < $bar_progress.min_dx) {\n dx = $bar_progress.min_dx;\n }\n\n const $handle = bar.$handle_progress;\n $.attr($bar_progress, \"width\", $bar_progress.owidth + dx);\n $.attr($handle, \"points\", bar.get_progress_polygon_points());\n $bar_progress.finaldx = dx;\n });\n\n $.on(this.$svg, \"mouseup\", () => {\n is_resizing = false;\n if (!($bar_progress && $bar_progress.finaldx)) return;\n\n $bar_progress.finaldx = 0;\n bar.progress_changed();\n bar.set_action_completed();\n bar = null;\n $bar_progress = null;\n $bar = null;\n });\n }\n\n get_all_dependent_tasks(task_id) {\n let out = [];\n let to_process = [task_id];\n while (to_process.length) {\n const deps = to_process.reduce((acc, curr) => {\n acc = acc.concat(this.dependency_map[curr]);\n return acc;\n }, []);\n\n out = out.concat(deps);\n to_process = deps.filter((d) => !to_process.includes(d));\n }\n\n return out.filter(Boolean);\n }\n\n get_snap_position(dx) {\n let odx = dx,\n rem,\n position;\n\n if (this.view_is(VIEW_MODE.WEEK)) {\n rem = dx % (this.options.column_width / 7);\n position =\n odx -\n rem +\n (rem < this.options.column_width / 14\n ? 0\n : this.options.column_width / 7);\n } else if (this.view_is(VIEW_MODE.MONTH)) {\n rem = dx % (this.options.column_width / 30);\n position =\n odx -\n rem +\n (rem < this.options.column_width / 60\n ? 0\n : this.options.column_width / 30);\n } else {\n rem = dx % this.options.column_width;\n position =\n odx -\n rem +\n (rem < this.options.column_width / 2 ? 0 : this.options.column_width);\n }\n return position;\n }\n\n unselect_all() {\n [...this.$svg.querySelectorAll(\".bar-wrapper\")].forEach((el) => {\n el.classList.remove(\"active\");\n });\n this.popup.parent.classList.remove('hidden')\n }\n\n view_is(modes) {\n if (typeof modes === \"string\") {\n return this.options.view_mode === modes;\n }\n\n if (Array.isArray(modes)) {\n return modes.some((mode) => this.options.view_mode === mode);\n }\n\n return false;\n }\n\n get_task(id) {\n return this.tasks.find((task) => {\n return task.id === id;\n });\n }\n\n get_bar(id) {\n return this.bars.find((bar) => {\n return bar.task.id === id;\n });\n }\n\n show_popup(options) {\n if (!this.popup) {\n this.popup = new Popup(\n this.popup_wrapper,\n this.options.custom_popup_html,\n );\n }\n this.popup.show(options);\n }\n\n hide_popup() {\n this.popup && this.popup.hide();\n }\n\n trigger_event(event, args) {\n if (this.options[\"on_\" + event]) {\n this.options[\"on_\" + event].apply(null, args);\n }\n }\n\n /**\n * Gets the oldest starting date from the list of tasks\n *\n * @returns Date\n * @memberof Gantt\n */\n get_oldest_starting_date() {\n if (!this.tasks.length) return new Date()\n return this.tasks\n .map((task) => task._start)\n .reduce((prev_date, cur_date) =>\n cur_date <= prev_date ? cur_date : prev_date,\n );\n }\n\n /**\n * Clear all elements from the parent svg element\n *\n * @memberof Gantt\n */\n clear() {\n this.$svg.innerHTML = \"\";\n }\n}\n\nGantt.VIEW_MODE = VIEW_MODE;\n\nfunction generate_id(task) {\n return task.name + \"_\" + Math.random().toString(36).slice(2, 12);\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"frappe-gantt.js","sources":["../src/date_utils.js","../src/svg_utils.js","../src/bar.js","../src/arrow.js","../src/popup.js","../src/index.js"],"sourcesContent":["const YEAR = \"year\";\nconst MONTH = \"month\";\nconst DAY = \"day\";\nconst HOUR = \"hour\";\nconst MINUTE = \"minute\";\nconst SECOND = \"second\";\nconst MILLISECOND = \"millisecond\";\n\nconst SHORTENED = {\n January: \"Jan\",\n February: \"Feb\",\n March: \"Mar\",\n April: \"Apr\",\n May: \"May\",\n June: \"Jun\",\n July: \"Jul\",\n August: \"Aug\",\n September: \"Sep\",\n October: \"Oct\",\n November: \"Nov\",\n December: \"Dec\"\n};\n\nexport default {\n parse_duration(duration) {\n const regex = /([0-9])+(y|m|d|h|min|s|ms)/gm;\n const matches = regex.exec(duration);\n\n if (matches !== null) {\n if (matches[2] === \"y\") {\n return { duration: parseInt(matches[1]), scale: `year` };\n } else if (matches[2] === \"m\") {\n return { duration: parseInt(matches[1]), scale: `month` };\n } else if (matches[2] === \"d\") {\n return { duration: parseInt(matches[1]), scale: `day` };\n } else if (matches[2] === \"h\") {\n return { duration: parseInt(matches[1]), scale: `hour` };\n } else if (matches[2] === \"min\") {\n return { duration: parseInt(matches[1]), scale: `minute` };\n } else if (matches[2] === \"s\") {\n return { duration: parseInt(matches[1]), scale: `second` };\n } else if (matches[2] === \"ms\") {\n return { duration: parseInt(matches[1]), scale: `millisecond` };\n }\n }\n },\n parse(date, date_separator = \"-\", time_separator = /[.:]/) {\n if (date instanceof Date) {\n return date;\n }\n if (typeof date === \"string\") {\n let date_parts, time_parts;\n const parts = date.split(\" \");\n date_parts = parts[0]\n .split(date_separator)\n .map((val) => parseInt(val, 10));\n time_parts = parts[1] && parts[1].split(time_separator);\n\n // month is 0 indexed\n date_parts[1] = date_parts[1] ? date_parts[1] - 1 : 0;\n\n let vals = date_parts;\n\n if (time_parts && time_parts.length) {\n if (time_parts.length === 4) {\n time_parts[3] = \"0.\" + time_parts[3];\n time_parts[3] = parseFloat(time_parts[3]) * 1000;\n }\n vals = vals.concat(time_parts);\n }\n return new Date(...vals);\n }\n },\n\n to_string(date, with_time = false) {\n if (!(date instanceof Date)) {\n throw new TypeError(\"Invalid argument type\");\n }\n const vals = this.get_date_values(date).map((val, i) => {\n if (i === 1) {\n // add 1 for month\n val = val + 1;\n }\n\n if (i === 6) {\n return padStart(val + \"\", 3, \"0\");\n }\n\n return padStart(val + \"\", 2, \"0\");\n });\n const date_string = `${vals[0]}-${vals[1]}-${vals[2]}`;\n const time_string = `${vals[3]}:${vals[4]}:${vals[5]}.${vals[6]}`;\n\n return date_string + (with_time ? \" \" + time_string : \"\");\n },\n\n format(date, format_string = \"YYYY-MM-DD HH:mm:ss.SSS\", lang = \"en\") {\n const dateTimeFormat = new Intl.DateTimeFormat(lang, {\n month: \"long\",\n });\n const month_name = dateTimeFormat.format(date);\n const month_name_capitalized =\n month_name.charAt(0).toUpperCase() + month_name.slice(1);\n\n const values = this.get_date_values(date).map((d) => padStart(d, 2, 0));\n const format_map = {\n YYYY: values[0],\n MM: padStart(+values[1] + 1, 2, 0),\n DD: values[2],\n HH: values[3],\n mm: values[4],\n ss: values[5],\n SSS: values[6],\n D: values[2],\n MMMM: month_name_capitalized,\n MMM: SHORTENED[month_name_capitalized],\n };\n\n let str = format_string;\n const formatted_values = [];\n\n Object.keys(format_map)\n .sort((a, b) => b.length - a.length) // big string first\n .forEach((key) => {\n if (str.includes(key)) {\n str = str.replaceAll(key, `$${formatted_values.length}`);\n formatted_values.push(format_map[key]);\n }\n });\n\n formatted_values.forEach((value, i) => {\n str = str.replaceAll(`$${i}`, value);\n });\n\n return str;\n },\n\n diff(date_a, date_b, scale = DAY) {\n let milliseconds, seconds, hours, minutes, days, months, years;\n\n milliseconds = date_a - date_b;\n seconds = milliseconds / 1000;\n minutes = seconds / 60;\n hours = minutes / 60;\n days = hours / 24;\n months = days / 30;\n years = months / 12;\n\n if (!scale.endsWith(\"s\")) {\n scale += \"s\";\n }\n\n return Math.floor(\n {\n milliseconds,\n seconds,\n minutes,\n hours,\n days,\n months,\n years,\n }[scale],\n );\n },\n\n today() {\n const vals = this.get_date_values(new Date()).slice(0, 3);\n return new Date(...vals);\n },\n\n now() {\n return new Date();\n },\n\n add(date, qty, scale) {\n qty = parseInt(qty, 10);\n const vals = [\n date.getFullYear() + (scale === YEAR ? qty : 0),\n date.getMonth() + (scale === MONTH ? qty : 0),\n date.getDate() + (scale === DAY ? qty : 0),\n date.getHours() + (scale === HOUR ? qty : 0),\n date.getMinutes() + (scale === MINUTE ? qty : 0),\n date.getSeconds() + (scale === SECOND ? qty : 0),\n date.getMilliseconds() + (scale === MILLISECOND ? qty : 0),\n ];\n return new Date(...vals);\n },\n\n start_of(date, scale) {\n const scores = {\n [YEAR]: 6,\n [MONTH]: 5,\n [DAY]: 4,\n [HOUR]: 3,\n [MINUTE]: 2,\n [SECOND]: 1,\n [MILLISECOND]: 0,\n };\n\n function should_reset(_scale) {\n const max_score = scores[scale];\n return scores[_scale] <= max_score;\n }\n\n const vals = [\n date.getFullYear(),\n should_reset(YEAR) ? 0 : date.getMonth(),\n should_reset(MONTH) ? 1 : date.getDate(),\n should_reset(DAY) ? 0 : date.getHours(),\n should_reset(HOUR) ? 0 : date.getMinutes(),\n should_reset(MINUTE) ? 0 : date.getSeconds(),\n should_reset(SECOND) ? 0 : date.getMilliseconds(),\n ];\n\n return new Date(...vals);\n },\n\n clone(date) {\n return new Date(...this.get_date_values(date));\n },\n\n get_date_values(date) {\n return [\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds(),\n ];\n },\n\n get_days_in_month(date) {\n const no_of_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\n const month = date.getMonth();\n\n if (month !== 1) {\n return no_of_days[month];\n }\n\n // Feb\n const year = date.getFullYear();\n if ((year % 4 === 0 && year % 100 != 0) || year % 400 === 0) {\n return 29;\n }\n return 28;\n },\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart\nfunction padStart(str, targetLength, padString) {\n str = str + \"\";\n targetLength = targetLength >> 0;\n padString = String(typeof padString !== \"undefined\" ? padString : \" \");\n if (str.length > targetLength) {\n return String(str);\n } else {\n targetLength = targetLength - str.length;\n if (targetLength > padString.length) {\n padString += padString.repeat(targetLength / padString.length);\n }\n return padString.slice(0, targetLength) + String(str);\n }\n}\n","export function $(expr, con) {\n return typeof expr === \"string\"\n ? (con || document).querySelector(expr)\n : expr || null;\n}\n\nexport function createSVG(tag, attrs) {\n const elem = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n for (let attr in attrs) {\n if (attr === \"append_to\") {\n const parent = attrs.append_to;\n parent.appendChild(elem);\n } else if (attr === \"innerHTML\") {\n elem.innerHTML = attrs.innerHTML;\n } else if (attr === 'clipPath') {\n elem.setAttribute('clip-path', 'url(#' + attrs[attr] + ')');\n } else {\n elem.setAttribute(attr, attrs[attr]);\n }\n }\n return elem;\n}\n\nexport function animateSVG(svgElement, attr, from, to) {\n const animatedSvgElement = getAnimationElement(svgElement, attr, from, to);\n\n if (animatedSvgElement === svgElement) {\n // triggered 2nd time programmatically\n // trigger artificial click event\n const event = document.createEvent(\"HTMLEvents\");\n event.initEvent(\"click\", true, true);\n event.eventName = \"click\";\n animatedSvgElement.dispatchEvent(event);\n }\n}\n\nfunction getAnimationElement(\n svgElement,\n attr,\n from,\n to,\n dur = \"0.4s\",\n begin = \"0.1s\",\n) {\n const animEl = svgElement.querySelector(\"animate\");\n if (animEl) {\n $.attr(animEl, {\n attributeName: attr,\n from,\n to,\n dur,\n begin: \"click + \" + begin, // artificial click\n });\n return svgElement;\n }\n\n const animateElement = createSVG(\"animate\", {\n attributeName: attr,\n from,\n to,\n dur,\n begin,\n calcMode: \"spline\",\n values: from + \";\" + to,\n keyTimes: \"0; 1\",\n keySplines: cubic_bezier(\"ease-out\"),\n });\n svgElement.appendChild(animateElement);\n\n return svgElement;\n}\n\nfunction cubic_bezier(name) {\n return {\n ease: \".25 .1 .25 1\",\n linear: \"0 0 1 1\",\n \"ease-in\": \".42 0 1 1\",\n \"ease-out\": \"0 0 .58 1\",\n \"ease-in-out\": \".42 0 .58 1\",\n }[name];\n}\n\n$.on = (element, event, selector, callback) => {\n if (!callback) {\n callback = selector;\n $.bind(element, event, callback);\n } else {\n $.delegate(element, event, selector, callback);\n }\n};\n\n$.off = (element, event, handler) => {\n element.removeEventListener(event, handler);\n};\n\n$.bind = (element, event, callback) => {\n event.split(/\\s+/).forEach(function (event) {\n element.addEventListener(event, callback);\n });\n};\n\n$.delegate = (element, event, selector, callback) => {\n element.addEventListener(event, function (e) {\n const delegatedTarget = e.target.closest(selector);\n if (delegatedTarget) {\n e.delegatedTarget = delegatedTarget;\n callback.call(this, e, delegatedTarget);\n }\n });\n};\n\n$.closest = (selector, element) => {\n if (!element) return null;\n\n if (element.matches(selector)) {\n return element;\n }\n\n return $.closest(selector, element.parentNode);\n};\n\n$.attr = (element, attr, value) => {\n if (!value && typeof attr === \"string\") {\n return element.getAttribute(attr);\n }\n\n if (typeof attr === \"object\") {\n for (let key in attr) {\n $.attr(element, key, attr[key]);\n }\n return;\n }\n\n element.setAttribute(attr, value);\n};\n","import date_utils from \"./date_utils\";\nimport { $, createSVG, animateSVG } from \"./svg_utils\";\n\nexport default class Bar {\n constructor(gantt, task) {\n this.set_defaults(gantt, task);\n this.prepare();\n this.draw();\n this.bind();\n }\n\n set_defaults(gantt, task) {\n this.action_completed = false;\n this.gantt = gantt;\n this.task = task;\n }\n\n prepare() {\n this.prepare_values();\n this.prepare_helpers();\n }\n\n prepare_values() {\n this.invalid = this.task.invalid;\n this.height = this.gantt.options.bar_height;\n this.image_size = this.height - 5;\n this.compute_x();\n this.compute_y();\n this.compute_duration();\n this.corner_radius = this.gantt.options.bar_corner_radius;\n this.width = this.gantt.options.column_width * this.duration;\n this.progress_width =\n this.gantt.options.column_width *\n this.duration *\n (this.task.progress / 100) || 0;\n this.group = createSVG(\"g\", {\n class: \"bar-wrapper\" + (this.task.custom_class ? \" \" + this.task.custom_class : \"\") + (this.task.important ? ' important' : ''),\n \"data-id\": this.task.id,\n });\n this.bar_group = createSVG(\"g\", {\n class: \"bar-group\",\n append_to: this.group,\n });\n this.handle_group = createSVG(\"g\", {\n class: \"handle-group\",\n append_to: this.group,\n });\n }\n\n prepare_helpers() {\n SVGElement.prototype.getX = function () {\n return +this.getAttribute(\"x\");\n };\n SVGElement.prototype.getY = function () {\n return +this.getAttribute(\"y\");\n };\n SVGElement.prototype.getWidth = function () {\n return +this.getAttribute(\"width\");\n };\n SVGElement.prototype.getHeight = function () {\n return +this.getAttribute(\"height\");\n };\n SVGElement.prototype.getEndX = function () {\n return this.getX() + this.getWidth();\n };\n }\n\n prepare_expected_progress_values() {\n this.compute_expected_progress();\n this.expected_progress_width =\n this.gantt.options.column_width *\n this.duration *\n (this.expected_progress / 100) || 0;\n }\n\n draw() {\n this.draw_bar();\n this.draw_progress_bar();\n if (this.gantt.options.show_expected_progress) {\n this.prepare_expected_progress_values();\n this.draw_expected_progress_bar();\n }\n this.draw_label();\n this.draw_resize_handles();\n\n if (this.task.thumbnail) {\n this.draw_thumbnail();\n }\n }\n\n draw_bar() {\n this.$bar = createSVG(\"rect\", {\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"bar\",\n append_to: this.bar_group,\n });\n\n animateSVG(this.$bar, \"width\", 0, this.width);\n\n if (this.invalid) {\n this.$bar.classList.add(\"bar-invalid\");\n }\n }\n\n draw_expected_progress_bar() {\n if (this.invalid) return;\n this.$expected_bar_progress = createSVG(\"rect\", {\n x: this.x,\n y: this.y,\n width: this.expected_progress_width,\n height: this.height,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"bar-expected-progress\",\n append_to: this.bar_group,\n });\n\n animateSVG(\n this.$expected_bar_progress,\n \"width\",\n 0,\n this.expected_progress_width,\n );\n }\n\n draw_progress_bar() {\n if (this.invalid) return;\n this.$bar_progress = createSVG(\"rect\", {\n x: this.x,\n y: this.y,\n width: this.progress_width,\n height: this.height,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"bar-progress\",\n append_to: this.bar_group,\n });\n const x = (date_utils.diff(this.task._start, this.gantt.gantt_start, 'hour') /\n this.gantt.options.step) *\n this.gantt.options.column_width;\n\n this.$date_highlight = createSVG(\"rect\", {\n x,\n y: this.gantt.options.header_height - 17,\n width: this.width,\n height: this.height * 0.8,\n rx: 12,\n class: \"date-highlight\",\n append_to: this.bar_group,\n });\n\n\n animateSVG(this.$bar_progress, \"width\", 0, this.progress_width);\n }\n\n draw_label() {\n let x_coord = this.x + this.$bar.getWidth() / 2;\n\n if (this.task.thumbnail) {\n x_coord = this.x + this.image_size + 5;\n }\n\n createSVG(\"text\", {\n x: x_coord,\n y: this.y + this.height / 2,\n innerHTML: this.task.name,\n class: \"bar-label\",\n append_to: this.bar_group,\n });\n // labels get BBox in the next tick\n requestAnimationFrame(() => this.update_label_position());\n }\n draw_thumbnail() {\n let x_offset = 10, y_offset = 2;\n let defs, clipPath;\n\n defs = createSVG('defs', {\n append_to: this.bar_group\n });\n\n createSVG('rect', {\n id: 'rect_' + this.task.id,\n x: this.x + x_offset,\n y: this.y + y_offset,\n width: this.image_size,\n height: this.image_size,\n rx: '15',\n class: 'img_mask',\n append_to: defs\n });\n\n clipPath = createSVG('clipPath', {\n id: 'clip_' + this.task.id,\n append_to: defs\n });\n\n createSVG('use', {\n href: '#rect_' + this.task.id,\n append_to: clipPath\n });\n\n createSVG('image', {\n x: this.x + x_offset,\n y: this.y + y_offset,\n width: this.image_size,\n height: this.image_size,\n class: 'bar-img',\n href: this.task.thumbnail,\n clipPath: 'clip_' + this.task.id,\n append_to: this.bar_group\n });\n }\n\n draw_resize_handles() {\n if (this.invalid || this.gantt.options.readonly) return;\n\n const bar = this.$bar;\n const handle_width = 8;\n\n createSVG(\"rect\", {\n x: bar.getX() + bar.getWidth() + handle_width - 4,\n y: bar.getY() + 1,\n width: handle_width,\n height: this.height - 2,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"handle right\",\n append_to: this.handle_group,\n });\n\n createSVG(\"rect\", {\n x: bar.getX() - handle_width - 4,\n y: bar.getY() + 1,\n width: handle_width,\n height: this.height - 2,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"handle left\",\n append_to: this.handle_group,\n });\n\n this.$handle_progress = createSVG(\"polygon\", {\n points: this.get_progress_polygon_points().join(\",\"),\n class: \"handle progress\",\n append_to: this.handle_group,\n });\n }\n\n get_progress_polygon_points() {\n const bar_progress = this.$bar_progress;\n return [\n bar_progress.getEndX() - 6,\n bar_progress.getY() + bar_progress.getHeight() + 8,\n bar_progress.getEndX() + 6,\n bar_progress.getY() + bar_progress.getHeight() + 8,\n bar_progress.getEndX(),\n bar_progress.getY() + bar_progress.getHeight() + 0.5,\n ];\n }\n\n bind() {\n if (this.invalid) return;\n this.setup_click_event();\n }\n\n setup_click_event() {\n let in_action = false;\n $.on(this.group, \"mouseover\", (e) => this.gantt.trigger_event(\"hover\", [this.task, e.screenX, e.screenY, e]))\n $.on(this.group, \"mouseenter\", (e) => this.show_popup(e.offsetX))\n $.on(this.group, \"mouseleave\", () => this.gantt.hide_popup())\n\n\n $.on(this.group, \"focus \" + this.gantt.options.popup_trigger, (e) => {\n this.gantt.trigger_event(\"click\", [this.task]);\n });\n\n $.on(this.group, \"dblclick\", (e) => {\n if (this.action_completed) {\n // just finished a move action, wait for a few seconds\n return;\n }\n\n this.gantt.trigger_event(\"double_click\", [this.task]);\n });\n }\n\n show_popup(x) {\n if (this.gantt.bar_being_dragged) return;\n\n const start_date = date_utils.format(\n this.task._start,\n \"MMM D\",\n this.gantt.options.language,\n );\n const end_date = date_utils.format(\n date_utils.add(this.task._end, -1, \"second\"),\n \"MMM D\",\n this.gantt.options.language,\n );\n const subtitle = `${start_date} - ${end_date}
Progress: ${this.task.progress}`;\n\n this.gantt.show_popup({\n x,\n target_element: this.$bar,\n title: this.task.name,\n subtitle: subtitle,\n task: this.task,\n });\n }\n\n update_bar_position({ x = null, width = null }) {\n const bar = this.$bar;\n if (x) {\n // get all x values of parent task\n const xs = this.task.dependencies.map((dep) => {\n return this.gantt.get_bar(dep).$bar.getX();\n });\n // child task must not go before parent\n const valid_x = xs.reduce((prev, curr) => {\n return x >= curr;\n }, x);\n if (!valid_x) {\n width = null;\n return;\n }\n this.update_attr(bar, \"x\", x);\n this.update_attr(this.$date_highlight, \"x\", x);\n }\n if (width) {\n this.update_attr(bar, \"width\", width);\n this.update_attr(this.$date_highlight, \"width\", width);\n }\n this.update_label_position();\n this.update_handle_position();\n if (this.gantt.options.show_expected_progress) {\n this.date_changed();\n this.compute_duration();\n this.update_expected_progressbar_position();\n }\n this.update_progressbar_position();\n this.update_arrow_position();\n }\n\n update_label_position_on_horizontal_scroll({ x, sx }) {\n const container = document.querySelector('.gantt-container');\n const label = this.group.querySelector('.bar-label');\n const img = this.group.querySelector('.bar-img') || '';\n const img_mask = this.bar_group.querySelector('.img_mask') || '';\n\n let barWidthLimit = this.$bar.getX() + this.$bar.getWidth();\n let newLabelX = label.getX() + x;\n let newImgX = img && img.getX() + x || 0;\n let imgWidth = img && img.getBBox().width + 7 || 7;\n let labelEndX = newLabelX + label.getBBox().width + 7;\n let viewportCentral = sx + container.clientWidth / 2;\n\n if (label.classList.contains('big')) return;\n\n if (labelEndX < barWidthLimit && x > 0 && labelEndX < viewportCentral) {\n label.setAttribute('x', newLabelX);\n if (img) {\n img.setAttribute('x', newImgX);\n img_mask.setAttribute('x', newImgX);\n }\n } else if ((newLabelX - imgWidth) > this.$bar.getX() && x < 0 && labelEndX > viewportCentral) {\n label.setAttribute('x', newLabelX);\n if (img) {\n img.setAttribute('x', newImgX);\n img_mask.setAttribute('x', newImgX);\n }\n\n }\n }\n\n date_changed() {\n let changed = false;\n const { new_start_date, new_end_date } = this.compute_start_end_date();\n\n if (Number(this.task._start) !== Number(new_start_date)) {\n changed = true;\n this.task._start = new_start_date;\n }\n\n if (Number(this.task._end) !== Number(new_end_date)) {\n changed = true;\n this.task._end = new_end_date;\n }\n\n if (!changed) return;\n\n this.gantt.trigger_event(\"date_change\", [\n this.task,\n new_start_date,\n date_utils.add(new_end_date, -1, \"second\"),\n ]);\n }\n\n progress_changed() {\n const new_progress = this.compute_progress();\n this.task.progress = new_progress;\n this.gantt.trigger_event(\"progress_change\", [this.task, new_progress]);\n }\n\n set_action_completed() {\n this.action_completed = true;\n setTimeout(() => (this.action_completed = false), 1000);\n }\n\n compute_start_end_date() {\n const bar = this.$bar;\n const x_in_units = bar.getX() / this.gantt.options.column_width;\n const new_start_date = date_utils.add(\n this.gantt.gantt_start,\n x_in_units * this.gantt.options.step,\n \"hour\",\n );\n const width_in_units = bar.getWidth() / this.gantt.options.column_width;\n const new_end_date = date_utils.add(\n new_start_date,\n width_in_units * this.gantt.options.step,\n \"hour\",\n );\n\n return { new_start_date, new_end_date };\n }\n\n compute_progress() {\n const progress =\n (this.$bar_progress.getWidth() / this.$bar.getWidth()) * 100;\n return parseInt(progress, 10);\n }\n\n compute_expected_progress() {\n this.expected_progress =\n date_utils.diff(date_utils.today(), this.task._start, \"hour\") /\n this.gantt.options.step;\n this.expected_progress =\n ((this.expected_progress < this.duration\n ? this.expected_progress\n : this.duration) *\n 100) /\n this.duration;\n }\n\n compute_x() {\n const { step, column_width } = this.gantt.options;\n const task_start = this.task._start;\n const gantt_start = this.gantt.gantt_start;\n\n const diff = date_utils.diff(task_start, gantt_start, \"hour\");\n let x = (diff / step) * column_width;\n\n if (this.gantt.view_is(\"Month\")) {\n const diff = date_utils.diff(task_start, gantt_start, \"day\");\n x = (diff * column_width) / 30;\n }\n this.x = x;\n }\n\n compute_y() {\n this.y =\n this.gantt.options.header_height +\n this.gantt.options.padding +\n this.task._index * (this.height + this.gantt.options.padding);\n }\n\n compute_duration() {\n this.duration =\n date_utils.diff(this.task._end, this.task._start, \"hour\") /\n this.gantt.options.step;\n }\n\n get_snap_position(dx) {\n let odx = dx,\n rem,\n position;\n\n if (this.gantt.view_is(\"Week\")) {\n rem = dx % (this.gantt.options.column_width / 7);\n position =\n odx -\n rem +\n (rem < this.gantt.options.column_width / 14\n ? 0\n : this.gantt.options.column_width / 7);\n } else if (this.gantt.view_is(\"Month\")) {\n rem = dx % (this.gantt.options.column_width / 30);\n position =\n odx -\n rem +\n (rem < this.gantt.options.column_width / 60\n ? 0\n : this.gantt.options.column_width / 30);\n } else {\n rem = dx % this.gantt.options.column_width;\n position =\n odx -\n rem +\n (rem < this.gantt.options.column_width / 2\n ? 0\n : this.gantt.options.column_width);\n }\n return position;\n }\n\n update_attr(element, attr, value) {\n value = +value;\n if (!isNaN(value)) {\n element.setAttribute(attr, value);\n }\n return element;\n }\n\n update_expected_progressbar_position() {\n if (this.invalid) return;\n this.$expected_bar_progress.setAttribute(\"x\", this.$bar.getX());\n this.compute_expected_progress();\n this.$expected_bar_progress.setAttribute(\n \"width\",\n this.gantt.options.column_width *\n this.duration *\n (this.expected_progress / 100) || 0,\n );\n }\n\n update_progressbar_position() {\n if (this.invalid || this.gantt.options.readonly) return;\n this.$bar_progress.setAttribute(\"x\", this.$bar.getX());\n this.$bar_progress.setAttribute(\n \"width\",\n this.$bar.getWidth() * (this.task.progress / 100),\n );\n }\n\n update_label_position() {\n const img_mask = this.bar_group.querySelector('.img_mask') || '';\n const bar = this.$bar,\n label = this.group.querySelector(\".bar-label\"),\n img = this.group.querySelector('.bar-img');\n\n\n let padding = 5;\n let x_offset_label_img = this.image_size + 10;\n const labelWidth = label.getBBox().width\n const barWidth = bar.getWidth()\n if (labelWidth > barWidth) {\n label.classList.add(\"big\");\n if (img) {\n img.setAttribute('x', bar.getX() + bar.getWidth() + padding);\n img_mask.setAttribute('x', bar.getX() + bar.getWidth() + padding);\n label.setAttribute('x', bar.getX() + bar.getWidth() + x_offset_label_img);\n } else {\n label.setAttribute('x', bar.getX() + bar.getWidth() + padding);\n }\n } else {\n label.classList.remove(\"big\");\n if (img) {\n img.setAttribute('x', bar.getX() + padding);\n img_mask.setAttribute('x', bar.getX() + padding);\n label.setAttribute('x', bar.getX() + barWidth / 2 + x_offset_label_img);\n } else {\n label.setAttribute('x', bar.getX() + barWidth / 2 - labelWidth / 2);\n }\n }\n }\n\n update_handle_position() {\n if (this.invalid || this.gantt.options.readonly) return;\n const bar = this.$bar;\n this.handle_group\n .querySelector(\".handle.left\")\n .setAttribute(\"x\", bar.getX() - 12);\n this.handle_group\n .querySelector(\".handle.right\")\n .setAttribute(\"x\", bar.getEndX() + 4);\n const handle = this.group.querySelector(\".handle.progress\");\n handle && handle.setAttribute(\"points\", this.get_progress_polygon_points());\n }\n\n update_arrow_position() {\n this.arrows = this.arrows || [];\n for (let arrow of this.arrows) {\n arrow.update();\n }\n }\n}\n\nfunction isFunction(functionToCheck) {\n let getType = {};\n return (\n functionToCheck &&\n getType.toString.call(functionToCheck) === \"[object Function]\"\n );\n}\n","import { createSVG } from \"./svg_utils\";\n\nexport default class Arrow {\n constructor(gantt, from_task, to_task) {\n this.gantt = gantt;\n this.from_task = from_task;\n this.to_task = to_task;\n\n this.calculate_path();\n this.draw();\n }\n\n calculate_path() {\n let start_x =\n this.from_task.$bar.getX() + this.from_task.$bar.getWidth() / 2;\n\n const condition = () =>\n this.to_task.$bar.getX() < start_x + this.gantt.options.padding &&\n start_x > this.from_task.$bar.getX() + this.gantt.options.padding;\n\n while (condition()) {\n start_x -= 10;\n }\n\n const start_y =\n this.gantt.options.header_height +\n this.gantt.options.bar_height +\n (this.gantt.options.padding + this.gantt.options.bar_height) *\n this.from_task.task._index +\n this.gantt.options.padding;\n\n const end_x = this.to_task.$bar.getX() - this.gantt.options.padding / 2 - 7;\n const end_y =\n this.gantt.options.header_height +\n this.gantt.options.bar_height / 2 +\n (this.gantt.options.padding + this.gantt.options.bar_height) *\n this.to_task.task._index +\n this.gantt.options.padding;\n\n const from_is_below_to =\n this.from_task.task._index > this.to_task.task._index;\n const curve = this.gantt.options.arrow_curve;\n const clockwise = from_is_below_to ? 1 : 0;\n const curve_y = from_is_below_to ? -curve : curve;\n const offset = from_is_below_to\n ? end_y + this.gantt.options.arrow_curve\n : end_y - this.gantt.options.arrow_curve;\n\n this.path = `\n M ${start_x} ${start_y}\n V ${offset}\n a ${curve} ${curve} 0 0 ${clockwise} ${curve} ${curve_y}\n L ${end_x} ${end_y}\n m -5 -5\n l 5 5\n l -5 5`;\n\n if (\n this.to_task.$bar.getX() <\n this.from_task.$bar.getX() + this.gantt.options.padding\n ) {\n const down_1 = this.gantt.options.padding / 2 - curve;\n const down_2 =\n this.to_task.$bar.getY() + this.to_task.$bar.getHeight() / 2 - curve_y;\n const left = this.to_task.$bar.getX() - this.gantt.options.padding;\n\n this.path = `\n M ${start_x} ${start_y}\n v ${down_1}\n a ${curve} ${curve} 0 0 1 -${curve} ${curve}\n H ${left}\n a ${curve} ${curve} 0 0 ${clockwise} -${curve} ${curve_y}\n V ${down_2}\n a ${curve} ${curve} 0 0 ${clockwise} ${curve} ${curve_y}\n L ${end_x} ${end_y}\n m -5 -5\n l 5 5\n l -5 5`;\n }\n }\n\n draw() {\n this.element = createSVG(\"path\", {\n d: this.path,\n \"data-from\": this.from_task.task.id,\n \"data-to\": this.to_task.task.id,\n });\n }\n\n update() {\n this.calculate_path();\n this.element.setAttribute(\"d\", this.path);\n }\n}\n","export default class Popup {\n constructor(parent, custom_html) {\n this.parent = parent;\n this.custom_html = custom_html;\n this.make();\n }\n\n make() {\n this.parent.innerHTML = `\n
\n
\n
\n `;\n\n this.hide();\n\n this.title = this.parent.querySelector(\".title\");\n this.subtitle = this.parent.querySelector(\".subtitle\");\n this.pointer = this.parent.querySelector(\".pointer\");\n }\n\n show(options) {\n if (!options.target_element) {\n throw new Error(\"target_element is required to show popup\");\n }\n const target_element = options.target_element;\n\n if (this.custom_html) {\n let html = this.custom_html(options.task);\n html += '
';\n this.parent.innerHTML = html;\n this.pointer = this.parent.querySelector(\".pointer\");\n } else {\n // set data\n this.title.innerHTML = options.title;\n this.subtitle.innerHTML = options.subtitle;\n }\n\n // set position\n let position_meta;\n if (target_element instanceof HTMLElement) {\n position_meta = target_element.getBoundingClientRect();\n } else if (target_element instanceof SVGElement) {\n position_meta = options.target_element.getBBox();\n }\n\n this.parent.style.left = options.x - this.parent.clientWidth / 2 + \"px\";\n this.parent.style.top = position_meta.y + position_meta.height + 10 + \"px\";\n\n this.pointer.style.left = this.parent.clientWidth / 2 + \"px\";\n this.pointer.style.top = \"-15px\";\n\n // show\n this.parent.style.opacity = 1;\n }\n\n hide() {\n this.parent.style.opacity = 0;\n this.parent.style.left = 0;\n }\n}\n","import date_utils from \"./date_utils\";\nimport { $, createSVG } from \"./svg_utils\";\nimport Bar from \"./bar\";\nimport Arrow from \"./arrow\";\nimport Popup from \"./popup\";\n\nimport \"./gantt.scss\";\n\nconst VIEW_MODE = {\n HOUR: \"Hour\",\n QUARTER_DAY: \"Quarter Day\",\n HALF_DAY: \"Half Day\",\n DAY: \"Day\",\n WEEK: \"Week\",\n MONTH: \"Month\",\n YEAR: \"Year\",\n};\n\nconst VIEW_MODE_PADDING = {\n HOUR: [\"7d\", \"7d\"],\n QUARTER_DAY: [\"7d\", \"7d\"],\n HALF_DAY: [\"7d\", \"7d\"],\n DAY: [\"1m\", \"1m\"],\n WEEK: [\"1m\", \"1m\"],\n MONTH: [\"1m\", \"1m\"],\n YEAR: [\"2y\", \"2y\"],\n};\n\nexport default class Gantt {\n constructor(wrapper, tasks, options) {\n this.setup_wrapper(wrapper);\n this.setup_options(options);\n this.setup_tasks(tasks);\n // initialize with default view mode\n this.change_view_mode();\n this.bind_events();\n }\n\n setup_wrapper(element) {\n let svg_element, wrapper_element;\n\n // CSS Selector is passed\n if (typeof element === \"string\") {\n element = document.querySelector(element);\n }\n\n // get the SVGElement\n if (element instanceof HTMLElement) {\n wrapper_element = element;\n svg_element = element.querySelector(\"svg\");\n } else if (element instanceof SVGElement) {\n svg_element = element;\n } else {\n throw new TypeError(\n \"Frappé Gantt only supports usage of a string CSS selector,\" +\n \" HTML DOM element or SVG DOM element for the 'element' parameter\",\n );\n }\n\n // svg element\n if (!svg_element) {\n // create it\n this.$svg = createSVG(\"svg\", {\n append_to: wrapper_element,\n class: \"gantt\",\n });\n } else {\n this.$svg = svg_element;\n this.$svg.classList.add(\"gantt\");\n }\n\n // wrapper element\n this.$container = document.createElement(\"div\");\n this.$container.classList.add(\"gantt-container\");\n\n const parent_element = this.$svg.parentElement;\n parent_element.appendChild(this.$container);\n this.$container.appendChild(this.$svg);\n\n // popup wrapper\n this.popup_wrapper = document.createElement(\"div\");\n this.popup_wrapper.classList.add(\"popup-wrapper\");\n this.$container.appendChild(this.popup_wrapper);\n }\n\n setup_options(options) {\n const default_options = {\n header_height: 50,\n column_width: 30,\n step: 24,\n view_modes: [...Object.values(VIEW_MODE)],\n bar_height: 30,\n bar_corner_radius: 3,\n arrow_curve: 5,\n padding: 18,\n view_mode: \"Day\",\n date_format: \"YYYY-MM-DD\",\n popup_trigger: \"click\",\n custom_popup_html: null,\n language: \"en\",\n readonly: false,\n highlight_weekend: true,\n scroll_today: true,\n lines: 'both',\n auto_move_label: true,\n };\n this.options = Object.assign({}, default_options, options);\n if (!options.view_mode_padding) options.view_mode_padding = {}\n for (let [key, value] of Object.entries(options.view_mode_padding)) {\n if (typeof value === \"string\") {\n // Configure for single value given\n options.view_mode_padding[key] = [value, value];\n }\n }\n\n this.options.view_mode_padding = {\n ...VIEW_MODE_PADDING,\n ...options.view_mode_padding,\n };\n }\n\n setup_tasks(tasks) {\n // prepare tasks\n this.tasks = tasks.map((task, i) => {\n // convert to Date objects\n task._start = date_utils.parse(task.start);\n if (task.end === undefined && task.duration !== undefined) {\n task.end = task._start;\n let durations = task.duration.split(\" \");\n\n durations.forEach((tmpDuration) => {\n let { duration, scale } = date_utils.parse_duration(tmpDuration);\n task.end = date_utils.add(task.end, duration, scale);\n });\n }\n task._end = date_utils.parse(task.end);\n let diff = date_utils.diff(task._end, task._start, \"year\");\n if (diff < 0) {\n throw Error(\"start of task can't be after end of task: in task #, \" + (i + 1))\n }\n // make task invalid if duration too large\n if (date_utils.diff(task._end, task._start, \"year\") > 10) {\n task.end = null;\n }\n\n\n // cache index\n task._index = i;\n\n // invalid dates\n if (!task.start && !task.end) {\n const today = date_utils.today();\n task._start = today;\n task._end = date_utils.add(today, 2, \"day\");\n }\n\n if (!task.start && task.end) {\n task._start = date_utils.add(task._end, -2, \"day\");\n }\n\n if (task.start && !task.end) {\n task._end = date_utils.add(task._start, 2, \"day\");\n }\n\n // if hours is not set, assume the last day is full day\n // e.g: 2018-09-09 becomes 2018-09-09 23:59:59\n const task_end_values = date_utils.get_date_values(task._end);\n if (task_end_values.slice(3).every((d) => d === 0)) {\n task._end = date_utils.add(task._end, 24, \"hour\");\n }\n\n // invalid flag\n if (!task.start || !task.end) {\n task.invalid = true;\n }\n\n // dependencies\n if (typeof task.dependencies === \"string\" || !task.dependencies) {\n let deps = [];\n if (task.dependencies) {\n deps = task.dependencies\n .split(\",\")\n .map((d) => d.trim().replaceAll(' ', '_'))\n .filter((d) => d);\n }\n task.dependencies = deps;\n }\n\n // uids\n if (!task.id) {\n task.id = generate_id(task);\n } else if (typeof task.id === 'string') {\n task.id = task.id.replaceAll(' ', '_')\n } else {\n task.id = `${task.id}`\n }\n\n return task;\n });\n\n this.setup_dependencies();\n }\n\n setup_dependencies() {\n this.dependency_map = {};\n for (let t of this.tasks) {\n for (let d of t.dependencies) {\n this.dependency_map[d] = this.dependency_map[d] || [];\n this.dependency_map[d].push(t.id);\n }\n }\n }\n\n refresh(tasks) {\n this.setup_tasks(tasks);\n this.change_view_mode();\n }\n\n change_view_mode(mode = this.options.view_mode) {\n this.update_view_scale(mode);\n this.setup_dates();\n this.render();\n // fire viewmode_change event\n this.trigger_event(\"view_change\", [mode]);\n }\n\n update_view_scale(view_mode) {\n this.options.view_mode = view_mode;\n if (view_mode === VIEW_MODE.HOUR) {\n this.options.step = 24 / 24;\n this.options.column_width = 38;\n } else if (view_mode === VIEW_MODE.DAY) {\n this.options.step = 24;\n this.options.column_width = 38;\n } else if (view_mode === VIEW_MODE.HALF_DAY) {\n this.options.step = 24 / 2;\n this.options.column_width = 38;\n } else if (view_mode === VIEW_MODE.QUARTER_DAY) {\n this.options.step = 24 / 4;\n this.options.column_width = 38;\n } else if (view_mode === VIEW_MODE.WEEK) {\n this.options.step = 24 * 7;\n this.options.column_width = 140;\n } else if (view_mode === VIEW_MODE.MONTH) {\n this.options.step = 24 * 30;\n this.options.column_width = 120;\n } else if (view_mode === VIEW_MODE.YEAR) {\n this.options.step = 24 * 365;\n this.options.column_width = 120;\n }\n }\n\n setup_dates() {\n this.setup_gantt_dates();\n this.setup_date_values();\n }\n\n setup_gantt_dates() {\n this.gantt_start = this.gantt_end = null;\n\n for (let task of this.tasks) {\n // set global start and end date\n if (!this.gantt_start || task._start < this.gantt_start) {\n this.gantt_start = task._start;\n }\n if (!this.gantt_end || task._end > this.gantt_end) {\n this.gantt_end = task._end;\n }\n }\n let gantt_start, gantt_end;\n if (!this.gantt_start) gantt_start = new Date();\n else gantt_start = date_utils.start_of(this.gantt_start, \"day\");\n if (!this.gantt_end) gantt_end = new Date();\n else gantt_end = date_utils.start_of(this.gantt_end, \"day\");\n\n // add date padding on both sides\n let viewKey;\n for (let [key, value] of Object.entries(VIEW_MODE)) {\n if (value === this.options.view_mode) {\n viewKey = key;\n }\n }\n const [padding_start, padding_end] = this.options.view_mode_padding[\n viewKey\n ].map(date_utils.parse_duration);\n gantt_start = date_utils.add(\n gantt_start,\n -padding_start.duration,\n padding_start.scale,\n );\n\n let format_string;\n if (this.view_is(VIEW_MODE.YEAR)) {\n format_string = \"YYYY\"\n } else if (this.view_is(VIEW_MODE.MONTH)) {\n format_string = \"YYYY-MM\"\n } else if (this.view_is(VIEW_MODE.DAY)) {\n format_string = \"YYYY-MM-DD\"\n } else {\n format_string = \"YYYY-MM-DD HH\"\n }\n this.gantt_start = date_utils.parse(date_utils.format(gantt_start, format_string));\n this.gantt_start.setHours(0, 0, 0, 0)\n this.gantt_end = date_utils.add(\n gantt_end,\n padding_end.duration,\n padding_end.scale,\n );\n }\n\n setup_date_values() {\n this.dates = [];\n let cur_date = null;\n\n while (cur_date === null || cur_date < this.gantt_end) {\n if (!cur_date) {\n cur_date = date_utils.clone(this.gantt_start);\n } else {\n if (this.view_is(VIEW_MODE.YEAR)) {\n cur_date = date_utils.add(cur_date, 1, \"year\");\n } else if (this.view_is(VIEW_MODE.MONTH)) {\n cur_date = date_utils.add(cur_date, 1, \"month\");\n } else {\n cur_date = date_utils.add(cur_date, this.options.step, \"hour\");\n }\n }\n this.dates.push(cur_date);\n }\n }\n\n bind_events() {\n if (this.options.readonly) return\n this.bind_grid_click();\n this.bind_bar_events();\n }\n\n render() {\n this.clear();\n this.setup_layers();\n this.make_grid();\n this.make_dates();\n this.make_bars();\n this.make_arrows();\n this.map_arrows_on_bars();\n this.set_width();\n this.set_scroll_position();\n if (this.options.scroll_today) this.scroll_today()\n }\n\n setup_layers() {\n this.layers = {};\n const layers = [\"grid\", \"arrow\", \"progress\", \"bar\", \"details\"];\n // make group layers\n for (let layer of layers) {\n this.layers[layer] = createSVG(\"g\", {\n class: layer,\n append_to: this.$svg,\n });\n }\n }\n\n make_grid() {\n this.make_grid_background();\n this.make_grid_rows();\n this.make_grid_header();\n this.make_grid_ticks();\n this.make_grid_highlights();\n }\n\n make_grid_background() {\n const grid_width = this.dates.length * this.options.column_width;\n const grid_height =\n this.options.header_height +\n this.options.padding +\n (this.options.bar_height + this.options.padding) * this.tasks.length;\n\n createSVG(\"rect\", {\n x: 0,\n y: 0,\n width: grid_width,\n height: grid_height,\n class: \"grid-background\",\n append_to: this.$svg,\n });\n\n $.attr(this.$svg, {\n height: grid_height + this.options.padding + 100,\n width: \"100%\",\n });\n }\n\n make_grid_rows() {\n const rows_layer = createSVG(\"g\", { append_to: this.layers.grid });\n const lines_layer = createSVG(\"g\", { append_to: this.layers.grid });\n\n const row_width = this.dates.length * this.options.column_width;\n const row_height = this.options.bar_height + this.options.padding;\n\n let row_y = this.options.header_height + this.options.padding / 2;\n\n for (let task of this.tasks) {\n createSVG(\"rect\", {\n x: 0,\n y: row_y,\n width: row_width,\n height: row_height,\n class: \"grid-row\",\n append_to: rows_layer,\n });\n if (this.options.lines === 'both' || this.options.lines === 'horizontal') {\n createSVG(\"line\", {\n x1: 0,\n y1: row_y + row_height,\n x2: row_width,\n y2: row_y + row_height,\n class: \"row-line\",\n append_to: lines_layer,\n });\n }\n\n row_y += this.options.bar_height + this.options.padding;\n }\n }\n\n make_grid_header() {\n const curHeader = document.querySelector('.grid-header')\n if (curHeader) {\n curHeader.remove()\n };\n\n let $header = document.createElement(\"div\");\n $header.style.height = this.options.header_height + 10 + \"px\";\n $header.style.width = this.dates.length * this.options.column_width + \"px\";\n $header.classList.add('grid-header')\n this.$header = $header\n this.$container.appendChild($header)\n\n let $upper_header = document.createElement(\"div\");\n $upper_header.classList.add('upper-header')\n this.$upper_header = $upper_header\n this.$header.appendChild($upper_header)\n\n let $lower_header = document.createElement(\"div\");\n $lower_header.classList.add('lower-header')\n this.$lower_header = $lower_header\n this.$header.appendChild($lower_header)\n\n let $side_header = document.createElement('div')\n $side_header.classList.add('side-header')\n\n\n // Create view mode change select\n const $select = document.createElement(\"select\");\n $select.classList.add('viewmode-select')\n\n for (const key in VIEW_MODE) {\n const $option = document.createElement(\"option\");\n $option.value = VIEW_MODE[key];\n $option.textContent = VIEW_MODE[key];\n $select.appendChild($option);\n }\n $select.value = this.options.view_mode\n $select.addEventListener(\"change\", (function () {\n this.change_view_mode($select.value)\n }).bind(this));\n $side_header.appendChild($select)\n\n // Create today button\n let $today_button = document.createElement('button')\n $today_button.classList.add('today-button')\n $today_button.textContent = 'Today'\n $today_button.onclick = this.scroll_today.bind(this)\n $side_header.appendChild($today_button)\n\n this.$header.appendChild($side_header)\n const { left, y } = $header.getBoundingClientRect();\n const width = Math.min(this.$header.clientWidth, this.$container.clientWidth)\n $side_header.style.left = left + this.$container.scrollLeft + width - $side_header.clientWidth + 'px';\n $side_header.style.top = y + 5 + 'px';\n }\n\n make_grid_ticks() {\n if (this.options.lines !== 'both' && this.options.lines !== 'vertical') return\n let tick_x = 0;\n let tick_y = this.options.header_height + this.options.padding / 2;\n let tick_height =\n (this.options.bar_height + this.options.padding) * this.tasks.length;\n\n for (let date of this.dates) {\n let tick_class = \"tick\";\n // thick tick for monday\n if (this.view_is(VIEW_MODE.DAY) && date.getDate() === 1) {\n tick_class += \" thick\";\n }\n // thick tick for first week\n if (\n this.view_is(VIEW_MODE.WEEK) &&\n date.getDate() >= 1 &&\n date.getDate() < 8\n ) {\n tick_class += \" thick\";\n }\n // thick ticks for quarters\n if (this.view_is(VIEW_MODE.MONTH) && date.getMonth() % 3 === 0) {\n tick_class += \" thick\";\n }\n\n createSVG(\"path\", {\n d: `M ${tick_x} ${tick_y} v ${tick_height}`,\n class: tick_class,\n append_to: this.layers.grid,\n });\n\n if (this.view_is(VIEW_MODE.MONTH)) {\n tick_x +=\n (date_utils.get_days_in_month(date) * this.options.column_width) / 30;\n } else {\n tick_x += this.options.column_width;\n }\n }\n }\n\n highlightWeekends() {\n if (!this.view_is('Day') && !this.view_is('Half Day')) return\n for (let d = new Date(this.gantt_start); d <= this.gantt_end; d.setDate(d.getDate() + 1)) {\n if (d.getDay() === 0 || d.getDay() === 6) {\n const x = (date_utils.diff(d, this.gantt_start, 'hour') /\n this.options.step) *\n this.options.column_width;\n const height = (this.options.bar_height + this.options.padding) * this.tasks.length;\n createSVG('rect', {\n x,\n y: this.options.header_height + this.options.padding / 2,\n width: (this.view_is('Day') ? 1 : 2) * this.options.column_width,\n height,\n class: 'holiday-highlight',\n append_to: this.layers.grid,\n });\n }\n }\n }\n\n //compute the horizontal x distance\n computeGridHighlightDimensions(view_mode) {\n let xDist = 0;\n\n if (this.view_is(VIEW_MODE.DAY)) {\n return (\n (date_utils.diff(date_utils.today(), this.gantt_start, \"hour\") /\n this.options.step) *\n this.options.column_width\n );\n }\n\n for (let date of this.dates) {\n const todayDate = new Date();\n const startDate = new Date(date);\n const endDate = new Date(date);\n switch (view_mode) {\n case VIEW_MODE.WEEK:\n endDate.setDate(date.getDate() + 7);\n break;\n case VIEW_MODE.MONTH:\n endDate.setMonth(date.getMonth() + 1);\n break;\n case VIEW_MODE.YEAR:\n endDate.setFullYear(date.getFullYear() + 1);\n break;\n }\n if (todayDate >= startDate && todayDate <= endDate) {\n break;\n } else {\n xDist += this.options.column_width;\n }\n }\n return xDist;\n }\n\n make_grid_highlights() {\n if (this.options.highlight_weekend) this.highlightWeekends()\n // highlight today's | week's | month's | year's\n if (\n this.view_is(VIEW_MODE.DAY) ||\n this.view_is(VIEW_MODE.WEEK) ||\n this.view_is(VIEW_MODE.MONTH) ||\n this.view_is(VIEW_MODE.YEAR)\n ) {\n const x = this.computeGridHighlightDimensions(this.options.view_mode);\n const y = 0;\n const width = this.options.column_width;\n const height =\n (this.options.bar_height + this.options.padding) * this.tasks.length +\n this.options.header_height +\n this.options.padding / 2;\n\n let className = \"\";\n switch (this.options.view_mode) {\n case VIEW_MODE.DAY:\n className = \"today-highlight\";\n break;\n case VIEW_MODE.WEEK:\n className = \"week-highlight\";\n break;\n case VIEW_MODE.MONTH:\n className = \"month-highlight\";\n break;\n case VIEW_MODE.YEAR:\n className = \"year-highlight\";\n break;\n }\n createSVG(\"rect\", {\n x,\n y,\n width,\n height,\n class: className,\n append_to: this.layers.grid,\n });\n }\n }\n\n make_dates() {\n this.upper_texts_x = {}\n for (let date of this.get_dates_to_draw()) {\n let $lower_text = document.createElement('div');\n $lower_text.classList.add('lower-text')\n $lower_text.style.left = date.lower_x + 'px'\n $lower_text.style.top = date.lower_y + 'px'\n $lower_text.innerText = date.lower_text\n this.$lower_header.appendChild($lower_text)\n\n if (date.upper_text) {\n this.upper_texts_x[date.upper_text] = date.upper_x\n let $upper_text = document.createElement('div');\n $upper_text.classList.add('upper-text')\n $upper_text.style.left = date.upper_x + 'px'\n $upper_text.style.top = date.upper_y + 'px'\n $upper_text.innerText = date.upper_text\n this.$upper_header.appendChild($upper_text)\n\n // remove out-of-bound dates\n if (date.upper_x > this.layers.grid.getBBox().width) {\n $upper_text.remove();\n }\n }\n }\n }\n\n get_dates_to_draw() {\n let last_date = null;\n const dates = this.dates.map((date, i) => {\n const d = this.get_date_info(date, last_date, i);\n last_date = d;\n return d;\n });\n return dates;\n }\n\n get_date_info(date, last_date_info) {\n let last_date = last_date_info ? last_date_info.date : date_utils.add(date, 1, \"day\")\n const date_text = {\n Hour_lower: date_utils.format(date, \"HH\", this.options.language),\n \"Quarter Day_lower\": date_utils.format(date, \"HH\", this.options.language),\n \"Half Day_lower\": date_utils.format(date, \"HH\", this.options.language),\n Day_lower:\n date.getDate() !== last_date.getDate()\n ? date_utils.format(date, \"D\", this.options.language)\n : \"\",\n Week_lower:\n date.getMonth() !== last_date.getMonth()\n ? date_utils.format(date, \"D MMM\", this.options.language)\n : date_utils.format(date, \"D\", this.options.language),\n Month_lower: date_utils.format(date, \"MMMM\", this.options.language),\n Year_lower: date_utils.format(date, \"YYYY\", this.options.language),\n Hour_upper:\n date.getDate() !== last_date.getDate()\n ? date_utils.format(date, \"D MMMM\", this.options.language)\n : \"\",\n \"Quarter Day_upper\":\n date.getDate() !== last_date.getDate()\n ? date_utils.format(date, \"D MMM\", this.options.language)\n : \"\",\n \"Half Day_upper\":\n date.getDate() !== last_date.getDate()\n ? date.getMonth() !== last_date.getMonth()\n ? date_utils.format(date, \"D MMM\", this.options.language)\n : date_utils.format(date, \"D\", this.options.language)\n : \"\",\n Day_upper:\n date.getMonth() !== last_date.getMonth() || !last_date_info\n ? date_utils.format(date, \"MMMM\", this.options.language)\n : \"\",\n Week_upper:\n date.getMonth() !== last_date.getMonth()\n ? date_utils.format(date, \"MMMM\", this.options.language)\n : \"\",\n Month_upper:\n date.getFullYear() !== last_date.getFullYear()\n ? date_utils.format(date, \"YYYY\", this.options.language)\n : \"\",\n Year_upper:\n date.getFullYear() !== last_date.getFullYear()\n ? date_utils.format(date, \"YYYY\", this.options.language)\n : \"\",\n };\n let column_width = this.view_is(VIEW_MODE.MONTH) ? (date_utils.get_days_in_month(date) * this.options.column_width) / 30 : this.options.column_width;\n const base_pos = {\n x: last_date_info\n ? last_date_info.base_pos_x + last_date_info.column_width\n : 0,\n lower_y: this.options.header_height - 15,\n upper_y: this.options.header_height - 40,\n };\n\n const x_pos = {\n Hour_lower: column_width / 2,\n Hour_upper: column_width * 12,\n \"Quarter Day_lower\": column_width / 2,\n \"Quarter Day_upper\": column_width * 2,\n \"Half Day_lower\": column_width / 2,\n \"Half Day_upper\": column_width,\n Day_lower: column_width / 2,\n Day_upper: column_width / 2,\n Week_lower: 0,\n Week_upper: (column_width * 4) / 2,\n Month_lower: column_width / 2,\n Month_upper: column_width / 2,\n Year_lower: column_width / 2,\n Year_upper: (column_width * 30) / 2,\n };\n return {\n date,\n column_width,\n base_pos_x: base_pos.x,\n upper_text: date_text[`${this.options.view_mode}_upper`],\n lower_text: date_text[`${this.options.view_mode}_lower`],\n upper_x: base_pos.x + x_pos[`${this.options.view_mode}_upper`],\n upper_y: base_pos.upper_y,\n lower_x: base_pos.x + x_pos[`${this.options.view_mode}_lower`],\n lower_y: base_pos.lower_y,\n };\n }\n\n make_bars() {\n this.bars = this.tasks.map((task) => {\n const bar = new Bar(this, task);\n this.layers.bar.appendChild(bar.group);\n return bar;\n });\n }\n\n make_arrows() {\n this.arrows = [];\n for (let task of this.tasks) {\n let arrows = [];\n arrows = task.dependencies\n .map((task_id) => {\n const dependency = this.get_task(task_id);\n if (!dependency) return;\n const arrow = new Arrow(\n this,\n this.bars[dependency._index], // from_task\n this.bars[task._index], // to_task\n );\n this.layers.arrow.appendChild(arrow.element);\n return arrow;\n })\n .filter(Boolean); // filter falsy values\n this.arrows = this.arrows.concat(arrows);\n }\n }\n\n map_arrows_on_bars() {\n for (let bar of this.bars) {\n bar.arrows = this.arrows.filter((arrow) => {\n return (\n arrow.from_task.task.id === bar.task.id ||\n arrow.to_task.task.id === bar.task.id\n );\n });\n }\n }\n\n set_width() {\n const cur_width = this.$svg.getBoundingClientRect().width;\n const actual_width = this.$svg.querySelector('.grid .grid-row') ? this.$svg\n .querySelector('.grid .grid-row')\n .getAttribute('width') : 0;\n if (cur_width < actual_width) {\n this.$svg.setAttribute(\"width\", actual_width);\n }\n }\n\n set_scroll_position(date) {\n if (!date) {\n date = this.gantt_start\n }\n\n const parent_element = this.$svg.parentElement;\n if (!parent_element) return;\n\n const hours_before_first_task = date_utils.diff(\n this.get_oldest_starting_date(),\n date,\n \"hour\",\n );\n\n const scroll_pos =\n (hours_before_first_task / this.options.step) *\n this.options.column_width -\n this.options.column_width;\n parent_element.scrollTo({ left: scroll_pos, behavior: 'smooth' })\n }\n\n scroll_today() {\n const oldest = this.get_oldest_starting_date().getTime()\n const t = new Date() - oldest\n this.set_scroll_position(new Date(this.gantt_start.getTime() - t))\n }\n\n bind_grid_click() {\n $.on(\n this.$svg,\n this.options.popup_trigger,\n \".grid-row, .grid-header\",\n () => {\n this.unselect_all();\n this.hide_popup();\n },\n );\n }\n\n bind_bar_events() {\n let is_dragging = false;\n let x_on_start = 0;\n let x_on_scroll_start = 0;\n let y_on_start = 0;\n let is_resizing_left = false;\n let is_resizing_right = false;\n let parent_bar_id = null;\n let bars = []; // instanceof Bar\n this.bar_being_dragged = null;\n\n function action_in_progress() {\n return is_dragging || is_resizing_left || is_resizing_right;\n }\n\n $.on(this.$svg, \"mousedown\", \".bar-wrapper, .handle\", (e, element) => {\n const bar_wrapper = $.closest(\".bar-wrapper\", element);\n bars.forEach((bar) => bar.group.classList.remove(\"active\"));\n\n if (element.classList.contains(\"left\")) {\n is_resizing_left = true;\n } else if (element.classList.contains(\"right\")) {\n is_resizing_right = true;\n } else if (element.classList.contains(\"bar-wrapper\")) {\n is_dragging = true;\n }\n\n bar_wrapper.classList.add(\"active\");\n this.popup.parent.classList.add('hidden')\n\n x_on_start = e.offsetX;\n y_on_start = e.offsetY;\n\n parent_bar_id = bar_wrapper.getAttribute(\"data-id\");\n const ids = [\n parent_bar_id,\n ...this.get_all_dependent_tasks(parent_bar_id),\n ];\n bars = ids.map((id) => this.get_bar(id));\n\n this.bar_being_dragged = parent_bar_id;\n\n bars.forEach((bar) => {\n const $bar = bar.$bar;\n $bar.ox = $bar.getX();\n $bar.oy = $bar.getY();\n $bar.owidth = $bar.getWidth();\n $bar.finaldx = 0;\n });\n });\n $.on(this.$container, 'scroll', e => {\n let elements = document.querySelectorAll('.bar-wrapper');\n let localBars = [];\n const ids = [];\n let dx;\n if (x_on_scroll_start) {\n dx = e.currentTarget.scrollLeft - x_on_scroll_start;\n }\n\n const daysSinceStart = e.currentTarget.scrollLeft / this.options.column_width * this.options.step / 24;\n let format_str = \"D MMM\"\n if ([\"Year\", \"Month\"].includes(this.options.view_mode)) format_str = 'YYYY'\n else if ([\"Day\", \"Week\"].includes(this.options.view_mode)) format_str = 'MMMM'\n else if (this.view_is('Half Day')) format_str = 'D'\n else if (this.view_is('Hour')) format_str = \"D MMMM\"\n\n\n let currentUpper = date_utils.format(\n date_utils.add(this.gantt_start, daysSinceStart, 'day'),\n format_str\n );\n const upperTexts = Array.from(document.querySelectorAll('.upper-text'));\n const $el = upperTexts.find(el => el.textContent === currentUpper)\n if ($el && !$el.classList.contains('current-upper')) {\n const $current = document.querySelector('.current-upper')\n if ($current) {\n $current.classList.remove('current-upper')\n $current.style.left = this.upper_texts_x[$current.textContent] + 'px';\n $current.style.top = this.options.header_height - 40 + 'px';\n }\n\n $el.classList.add('current-upper')\n let dimensions = this.$svg.getBoundingClientRect()\n $el.style.left = dimensions.x + this.$container.scrollLeft + 10 + 'px';\n $el.style.top = dimensions.y + this.options.header_height - 40 + 'px';\n }\n\n Array.prototype.forEach.call(elements, function (el, i) {\n ids.push(el.getAttribute('data-id'));\n });\n\n if (dx) {\n localBars = ids.map(id => this.get_bar(id));\n if (this.options.auto_move_label) {\n localBars.forEach(bar => {\n bar.update_label_position_on_horizontal_scroll({ x: dx, sx: e.currentTarget.scrollLeft });\n });\n }\n }\n\n x_on_scroll_start = e.currentTarget.scrollLeft;\n });\n\n $.on(this.$svg, \"mousemove\", (e) => {\n if (!action_in_progress()) return;\n const dx = e.offsetX - x_on_start;\n const dy = e.offsetY - y_on_start;\n\n bars.forEach((bar) => {\n const $bar = bar.$bar;\n $bar.finaldx = this.get_snap_position(dx);\n this.hide_popup();\n if (is_resizing_left) {\n if (parent_bar_id === bar.task.id) {\n bar.update_bar_position({\n x: $bar.ox + $bar.finaldx,\n width: $bar.owidth - $bar.finaldx,\n });\n } else {\n bar.update_bar_position({\n x: $bar.ox + $bar.finaldx,\n });\n }\n } else if (is_resizing_right) {\n if (parent_bar_id === bar.task.id) {\n bar.update_bar_position({\n width: $bar.owidth + $bar.finaldx,\n });\n }\n } else if (is_dragging && !this.options.readonly) {\n bar.update_bar_position({ x: $bar.ox + $bar.finaldx });\n }\n });\n });\n\n document.addEventListener(\"mouseup\", (e) => {\n\n is_dragging = false;\n is_resizing_left = false;\n is_resizing_right = false;\n });\n\n $.on(this.$svg, \"mouseup\", (e) => {\n this.bar_being_dragged = null;\n bars.forEach((bar) => {\n const $bar = bar.$bar;\n if (!$bar.finaldx) return;\n bar.date_changed();\n bar.set_action_completed();\n });\n });\n\n this.bind_bar_progress();\n }\n\n bind_bar_progress() {\n let x_on_start = 0;\n let y_on_start = 0;\n let is_resizing = null;\n let bar = null;\n let $bar_progress = null;\n let $bar = null;\n\n $.on(this.$svg, \"mousedown\", \".handle.progress\", (e, handle) => {\n is_resizing = true;\n x_on_start = e.offsetX;\n y_on_start = e.offsetY;\n\n const $bar_wrapper = $.closest(\".bar-wrapper\", handle);\n const id = $bar_wrapper.getAttribute(\"data-id\");\n bar = this.get_bar(id);\n\n $bar_progress = bar.$bar_progress;\n $bar = bar.$bar;\n\n $bar_progress.finaldx = 0;\n $bar_progress.owidth = $bar_progress.getWidth();\n $bar_progress.min_dx = -$bar_progress.getWidth();\n $bar_progress.max_dx = $bar.getWidth() - $bar_progress.getWidth();\n });\n\n $.on(this.$svg, \"mousemove\", (e) => {\n if (!is_resizing) return;\n let dx = e.offsetX - x_on_start;\n let dy = e.offsetY - y_on_start;\n\n if (dx > $bar_progress.max_dx) {\n dx = $bar_progress.max_dx;\n }\n if (dx < $bar_progress.min_dx) {\n dx = $bar_progress.min_dx;\n }\n\n const $handle = bar.$handle_progress;\n $.attr($bar_progress, \"width\", $bar_progress.owidth + dx);\n $.attr($handle, \"points\", bar.get_progress_polygon_points());\n $bar_progress.finaldx = dx;\n });\n\n $.on(this.$svg, \"mouseup\", () => {\n is_resizing = false;\n if (!($bar_progress && $bar_progress.finaldx)) return;\n\n $bar_progress.finaldx = 0;\n bar.progress_changed();\n bar.set_action_completed();\n bar = null;\n $bar_progress = null;\n $bar = null;\n });\n }\n\n get_all_dependent_tasks(task_id) {\n let out = [];\n let to_process = [task_id];\n while (to_process.length) {\n const deps = to_process.reduce((acc, curr) => {\n acc = acc.concat(this.dependency_map[curr]);\n return acc;\n }, []);\n\n out = out.concat(deps);\n to_process = deps.filter((d) => !to_process.includes(d));\n }\n\n return out.filter(Boolean);\n }\n\n get_snap_position(dx) {\n let odx = dx,\n rem,\n position;\n\n if (this.view_is(VIEW_MODE.WEEK)) {\n rem = dx % (this.options.column_width / 7);\n position =\n odx -\n rem +\n (rem < this.options.column_width / 14\n ? 0\n : this.options.column_width / 7);\n } else if (this.view_is(VIEW_MODE.MONTH)) {\n rem = dx % (this.options.column_width / 30);\n position =\n odx -\n rem +\n (rem < this.options.column_width / 60\n ? 0\n : this.options.column_width / 30);\n } else {\n rem = dx % this.options.column_width;\n position =\n odx -\n rem +\n (rem < this.options.column_width / 2 ? 0 : this.options.column_width);\n }\n return position;\n }\n\n unselect_all() {\n [...this.$svg.querySelectorAll(\".bar-wrapper\")].forEach((el) => {\n el.classList.remove(\"active\");\n });\n this.popup.parent.classList.remove('hidden')\n }\n\n view_is(modes) {\n if (typeof modes === \"string\") {\n return this.options.view_mode === modes;\n }\n\n if (Array.isArray(modes)) {\n return modes.some((mode) => this.options.view_mode === mode);\n }\n\n return false;\n }\n\n get_task(id) {\n return this.tasks.find((task) => {\n return task.id === id;\n });\n }\n\n get_bar(id) {\n return this.bars.find((bar) => {\n return bar.task.id === id;\n });\n }\n\n show_popup(options) {\n if (!this.popup) {\n this.popup = new Popup(\n this.popup_wrapper,\n this.options.custom_popup_html,\n );\n }\n this.popup.show(options);\n }\n\n hide_popup() {\n this.popup && this.popup.hide();\n }\n\n trigger_event(event, args) {\n if (this.options[\"on_\" + event]) {\n this.options[\"on_\" + event].apply(null, args);\n }\n }\n\n /**\n * Gets the oldest starting date from the list of tasks\n *\n * @returns Date\n * @memberof Gantt\n */\n get_oldest_starting_date() {\n if (!this.tasks.length) return new Date()\n return this.tasks\n .map((task) => task._start)\n .reduce((prev_date, cur_date) =>\n cur_date <= prev_date ? cur_date : prev_date,\n );\n }\n\n /**\n * Clear all elements from the parent svg element\n *\n * @memberof Gantt\n */\n clear() {\n this.$svg.innerHTML = \"\";\n }\n}\n\nGantt.VIEW_MODE = VIEW_MODE;\n\nfunction generate_id(task) {\n return task.name + \"_\" + Math.random().toString(36).slice(2, 12);\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/frappe-gantt.min.css b/dist/frappe-gantt.min.css index b14d217..cffe7ea 100644 --- a/dist/frappe-gantt.min.css +++ b/dist/frappe-gantt.min.css @@ -1 +1 @@ -.dark>.gantt-container .gantt .grid-header{fill:#252525;stroke:#616161}.dark>.gantt-container .gantt .grid-row{fill:#252525}.dark>.gantt-container .gantt .grid-row:nth-child(even){fill:#3e3e3e}.dark>.gantt-container .gantt .row-line{stroke:#3e3e3e}.dark>.gantt-container .gantt .tick{stroke:#616161}.dark>.gantt-container .gantt .today-highlight{opacity:.2}.dark>.gantt-container .gantt .arrow{stroke:#eee}.dark>.gantt-container .gantt .bar{fill:#616161;stroke:none}.dark>.gantt-container .gantt .bar-progress{fill:#8a8aff}.dark>.gantt-container .gantt .bar-invalid{fill:rgba(0,0,0,0);stroke:#c6ccd2}.dark>.gantt-container .gantt .bar-invalid~.bar-label{fill:#ececec}.dark>.gantt-container .gantt .bar-label.big{fill:#ececec}.dark>.gantt-container .gantt .bar-wrapper:hover .bar{fill:#6e6e6e}.dark>.gantt-container .gantt .bar-wrapper:hover .bar-progress{fill:#a4a4ff}.dark>.gantt-container .gantt .bar-wrapper.active .bar{fill:#6e6e6e}.dark>.gantt-container .gantt .bar-wrapper.active .bar-progress{fill:#a4a4ff}.dark>.gantt-container .gantt .upper-text{fill:#a2a2a2}.dark>.gantt-container .gantt .lower-text{fill:#f7f7f7}.dark>.gantt-container .popup-wrapper{background-color:#333}.dark>.gantt-container .popup-wrapper .title{border-color:#a4a4ff}.dark>.gantt-container .popup-wrapper .pointer{border-top-color:#333}.gantt-container .grid-header{background-color:#fff;position:sticky;top:0;left:0}.gantt-container .lower-text,.gantt-container .upper-text{font-size:14px;text-anchor:middle;color:#666}.gantt-container .lower-text{position:absolute;width:fit-content}.gantt-container #today-button{position:sticky;left:10px;top:5px;background-color:#2c94ec;border:none;color:#fff;padding:4px 10px;font-size:14px;border-radius:2px}.gantt{user-select:none;-webkit-user-select:none;position:absolute}.gantt .grid-background{fill:none}.gantt .grid-row{fill:#fff}.gantt .row-line{stroke:#ebeff2}.gantt .tick{stroke:#e0e0e0;stroke-width:.2}.gantt .tick.thick{stroke:#000;stroke-width:.5}.gantt .today-highlight{fill:#f6e796;opacity:.5}.gantt .week-highlight{fill:#f6e796;opacity:.5}.gantt .holiday-highlight{fill:#f3f4f7;opacity:.5}.gantt .month-highlight{fill:#f6e796;opacity:.5}.gantt .year-highlight{fill:#f6e796;opacity:.5}.gantt .arrow{fill:none;stroke:#666;stroke-width:1.4}.gantt .bar-wrapper .bar{fill:#fff;stroke:#fff;stroke-width:0;transition:stroke-width .3s ease}.gantt .bar-progress{fill:#dedfe0}.gantt .date-highlight{fill:#e8e8e8;display:none}.gantt .bar-expected-progress{fill:#c4c4e9}.gantt .bar-invalid{fill:rgba(0,0,0,0);stroke:#fff;stroke-width:1;stroke-dasharray:5}.gantt .bar-invalid~.bar-label{fill:#fff}.gantt .bar-label{fill:#111;dominant-baseline:central;font-family:Helvetica;font-size:14px;font-weight:400}.gantt .bar-label.big{fill:#111;text-anchor:start}.gantt .bar-wrapper.important .bar{fill:#94c4f4}.gantt .bar-wrapper.important .bar-progress{fill:#2c94ec}.gantt .bar-wrapper.important .bar-label{fill:#fff}.gantt .bar-wrapper.important .handle{fill:#94c4f4}.gantt .handle{fill:#dcdce4;cursor:ew-resize;opacity:0;visibility:hidden;transition:opacity .3s ease}.gantt .bar-wrapper{cursor:pointer;outline:none}.gantt .bar-wrapper.active .handle{visibility:visible;opacity:1}.gantt .bar-wrapper .bar{-webkit-filter:drop-shadow(3px 3px 2px rgba(0, 0, 0, 0.7));filter:drop-shadow(0 0 2px rgba(17, 43, 66, 0.16));border-radius:3px}.gantt .bar-wrapper:hover .bar{transition:transform .3s ease}.gantt .bar-wrapper:hover .date-highlight{display:block}.gantt .hide{display:none}.gantt-container{position:relative;overflow:auto;font-size:12px;height:500px}.gantt-container .popup-wrapper{position:absolute;top:0;left:0;background:#000;padding:0;color:#959da5;border-radius:3px;border:1px solid #000;width:max-content}.gantt-container .popup-wrapper.hidden{opacity:0 !important}.gantt-container .popup-wrapper .title{border-bottom:1px solid #dedfe0;padding:10px;text-align:center;color:#fff}.gantt-container .popup-wrapper .subtitle{padding:10px;color:#dfe2e5}.gantt-container .popup-wrapper .pointer{position:absolute;height:5px;margin:0 0 0 -5px;border:5px solid rgba(0,0,0,0);border-bottom-color:rgba(0,0,0,.8)} \ No newline at end of file +.dark>.gantt-container .gantt .grid-header{fill:#252525;stroke:#616161}.dark>.gantt-container .gantt .grid-row{fill:#252525}.dark>.gantt-container .gantt .grid-row:nth-child(even){fill:#3e3e3e}.dark>.gantt-container .gantt .row-line{stroke:#3e3e3e}.dark>.gantt-container .gantt .tick{stroke:#616161}.dark>.gantt-container .gantt .today-highlight{opacity:.2}.dark>.gantt-container .gantt .arrow{stroke:#eee}.dark>.gantt-container .gantt .bar{fill:#616161;stroke:none}.dark>.gantt-container .gantt .bar-progress{fill:#8a8aff}.dark>.gantt-container .gantt .bar-invalid{fill:rgba(0,0,0,0);stroke:#c6ccd2}.dark>.gantt-container .gantt .bar-invalid~.bar-label{fill:#ececec}.dark>.gantt-container .gantt .bar-label.big{fill:#ececec}.dark>.gantt-container .gantt .bar-wrapper:hover .bar{fill:#6e6e6e}.dark>.gantt-container .gantt .bar-wrapper:hover .bar-progress{fill:#a4a4ff}.dark>.gantt-container .gantt .bar-wrapper.active .bar{fill:#6e6e6e}.dark>.gantt-container .gantt .bar-wrapper.active .bar-progress{fill:#a4a4ff}.dark>.gantt-container .gantt .upper-text{fill:#a2a2a2}.dark>.gantt-container .gantt .lower-text{fill:#f7f7f7}.dark>.gantt-container .popup-wrapper{background-color:#333}.dark>.gantt-container .popup-wrapper .title{border-color:#a4a4ff}.dark>.gantt-container .popup-wrapper .pointer{border-top-color:#333}.gantt-container .grid-header{background-color:#fff;position:sticky;top:0;left:0}.gantt-container .lower-text,.gantt-container .upper-text{font-size:14px;text-anchor:middle;color:#666}.gantt-container .lower-text{position:absolute;width:fit-content}.gantt-container .upper-text{position:absolute;width:fit-content}.gantt-container .current-upper{position:fixed}.gantt-container .side-header{position:fixed;padding:0 10px;background:#fff}.gantt-container .today-button,.gantt-container .viewmode-select{background-color:#fff;border:1px solid #000;color:#111;padding:4px 10px;font-size:14px;border-radius:5px}.gantt-container .viewmode-select{padding:3px 5px;margin-right:4px}.gantt{user-select:none;-webkit-user-select:none;position:absolute}.gantt .grid-background{fill:none}.gantt .grid-row{fill:#fff}.gantt .row-line{stroke:#ebeff2}.gantt .tick{stroke:#e0e0e0;stroke-width:.2}.gantt .tick.thick{stroke:#000;stroke-width:.5}.gantt .today-highlight{fill:#f6e796;opacity:.5}.gantt .week-highlight{fill:#f6e796;opacity:.5}.gantt .holiday-highlight{fill:#f3f4f7;opacity:.5}.gantt .month-highlight{fill:#f6e796;opacity:.5}.gantt .year-highlight{fill:#f6e796;opacity:.5}.gantt .arrow{fill:none;stroke:#666;stroke-width:1.4}.gantt .bar-wrapper .bar{fill:#fff;stroke:#fff;stroke-width:0;transition:stroke-width .3s ease}.gantt .bar-progress{fill:#dedfe0}.gantt .date-highlight{fill:#e8e8e8;display:none}.gantt .bar-expected-progress{fill:#c4c4e9}.gantt .bar-invalid{fill:rgba(0,0,0,0);stroke:#fff;stroke-width:1;stroke-dasharray:5}.gantt .bar-invalid~.bar-label{fill:#fff}.gantt .bar-label{fill:#111;dominant-baseline:central;font-family:Helvetica;font-size:14px;font-weight:400}.gantt .bar-label.big{fill:#111;text-anchor:start}.gantt .bar-wrapper.important .bar{fill:#94c4f4}.gantt .bar-wrapper.important .bar-progress{fill:#2c94ec}.gantt .bar-wrapper.important .bar-label{fill:#fff}.gantt .bar-wrapper.important .handle{fill:#94c4f4}.gantt .handle{fill:#dcdce4;cursor:ew-resize;opacity:0;visibility:hidden;transition:opacity .3s ease}.gantt .bar-wrapper{cursor:pointer;outline:none}.gantt .bar-wrapper.active .handle{visibility:visible;opacity:1}.gantt .bar-wrapper .bar{-webkit-filter:drop-shadow(3px 3px 2px rgba(0, 0, 0, 0.7));filter:drop-shadow(0 0 2px rgba(17, 43, 66, 0.16));border-radius:3px}.gantt .bar-wrapper:hover .bar{transition:transform .3s ease}.gantt .bar-wrapper:hover .date-highlight{display:block}.gantt .hide{display:none}.gantt-container{position:relative;overflow:auto;font-size:12px;height:500px}.gantt-container .popup-wrapper{position:absolute;top:0;left:0;background:#000;padding:0;color:#959da5;border-radius:3px;border:1px solid #000;width:max-content}.gantt-container .popup-wrapper.hidden{opacity:0 !important}.gantt-container .popup-wrapper .title{border-bottom:1px solid #dedfe0;padding:10px;text-align:center;color:#fff}.gantt-container .popup-wrapper .subtitle{padding:10px;color:#dfe2e5}.gantt-container .popup-wrapper .pointer{position:absolute;height:5px;margin:0 0 0 -5px;border:5px solid rgba(0,0,0,0);border-bottom-color:rgba(0,0,0,.8)} \ No newline at end of file diff --git a/dist/frappe-gantt.min.js b/dist/frappe-gantt.min.js index ee936de..94afa8c 100644 --- a/dist/frappe-gantt.min.js +++ b/dist/frappe-gantt.min.js @@ -1,2 +1,2 @@ -var Gantt=function(){"use strict";const t="year",e="month",s="day",i="hour",o="minute",a="second",n="millisecond",r={January:"Jan",February:"Feb",March:"Mar",April:"Apr",May:"May",June:"Jun",July:"Jul",August:"Aug",September:"Sep",October:"Oct",November:"Nov",December:"Dec"};var h={parse_duration(t){const e=/([0-9])+(y|m|d|h|min|s|ms)/gm.exec(t);if(null!==e){if("y"===e[2])return{duration:parseInt(e[1]),scale:"year"};if("m"===e[2])return{duration:parseInt(e[1]),scale:"month"};if("d"===e[2])return{duration:parseInt(e[1]),scale:"day"};if("h"===e[2])return{duration:parseInt(e[1]),scale:"hour"};if("min"===e[2])return{duration:parseInt(e[1]),scale:"minute"};if("s"===e[2])return{duration:parseInt(e[1]),scale:"second"};if("ms"===e[2])return{duration:parseInt(e[1]),scale:"millisecond"}}},parse(t,e="-",s=/[.:]/){if(t instanceof Date)return t;if("string"==typeof t){let i,o;const a=t.split(" ");i=a[0].split(e).map((t=>parseInt(t,10))),o=a[1]&&a[1].split(s),i[1]=i[1]?i[1]-1:0;let n=i;return o&&o.length&&(4===o.length&&(o[3]="0."+o[3],o[3]=1e3*parseFloat(o[3])),n=n.concat(o)),new Date(...n)}},to_string(t,e=!1){if(!(t instanceof Date))throw new TypeError("Invalid argument type");const s=this.get_date_values(t).map(((t,e)=>(1===e&&(t+=1),d(t+"",6===e?3:2,"0")))),i=`${s[0]}-${s[1]}-${s[2]}`,o=`${s[3]}:${s[4]}:${s[5]}.${s[6]}`;return i+(e?" "+o:"")},format(t,e="YYYY-MM-DD HH:mm:ss.SSS",s="en"){const i=new Intl.DateTimeFormat(s,{month:"long"}).format(t),o=i.charAt(0).toUpperCase()+i.slice(1),a=this.get_date_values(t).map((t=>d(t,2,0))),n={YYYY:a[0],MM:d(+a[1]+1,2,0),DD:a[2],HH:a[3],mm:a[4],ss:a[5],SSS:a[6],D:a[2],MMMM:o,MMM:r[o]};let h=e;const p=[];return Object.keys(n).sort(((t,e)=>e.length-t.length)).forEach((t=>{h.includes(t)&&(h=h.replaceAll(t,`$${p.length}`),p.push(n[t]))})),p.forEach(((t,e)=>{h=h.replaceAll(`$${e}`,t)})),h},diff(t,e,i=s){let o,a,n,r,h,d,p;return o=t-e,a=o/1e3,r=a/60,n=r/60,h=n/24,d=h/30,p=d/12,i.endsWith("s")||(i+="s"),Math.floor({milliseconds:o,seconds:a,minutes:r,hours:n,days:h,months:d,years:p}[i])},today(){const t=this.get_date_values(new Date).slice(0,3);return new Date(...t)},now:()=>new Date,add(r,h,d){h=parseInt(h,10);const p=[r.getFullYear()+(d===t?h:0),r.getMonth()+(d===e?h:0),r.getDate()+(d===s?h:0),r.getHours()+(d===i?h:0),r.getMinutes()+(d===o?h:0),r.getSeconds()+(d===a?h:0),r.getMilliseconds()+(d===n?h:0)];return new Date(...p)},start_of(r,h){const d={[t]:6,[e]:5,[s]:4,[i]:3,[o]:2,[a]:1,[n]:0};function p(t){return d[t]<=d[h]}const _=[r.getFullYear(),p(t)?0:r.getMonth(),p(e)?1:r.getDate(),p(s)?0:r.getHours(),p(i)?0:r.getMinutes(),p(o)?0:r.getSeconds(),p(a)?0:r.getMilliseconds()];return new Date(..._)},clone(t){return new Date(...this.get_date_values(t))},get_date_values:t=>[t.getFullYear(),t.getMonth(),t.getDate(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()],get_days_in_month(t){const e=[31,28,31,30,31,30,31,31,30,31,30,31],s=t.getMonth();if(1!==s)return e[s];const i=t.getFullYear();return i%4==0&&i%100!=0||i%400==0?29:28}};function d(t,e,s){return t+="",e>>=0,s=String(void 0!==s?s:" "),t.length>e?String(t):((e-=t.length)>s.length&&(s+=s.repeat(e/s.length)),s.slice(0,e)+String(t))}function p(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function _(t,e){const s=document.createElementNS("http://www.w3.org/2000/svg",t);for(let t in e)if("append_to"===t){e.append_to.appendChild(s)}else"innerHTML"===t?s.innerHTML=e.innerHTML:"clipPath"===t?s.setAttribute("clip-path","url(#"+e[t]+")"):s.setAttribute(t,e[t]);return s}function l(t,e,s,i){const o=function(t,e,s,i,o="0.4s",a="0.1s"){const n=t.querySelector("animate");if(n)return p.attr(n,{attributeName:e,from:s,to:i,dur:o,begin:"click + "+a}),t;const r=_("animate",{attributeName:e,from:s,to:i,dur:o,begin:a,calcMode:"spline",values:s+";"+i,keyTimes:"0; 1",keySplines:g("ease-out")});return t.appendChild(r),t}(t,e,s,i);if(o===t){const t=document.createEvent("HTMLEvents");t.initEvent("click",!0,!0),t.eventName="click",o.dispatchEvent(t)}}function g(t){return{ease:".25 .1 .25 1",linear:"0 0 1 1","ease-in":".42 0 1 1","ease-out":"0 0 .58 1","ease-in-out":".42 0 .58 1"}[t]}p.on=(t,e,s,i)=>{i?p.delegate(t,e,s,i):(i=s,p.bind(t,e,i))},p.off=(t,e,s)=>{t.removeEventListener(e,s)},p.bind=(t,e,s)=>{e.split(/\s+/).forEach((function(e){t.addEventListener(e,s)}))},p.delegate=(t,e,s,i)=>{t.addEventListener(e,(function(t){const e=t.target.closest(s);e&&(t.delegatedTarget=e,i.call(this,t,e))}))},p.closest=(t,e)=>e?e.matches(t)?e:p.closest(t,e.parentNode):null,p.attr=(t,e,s)=>{if(!s&&"string"==typeof e)return t.getAttribute(e);if("object"!=typeof e)t.setAttribute(e,s);else for(let s in e)p.attr(t,s,e[s])};class u{constructor(t,e){this.set_defaults(t,e),this.prepare(),this.draw(),this.bind()}set_defaults(t,e){this.action_completed=!1,this.gantt=t,this.task=e}prepare(){this.prepare_values(),this.prepare_helpers()}prepare_values(){this.invalid=this.task.invalid,this.height=this.gantt.options.bar_height,this.image_size=this.height-5,this.compute_x(),this.compute_y(),this.compute_duration(),this.corner_radius=this.gantt.options.bar_corner_radius,this.width=this.gantt.options.column_width*this.duration,this.progress_width=this.gantt.options.column_width*this.duration*(this.task.progress/100)||0,this.group=_("g",{class:"bar-wrapper"+(this.task.custom_class?" "+this.task.custom_class:"")+(this.task.important?" important":""),"data-id":this.task.id}),this.bar_group=_("g",{class:"bar-group",append_to:this.group}),this.handle_group=_("g",{class:"handle-group",append_to:this.group})}prepare_helpers(){SVGElement.prototype.getX=function(){return+this.getAttribute("x")},SVGElement.prototype.getY=function(){return+this.getAttribute("y")},SVGElement.prototype.getWidth=function(){return+this.getAttribute("width")},SVGElement.prototype.getHeight=function(){return+this.getAttribute("height")},SVGElement.prototype.getEndX=function(){return this.getX()+this.getWidth()}}prepare_expected_progress_values(){this.compute_expected_progress(),this.expected_progress_width=this.gantt.options.column_width*this.duration*(this.expected_progress/100)||0}draw(){this.draw_bar(),this.draw_progress_bar(),this.gantt.options.show_expected_progress&&(this.prepare_expected_progress_values(),this.draw_expected_progress_bar()),this.draw_label(),this.draw_resize_handles(),this.task.thumbnail&&this.draw_thumbnail()}draw_bar(){this.$bar=_("rect",{x:this.x,y:this.y,width:this.width,height:this.height,rx:this.corner_radius,ry:this.corner_radius,class:"bar",append_to:this.bar_group}),l(this.$bar,"width",0,this.width),this.invalid&&this.$bar.classList.add("bar-invalid")}draw_expected_progress_bar(){this.invalid||(this.$expected_bar_progress=_("rect",{x:this.x,y:this.y,width:this.expected_progress_width,height:this.height,rx:this.corner_radius,ry:this.corner_radius,class:"bar-expected-progress",append_to:this.bar_group}),l(this.$expected_bar_progress,"width",0,this.expected_progress_width))}draw_progress_bar(){if(this.invalid)return;this.$bar_progress=_("rect",{x:this.x,y:this.y,width:this.progress_width,height:this.height,rx:this.corner_radius,ry:this.corner_radius,class:"bar-progress",append_to:this.bar_group});const t=h.diff(this.task._start,this.gantt.gantt_start,"hour")/this.gantt.options.step*this.gantt.options.column_width;this.$date_highlight=_("rect",{x:t,y:this.gantt.options.header_height-17,width:this.width,height:.8*this.height,rx:12,class:"date-highlight",append_to:this.bar_group}),l(this.$bar_progress,"width",0,this.progress_width)}draw_label(){let t=this.x+this.$bar.getWidth()/2;this.task.thumbnail&&(t=this.x+this.image_size+5),_("text",{x:t,y:this.y+this.height/2,innerHTML:this.task.name,class:"bar-label",append_to:this.bar_group}),requestAnimationFrame((()=>this.update_label_position()))}draw_thumbnail(){let t,e;t=_("defs",{append_to:this.bar_group}),_("rect",{id:"rect_"+this.task.id,x:this.x+10,y:this.y+2,width:this.image_size,height:this.image_size,rx:"15",class:"img_mask",append_to:t}),e=_("clipPath",{id:"clip_"+this.task.id,append_to:t}),_("use",{href:"#rect_"+this.task.id,append_to:e}),_("image",{x:this.x+10,y:this.y+2,width:this.image_size,height:this.image_size,class:"bar-img",href:this.task.thumbnail,clipPath:"clip_"+this.task.id,append_to:this.bar_group})}draw_resize_handles(){if(this.invalid||this.gantt.options.readonly)return;const t=this.$bar;_("rect",{x:t.getX()+t.getWidth()+8-4,y:t.getY()+1,width:8,height:this.height-2,rx:this.corner_radius,ry:this.corner_radius,class:"handle right",append_to:this.handle_group}),_("rect",{x:t.getX()-8-4,y:t.getY()+1,width:8,height:this.height-2,rx:this.corner_radius,ry:this.corner_radius,class:"handle left",append_to:this.handle_group}),this.$handle_progress=_("polygon",{points:this.get_progress_polygon_points().join(","),class:"handle progress",append_to:this.handle_group})}get_progress_polygon_points(){const t=this.$bar_progress;return[t.getEndX()-6,t.getY()+t.getHeight()+8,t.getEndX()+6,t.getY()+t.getHeight()+8,t.getEndX(),t.getY()+t.getHeight()+.5]}bind(){this.invalid||this.setup_click_event()}setup_click_event(){p.on(this.group,"mouseover",(t=>this.gantt.trigger_event("hover",[this.task,t.screenX,t.screenY,t]))),p.on(this.group,"mouseenter",(t=>this.show_popup(t.offsetX))),p.on(this.group,"mouseleave",(()=>this.gantt.hide_popup())),p.on(this.group,"focus "+this.gantt.options.popup_trigger,(t=>{this.gantt.trigger_event("click",[this.task])})),p.on(this.group,"dblclick",(t=>{this.action_completed||this.gantt.trigger_event("double_click",[this.task])}))}show_popup(t){if(this.gantt.bar_being_dragged)return;const e=`${h.format(this.task._start,"MMM D",this.gantt.options.language)} - ${h.format(h.add(this.task._end,-1,"second"),"MMM D",this.gantt.options.language)}
Progress: ${this.task.progress}`;this.gantt.show_popup({x:t,target_element:this.$bar,title:this.task.name,subtitle:e,task:this.task})}update_bar_position({x:t=null,width:e=null}){const s=this.$bar;if(t){if(!this.task.dependencies.map((t=>this.gantt.get_bar(t).$bar.getX())).reduce(((e,s)=>t>=s),t))return void(e=null);this.update_attr(s,"x",t),this.update_attr(this.$date_highlight,"x",t)}e&&(this.update_attr(s,"width",e),this.update_attr(this.$date_highlight,"width",e)),this.update_label_position(),this.update_handle_position(),this.gantt.options.show_expected_progress&&(this.date_changed(),this.compute_duration(),this.update_expected_progressbar_position()),this.update_progressbar_position(),this.update_arrow_position()}update_label_position_on_horizontal_scroll({x:t,sx:e}){const s=document.querySelector(".gantt-container"),i=this.group.querySelector(".bar-label"),o=this.group.querySelector(".bar-img")||"",a=this.bar_group.querySelector(".img_mask")||"";let n=this.$bar.getX()+this.$bar.getWidth(),r=i.getX()+t,h=o&&o.getX()+t||0,d=o&&o.getBBox().width+7||7,p=r+i.getBBox().width+7,_=e+s.clientWidth/2;i.classList.contains("big")||(p0&&p<_||r-d>this.$bar.getX()&&t<0&&p>_)&&(i.setAttribute("x",r),o&&(o.setAttribute("x",h),a.setAttribute("x",h)))}date_changed(){let t=!1;const{new_start_date:e,new_end_date:s}=this.compute_start_end_date();Number(this.task._start)!==Number(e)&&(t=!0,this.task._start=e),Number(this.task._end)!==Number(s)&&(t=!0,this.task._end=s),t&&this.gantt.trigger_event("date_change",[this.task,e,h.add(s,-1,"second")])}progress_changed(){const t=this.compute_progress();this.task.progress=t,this.gantt.trigger_event("progress_change",[this.task,t])}set_action_completed(){this.action_completed=!0,setTimeout((()=>this.action_completed=!1),1e3)}compute_start_end_date(){const t=this.$bar,e=t.getX()/this.gantt.options.column_width,s=h.add(this.gantt.gantt_start,e*this.gantt.options.step,"hour"),i=t.getWidth()/this.gantt.options.column_width;return{new_start_date:s,new_end_date:h.add(s,i*this.gantt.options.step,"hour")}}compute_progress(){const t=this.$bar_progress.getWidth()/this.$bar.getWidth()*100;return parseInt(t,10)}compute_expected_progress(){this.expected_progress=h.diff(h.today(),this.task._start,"hour")/this.gantt.options.step,this.expected_progress=100*(this.expected_progressn?(s.classList.add("big"),i?(i.setAttribute("x",e.getX()+e.getWidth()+5),t.setAttribute("x",e.getX()+e.getWidth()+5),s.setAttribute("x",e.getX()+e.getWidth()+o)):s.setAttribute("x",e.getX()+e.getWidth()+5)):(s.classList.remove("big"),i?(i.setAttribute("x",e.getX()+5),t.setAttribute("x",e.getX()+5),s.setAttribute("x",e.getX()+n/2+o)):s.setAttribute("x",e.getX()+n/2-a/2))}update_handle_position(){if(this.invalid||this.gantt.options.readonly)return;const t=this.$bar;this.handle_group.querySelector(".handle.left").setAttribute("x",t.getX()-12),this.handle_group.querySelector(".handle.right").setAttribute("x",t.getEndX()+4);const e=this.group.querySelector(".handle.progress");e&&e.setAttribute("points",this.get_progress_polygon_points())}update_arrow_position(){this.arrows=this.arrows||[];for(let t of this.arrows)t.update()}}class c{constructor(t,e,s){this.gantt=t,this.from_task=e,this.to_task=s,this.calculate_path(),this.draw()}calculate_path(){let t=this.from_task.$bar.getX()+this.from_task.$bar.getWidth()/2;const e=()=>this.to_task.$bar.getX()this.from_task.$bar.getX()+this.gantt.options.padding;for(;e();)t-=10;const s=this.gantt.options.header_height+this.gantt.options.bar_height+(this.gantt.options.padding+this.gantt.options.bar_height)*this.from_task.task._index+this.gantt.options.padding,i=this.to_task.$bar.getX()-this.gantt.options.padding/2-7,o=this.gantt.options.header_height+this.gantt.options.bar_height/2+(this.gantt.options.padding+this.gantt.options.bar_height)*this.to_task.task._index+this.gantt.options.padding,a=this.from_task.task._index>this.to_task.task._index,n=this.gantt.options.arrow_curve,r=a?1:0,h=a?-n:n,d=a?o+this.gantt.options.arrow_curve:o-this.gantt.options.arrow_curve;if(this.path=`\n M ${t} ${s}\n V ${d}\n a ${n} ${n} 0 0 ${r} ${n} ${h}\n L ${i} ${o}\n m -5 -5\n l 5 5\n l -5 5`,this.to_task.$bar.getX()\n
\n
\n ',this.hide(),this.title=this.parent.querySelector(".title"),this.subtitle=this.parent.querySelector(".subtitle"),this.pointer=this.parent.querySelector(".pointer")}show(t){if(!t.target_element)throw new Error("target_element is required to show popup");const e=t.target_element;if(this.custom_html){let e=this.custom_html(t.task);e+='
',this.parent.innerHTML=e,this.pointer=this.parent.querySelector(".pointer")}else this.title.innerHTML=t.title,this.subtitle.innerHTML=t.subtitle;let s;e instanceof HTMLElement?s=e.getBoundingClientRect():e instanceof SVGElement&&(s=t.target_element.getBBox()),this.parent.style.left=t.x-this.parent.clientWidth/2+"px",this.parent.style.top=s.y+s.height+10+"px",this.pointer.style.left=this.parent.clientWidth/2+"px",this.pointer.style.top="-15px",this.parent.style.opacity=1}hide(){this.parent.style.opacity=0,this.parent.style.left=0}}const w={HOUR:"Hour",QUARTER_DAY:"Quarter Day",HALF_DAY:"Half Day",DAY:"Day",WEEK:"Week",MONTH:"Month",YEAR:"Year"},f={HOUR:["7d","7d"],QUARTER_DAY:["7d","7d"],HALF_DAY:["7d","7d"],DAY:["1m","1m"],WEEK:["1m","1m"],MONTH:["1m","1m"],YEAR:["2y","2y"]};class b{constructor(t,e,s){this.setup_wrapper(t),this.setup_options(s),this.setup_tasks(e),this.change_view_mode(),this.bind_events()}setup_wrapper(t){let e,s;if("string"==typeof t&&(t=document.querySelector(t)),t instanceof HTMLElement)s=t,e=t.querySelector("svg");else{if(!(t instanceof SVGElement))throw new TypeError("Frappé Gantt only supports usage of a string CSS selector, HTML DOM element or SVG DOM element for the 'element' parameter");e=t}e?(this.$svg=e,this.$svg.classList.add("gantt")):this.$svg=_("svg",{append_to:s,class:"gantt"}),this.$container=document.createElement("div"),this.$container.classList.add("gantt-container");this.$svg.parentElement.appendChild(this.$container),this.$container.appendChild(this.$svg),this.popup_wrapper=document.createElement("div"),this.popup_wrapper.classList.add("popup-wrapper"),this.$container.appendChild(this.popup_wrapper)}setup_options(t){const e={header_height:50,column_width:30,step:24,view_modes:[...Object.values(w)],bar_height:30,bar_corner_radius:3,arrow_curve:5,padding:18,view_mode:"Day",date_format:"YYYY-MM-DD",popup_trigger:"click",custom_popup_html:null,language:"en",readonly:!1,highlight_weekend:!0,scroll_today:!0,lines:"both",auto_move_label:!0};this.options=Object.assign({},e,t),t.view_mode_padding||(t.view_mode_padding={});for(let[e,s]of Object.entries(t.view_mode_padding))"string"==typeof s&&(t.view_mode_padding[e]=[s,s]);this.options.view_mode_padding={...f,...t.view_mode_padding}}setup_tasks(t){this.tasks=t.map(((t,e)=>{if(t._start=h.parse(t.start),void 0===t.end&&void 0!==t.duration){t.end=t._start,t.duration.split(" ").forEach((e=>{let{duration:s,scale:i}=h.parse_duration(e);t.end=h.add(t.end,s,i)}))}if(t._end=h.parse(t.end),h.diff(t._end,t._start,"year")<0)throw console.log(t._end,t._start),Error("start of task can't be after end of task: in task #, "+(e+1));if(h.diff(t._end,t._start,"year")>10&&(t.end=null),t._index=e,!t.start&&!t.end){const e=h.today();t._start=e,t._end=h.add(e,2,"day")}!t.start&&t.end&&(t._start=h.add(t._end,-2,"day")),t.start&&!t.end&&(t._end=h.add(t._start,2,"day"));if(h.get_date_values(t._end).slice(3).every((t=>0===t))&&(t._end=h.add(t._end,24,"hour")),t.start&&t.end||(t.invalid=!0),"string"==typeof t.dependencies||!t.dependencies){let e=[];t.dependencies&&(e=t.dependencies.split(",").map((t=>t.trim().replaceAll(" ","_"))).filter((t=>t))),t.dependencies=e}return t.id?"string"==typeof t.id?t.id=t.id.replaceAll(" ","_"):t.id=`${t.id}`:t.id=function(t){return t.name+"_"+Math.random().toString(36).slice(2,12)}(t),t})),this.setup_dependencies()}setup_dependencies(){this.dependency_map={};for(let t of this.tasks)for(let e of t.dependencies)this.dependency_map[e]=this.dependency_map[e]||[],this.dependency_map[e].push(t.id)}refresh(t){this.setup_tasks(t),this.change_view_mode()}change_view_mode(t=this.options.view_mode){this.update_view_scale(t),this.setup_dates(),this.render(),this.trigger_event("view_change",[t])}update_view_scale(t){this.options.view_mode=t,t===w.HOUR?(this.options.step=1,this.options.column_width=38):t===w.DAY?(this.options.step=24,this.options.column_width=38):t===w.HALF_DAY?(this.options.step=12,this.options.column_width=38):t===w.QUARTER_DAY?(this.options.step=6,this.options.column_width=38):t===w.WEEK?(this.options.step=168,this.options.column_width=140):t===w.MONTH?(this.options.step=720,this.options.column_width=120):t===w.YEAR&&(this.options.step=8760,this.options.column_width=120)}setup_dates(){this.setup_gantt_dates(),this.setup_date_values()}setup_gantt_dates(){this.gantt_start=this.gantt_end=null;for(let t of this.tasks)(!this.gantt_start||t._startthis.gantt_end)&&(this.gantt_end=t._end);let t,e,s;t=this.gantt_start?h.start_of(this.gantt_start,"day"):new Date,e=this.gantt_end?h.start_of(this.gantt_end,"day"):new Date;for(let[t,e]of Object.entries(w))e===this.options.view_mode&&(s=t);const[i,o]=this.options.view_mode_padding[s].map(h.parse_duration);let a;t=h.add(t,-i.duration,i.scale),a=this.view_is(w.YEAR)?"YYYY":this.view_is(w.MONTH)?"YYYY-MM":this.view_is(w.DAY)?"YYYY-MM-DD":"YYYY-MM-DD HH",this.gantt_start=h.parse(h.format(t,a)),this.gantt_start.setHours(0,0,0,0),this.gantt_end=h.add(e,o.duration,o.scale)}setup_date_values(){this.dates=[];let t=null;for(;null===t||t=1&&i.getDate()<8&&(o+=" thick"),this.view_is(w.MONTH)&&i.getMonth()%3==0&&(o+=" thick"),_("path",{d:`M ${t} ${e} v ${s}`,class:o,append_to:this.layers.grid}),this.view_is(w.MONTH)?t+=h.get_days_in_month(i)*this.options.column_width/30:t+=this.options.column_width}}highlightWeekends(){if(this.view_is("Day")||this.view_is("Half Day"))for(let t=new Date(this.gantt_start);t<=this.gantt_end;t.setDate(t.getDate()+1))if(0===t.getDay()||6===t.getDay()){const e=h.diff(t,this.gantt_start,"hour")/this.options.step*this.options.column_width,s=(this.options.bar_height+this.options.padding)*this.tasks.length;_("rect",{x:e,y:this.options.header_height+this.options.padding/2,width:(this.view_is("Day")?1:2)*this.options.column_width,height:s,class:"holiday-highlight",append_to:this.layers.grid})}}computeGridHighlightDimensions(t){let e=0;if(this.view_is(w.DAY))return h.diff(h.today(),this.gantt_start,"hour")/this.options.step*this.options.column_width;for(let s of this.dates){const i=new Date,o=new Date(s),a=new Date(s);switch(t){case w.WEEK:a.setDate(s.getDate()+7);break;case w.MONTH:a.setMonth(s.getMonth()+1);break;case w.YEAR:a.setFullYear(s.getFullYear()+1)}if(i>=o&&i<=a)break;e+=this.options.column_width}return e}make_grid_highlights(){if(this.options.highlight_weekend&&this.highlightWeekends(),this.view_is(w.DAY)||this.view_is(w.WEEK)||this.view_is(w.MONTH)||this.view_is(w.YEAR)){const t=this.computeGridHighlightDimensions(this.options.view_mode),e=0,s=this.options.column_width,i=(this.options.bar_height+this.options.padding)*this.tasks.length+this.options.header_height+this.options.padding/2;let o="";switch(this.options.view_mode){case w.DAY:o="today-highlight";break;case w.WEEK:o="week-highlight";break;case w.MONTH:o="month-highlight";break;case w.YEAR:o="year-highlight"}_("rect",{x:t,y:e,width:s,height:i,class:o,append_to:this.layers.grid})}}make_dates(){for(let t of this.get_dates_to_draw()){let e=document.createElement("div");if(e.classList.add("lower-text"),e.style.left=t.lower_x+"px",e.style.top=t.lower_y+"px",e.innerText=t.lower_text,this.$header.appendChild(e),t.upper_text){let e=document.createElement("div");e.classList.add("lower-text"),e.style.left=t.upper_x+"px",e.style.top=t.upper_y+"px",e.innerText=t.upper_text,this.$header.appendChild(e),t.upper_x>this.layers.grid.getBBox().width&&e.remove()}}}get_dates_to_draw(){let t=null;return this.dates.map(((e,s)=>{const i=this.get_date_info(e,t,s);return t=i,i}))}get_date_info(t,e,s){let i=e?e.date:h.add(t,1,"day");const o={Hour_lower:h.format(t,"HH",this.options.language),"Quarter Day_lower":h.format(t,"HH",this.options.language),"Half Day_lower":h.format(t,"HH",this.options.language),Day_lower:t.getDate()!==i.getDate()?h.format(t,"D",this.options.language):"",Week_lower:t.getMonth()!==i.getMonth()?h.format(t,"D MMM",this.options.language):h.format(t,"D",this.options.language),Month_lower:h.format(t,"MMMM",this.options.language),Year_lower:h.format(t,"YYYY",this.options.language),Hour_upper:t.getDate()!==i.getDate()?h.format(t,"D MMMM",this.options.language):"","Quarter Day_upper":t.getDate()!==i.getDate()?h.format(t,"D MMM",this.options.language):"","Half Day_upper":t.getDate()!==i.getDate()?t.getMonth()!==i.getMonth()?h.format(t,"D MMM",this.options.language):h.format(t,"D",this.options.language):"",Day_upper:t.getMonth()!==i.getMonth()?h.format(t,"MMMM",this.options.language):"",Week_upper:t.getMonth()!==i.getMonth()?h.format(t,"MMMM",this.options.language):"",Month_upper:t.getFullYear()!==i.getFullYear()?h.format(t,"YYYY",this.options.language):"",Year_upper:t.getFullYear()!==i.getFullYear()?h.format(t,"YYYY",this.options.language):""};let a=this.view_is(w.MONTH)?h.get_days_in_month(t)*this.options.column_width/30:this.options.column_width;const n={x:e?e.base_pos_x+e.column_width:0,lower_y:this.options.header_height-15,upper_y:this.options.header_height-35},r={Hour_lower:this.options.column_width/2,Hour_upper:12*this.options.column_width,"Quarter Day_lower":this.options.column_width/2,"Quarter Day_upper":2*this.options.column_width,"Half Day_lower":this.options.column_width/2,"Half Day_upper":this.options.column_width,Day_lower:this.options.column_width/2,Day_upper:30*this.options.column_width/2,Week_lower:0,Week_upper:4*this.options.column_width/2,Month_lower:a/2,Month_upper:12*a/2,Year_lower:this.options.column_width/2,Year_upper:30*this.options.column_width/2};return console.log(n.x,r[`${this.options.view_mode}_lower`]),{date:t,column_width:a,base_pos_x:n.x,upper_text:o[`${this.options.view_mode}_upper`],lower_text:o[`${this.options.view_mode}_lower`],upper_x:n.x+r[`${this.options.view_mode}_upper`],upper_y:n.upper_y,lower_x:n.x+r[`${this.options.view_mode}_lower`],lower_y:n.lower_y}}make_bars(){this.bars=this.tasks.map((t=>{const e=new u(this,t);return this.layers.bar.appendChild(e.group),e}))}make_arrows(){this.arrows=[];for(let t of this.tasks){let e=[];e=t.dependencies.map((e=>{const s=this.get_task(e);if(!s)return;const i=new c(this,this.bars[s._index],this.bars[t._index]);return this.layers.arrow.appendChild(i.element),i})).filter(Boolean),this.arrows=this.arrows.concat(e)}}map_arrows_on_bars(){for(let t of this.bars)t.arrows=this.arrows.filter((e=>e.from_task.task.id===t.task.id||e.to_task.task.id===t.task.id))}set_width(){const t=this.$svg.getBoundingClientRect().width,e=this.$svg.querySelector(".grid .grid-row")?this.$svg.querySelector(".grid .grid-row").getAttribute("width"):0;t{this.unselect_all(),this.hide_popup()}))}bind_bar_events(){let t=!1,e=0,s=0,i=0,o=!1,a=!1,n=null,r=[];this.bar_being_dragged=null,p.on(this.$svg,"mousedown",".bar-wrapper, .handle",((s,h)=>{const d=p.closest(".bar-wrapper",h);r.forEach((t=>t.group.classList.remove("active"))),h.classList.contains("left")?o=!0:h.classList.contains("right")?a=!0:h.classList.contains("bar-wrapper")&&(t=!0),d.classList.add("active"),this.popup.parent.classList.add("hidden"),e=s.offsetX,i=s.offsetY,n=d.getAttribute("data-id");const _=[n,...this.get_all_dependent_tasks(n)];r=_.map((t=>this.get_bar(t))),this.bar_being_dragged=n,r.forEach((t=>{const e=t.$bar;e.ox=e.getX(),e.oy=e.getY(),e.owidth=e.getWidth(),e.finaldx=0}))})),p.on(this.$container,"scroll",(t=>{let e=document.querySelectorAll(".bar-wrapper"),i=[];const o=[];let a;s&&(a=t.currentTarget.scrollLeft-s),Array.prototype.forEach.call(e,(function(t,e){o.push(t.getAttribute("data-id"))})),a&&(i=o.map((t=>this.get_bar(t))),this.options.auto_move_label&&i.forEach((e=>{e.update_label_position_on_horizontal_scroll({x:a,sx:t.currentTarget.scrollLeft})}))),s=t.currentTarget.scrollLeft})),p.on(this.$svg,"mousemove",(s=>{if(!(t||o||a))return;const i=s.offsetX-e;s.offsetY,r.forEach((e=>{const s=e.$bar;s.finaldx=this.get_snap_position(i),this.hide_popup(),o?n===e.task.id?e.update_bar_position({x:s.ox+s.finaldx,width:s.owidth-s.finaldx}):e.update_bar_position({x:s.ox+s.finaldx}):a?n===e.task.id&&e.update_bar_position({width:s.owidth+s.finaldx}):t&&!this.options.readonly&&e.update_bar_position({x:s.ox+s.finaldx})}))})),document.addEventListener("mouseup",(e=>{t=!1,o=!1,a=!1})),p.on(this.$svg,"mouseup",(t=>{this.bar_being_dragged=null,r.forEach((t=>{t.$bar.finaldx&&(t.date_changed(),t.set_action_completed())}))})),this.bind_bar_progress()}bind_bar_progress(){let t=0,e=0,s=null,i=null,o=null,a=null;p.on(this.$svg,"mousedown",".handle.progress",((n,r)=>{s=!0,t=n.offsetX,e=n.offsetY;const h=p.closest(".bar-wrapper",r).getAttribute("data-id");i=this.get_bar(h),o=i.$bar_progress,a=i.$bar,o.finaldx=0,o.owidth=o.getWidth(),o.min_dx=-o.getWidth(),o.max_dx=a.getWidth()-o.getWidth()})),p.on(this.$svg,"mousemove",(e=>{if(!s)return;let a=e.offsetX-t;e.offsetY,a>o.max_dx&&(a=o.max_dx),a{s=!1,o&&o.finaldx&&(o.finaldx=0,i.progress_changed(),i.set_action_completed(),i=null,o=null,a=null)}))}get_all_dependent_tasks(t){let e=[],s=[t];for(;s.length;){const t=s.reduce(((t,e)=>t=t.concat(this.dependency_map[e])),[]);e=e.concat(t),s=t.filter((t=>!s.includes(t)))}return e.filter(Boolean)}get_snap_position(t){let e,s,i=t;return this.view_is(w.WEEK)?(e=t%(this.options.column_width/7),s=i-e+(e{t.classList.remove("active")})),this.popup.parent.classList.remove("hidden")}view_is(t){return"string"==typeof t?this.options.view_mode===t:!!Array.isArray(t)&&t.some((t=>this.options.view_mode===t))}get_task(t){return this.tasks.find((e=>e.id===t))}get_bar(t){return this.bars.find((e=>e.task.id===t))}show_popup(t){this.popup||(this.popup=new m(this.popup_wrapper,this.options.custom_popup_html)),this.popup.show(t)}hide_popup(){this.popup&&this.popup.hide()}trigger_event(t,e){this.options["on_"+t]&&this.options["on_"+t].apply(null,e)}get_oldest_starting_date(){return this.tasks.length?this.tasks.map((t=>t._start)).reduce(((t,e)=>e<=t?e:t)):new Date}clear(){this.$svg.innerHTML=""}}return b.VIEW_MODE=w,b}(); +var Gantt=function(){"use strict";const t="year",e="month",s="day",i="hour",a="minute",o="second",n="millisecond",r={January:"Jan",February:"Feb",March:"Mar",April:"Apr",May:"May",June:"Jun",July:"Jul",August:"Aug",September:"Sep",October:"Oct",November:"Nov",December:"Dec"};var h={parse_duration(t){const e=/([0-9])+(y|m|d|h|min|s|ms)/gm.exec(t);if(null!==e){if("y"===e[2])return{duration:parseInt(e[1]),scale:"year"};if("m"===e[2])return{duration:parseInt(e[1]),scale:"month"};if("d"===e[2])return{duration:parseInt(e[1]),scale:"day"};if("h"===e[2])return{duration:parseInt(e[1]),scale:"hour"};if("min"===e[2])return{duration:parseInt(e[1]),scale:"minute"};if("s"===e[2])return{duration:parseInt(e[1]),scale:"second"};if("ms"===e[2])return{duration:parseInt(e[1]),scale:"millisecond"}}},parse(t,e="-",s=/[.:]/){if(t instanceof Date)return t;if("string"==typeof t){let i,a;const o=t.split(" ");i=o[0].split(e).map((t=>parseInt(t,10))),a=o[1]&&o[1].split(s),i[1]=i[1]?i[1]-1:0;let n=i;return a&&a.length&&(4===a.length&&(a[3]="0."+a[3],a[3]=1e3*parseFloat(a[3])),n=n.concat(a)),new Date(...n)}},to_string(t,e=!1){if(!(t instanceof Date))throw new TypeError("Invalid argument type");const s=this.get_date_values(t).map(((t,e)=>(1===e&&(t+=1),d(t+"",6===e?3:2,"0")))),i=`${s[0]}-${s[1]}-${s[2]}`,a=`${s[3]}:${s[4]}:${s[5]}.${s[6]}`;return i+(e?" "+a:"")},format(t,e="YYYY-MM-DD HH:mm:ss.SSS",s="en"){const i=new Intl.DateTimeFormat(s,{month:"long"}).format(t),a=i.charAt(0).toUpperCase()+i.slice(1),o=this.get_date_values(t).map((t=>d(t,2,0))),n={YYYY:o[0],MM:d(+o[1]+1,2,0),DD:o[2],HH:o[3],mm:o[4],ss:o[5],SSS:o[6],D:o[2],MMMM:a,MMM:r[a]};let h=e;const p=[];return Object.keys(n).sort(((t,e)=>e.length-t.length)).forEach((t=>{h.includes(t)&&(h=h.replaceAll(t,`$${p.length}`),p.push(n[t]))})),p.forEach(((t,e)=>{h=h.replaceAll(`$${e}`,t)})),h},diff(t,e,i=s){let a,o,n,r,h,d,p;return a=t-e,o=a/1e3,r=o/60,n=r/60,h=n/24,d=h/30,p=d/12,i.endsWith("s")||(i+="s"),Math.floor({milliseconds:a,seconds:o,minutes:r,hours:n,days:h,months:d,years:p}[i])},today(){const t=this.get_date_values(new Date).slice(0,3);return new Date(...t)},now:()=>new Date,add(r,h,d){h=parseInt(h,10);const p=[r.getFullYear()+(d===t?h:0),r.getMonth()+(d===e?h:0),r.getDate()+(d===s?h:0),r.getHours()+(d===i?h:0),r.getMinutes()+(d===a?h:0),r.getSeconds()+(d===o?h:0),r.getMilliseconds()+(d===n?h:0)];return new Date(...p)},start_of(r,h){const d={[t]:6,[e]:5,[s]:4,[i]:3,[a]:2,[o]:1,[n]:0};function p(t){return d[t]<=d[h]}const _=[r.getFullYear(),p(t)?0:r.getMonth(),p(e)?1:r.getDate(),p(s)?0:r.getHours(),p(i)?0:r.getMinutes(),p(a)?0:r.getSeconds(),p(o)?0:r.getMilliseconds()];return new Date(..._)},clone(t){return new Date(...this.get_date_values(t))},get_date_values:t=>[t.getFullYear(),t.getMonth(),t.getDate(),t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()],get_days_in_month(t){const e=[31,28,31,30,31,30,31,31,30,31,30,31],s=t.getMonth();if(1!==s)return e[s];const i=t.getFullYear();return i%4==0&&i%100!=0||i%400==0?29:28}};function d(t,e,s){return t+="",e>>=0,s=String(void 0!==s?s:" "),t.length>e?String(t):((e-=t.length)>s.length&&(s+=s.repeat(e/s.length)),s.slice(0,e)+String(t))}function p(t,e){return"string"==typeof t?(e||document).querySelector(t):t||null}function _(t,e){const s=document.createElementNS("http://www.w3.org/2000/svg",t);for(let t in e)if("append_to"===t){e.append_to.appendChild(s)}else"innerHTML"===t?s.innerHTML=e.innerHTML:"clipPath"===t?s.setAttribute("clip-path","url(#"+e[t]+")"):s.setAttribute(t,e[t]);return s}function l(t,e,s,i){const a=function(t,e,s,i,a="0.4s",o="0.1s"){const n=t.querySelector("animate");if(n)return p.attr(n,{attributeName:e,from:s,to:i,dur:a,begin:"click + "+o}),t;const r=_("animate",{attributeName:e,from:s,to:i,dur:a,begin:o,calcMode:"spline",values:s+";"+i,keyTimes:"0; 1",keySplines:g("ease-out")});return t.appendChild(r),t}(t,e,s,i);if(a===t){const t=document.createEvent("HTMLEvents");t.initEvent("click",!0,!0),t.eventName="click",a.dispatchEvent(t)}}function g(t){return{ease:".25 .1 .25 1",linear:"0 0 1 1","ease-in":".42 0 1 1","ease-out":"0 0 .58 1","ease-in-out":".42 0 .58 1"}[t]}p.on=(t,e,s,i)=>{i?p.delegate(t,e,s,i):(i=s,p.bind(t,e,i))},p.off=(t,e,s)=>{t.removeEventListener(e,s)},p.bind=(t,e,s)=>{e.split(/\s+/).forEach((function(e){t.addEventListener(e,s)}))},p.delegate=(t,e,s,i)=>{t.addEventListener(e,(function(t){const e=t.target.closest(s);e&&(t.delegatedTarget=e,i.call(this,t,e))}))},p.closest=(t,e)=>e?e.matches(t)?e:p.closest(t,e.parentNode):null,p.attr=(t,e,s)=>{if(!s&&"string"==typeof e)return t.getAttribute(e);if("object"!=typeof e)t.setAttribute(e,s);else for(let s in e)p.attr(t,s,e[s])};class u{constructor(t,e){this.set_defaults(t,e),this.prepare(),this.draw(),this.bind()}set_defaults(t,e){this.action_completed=!1,this.gantt=t,this.task=e}prepare(){this.prepare_values(),this.prepare_helpers()}prepare_values(){this.invalid=this.task.invalid,this.height=this.gantt.options.bar_height,this.image_size=this.height-5,this.compute_x(),this.compute_y(),this.compute_duration(),this.corner_radius=this.gantt.options.bar_corner_radius,this.width=this.gantt.options.column_width*this.duration,this.progress_width=this.gantt.options.column_width*this.duration*(this.task.progress/100)||0,this.group=_("g",{class:"bar-wrapper"+(this.task.custom_class?" "+this.task.custom_class:"")+(this.task.important?" important":""),"data-id":this.task.id}),this.bar_group=_("g",{class:"bar-group",append_to:this.group}),this.handle_group=_("g",{class:"handle-group",append_to:this.group})}prepare_helpers(){SVGElement.prototype.getX=function(){return+this.getAttribute("x")},SVGElement.prototype.getY=function(){return+this.getAttribute("y")},SVGElement.prototype.getWidth=function(){return+this.getAttribute("width")},SVGElement.prototype.getHeight=function(){return+this.getAttribute("height")},SVGElement.prototype.getEndX=function(){return this.getX()+this.getWidth()}}prepare_expected_progress_values(){this.compute_expected_progress(),this.expected_progress_width=this.gantt.options.column_width*this.duration*(this.expected_progress/100)||0}draw(){this.draw_bar(),this.draw_progress_bar(),this.gantt.options.show_expected_progress&&(this.prepare_expected_progress_values(),this.draw_expected_progress_bar()),this.draw_label(),this.draw_resize_handles(),this.task.thumbnail&&this.draw_thumbnail()}draw_bar(){this.$bar=_("rect",{x:this.x,y:this.y,width:this.width,height:this.height,rx:this.corner_radius,ry:this.corner_radius,class:"bar",append_to:this.bar_group}),l(this.$bar,"width",0,this.width),this.invalid&&this.$bar.classList.add("bar-invalid")}draw_expected_progress_bar(){this.invalid||(this.$expected_bar_progress=_("rect",{x:this.x,y:this.y,width:this.expected_progress_width,height:this.height,rx:this.corner_radius,ry:this.corner_radius,class:"bar-expected-progress",append_to:this.bar_group}),l(this.$expected_bar_progress,"width",0,this.expected_progress_width))}draw_progress_bar(){if(this.invalid)return;this.$bar_progress=_("rect",{x:this.x,y:this.y,width:this.progress_width,height:this.height,rx:this.corner_radius,ry:this.corner_radius,class:"bar-progress",append_to:this.bar_group});const t=h.diff(this.task._start,this.gantt.gantt_start,"hour")/this.gantt.options.step*this.gantt.options.column_width;this.$date_highlight=_("rect",{x:t,y:this.gantt.options.header_height-17,width:this.width,height:.8*this.height,rx:12,class:"date-highlight",append_to:this.bar_group}),l(this.$bar_progress,"width",0,this.progress_width)}draw_label(){let t=this.x+this.$bar.getWidth()/2;this.task.thumbnail&&(t=this.x+this.image_size+5),_("text",{x:t,y:this.y+this.height/2,innerHTML:this.task.name,class:"bar-label",append_to:this.bar_group}),requestAnimationFrame((()=>this.update_label_position()))}draw_thumbnail(){let t,e;t=_("defs",{append_to:this.bar_group}),_("rect",{id:"rect_"+this.task.id,x:this.x+10,y:this.y+2,width:this.image_size,height:this.image_size,rx:"15",class:"img_mask",append_to:t}),e=_("clipPath",{id:"clip_"+this.task.id,append_to:t}),_("use",{href:"#rect_"+this.task.id,append_to:e}),_("image",{x:this.x+10,y:this.y+2,width:this.image_size,height:this.image_size,class:"bar-img",href:this.task.thumbnail,clipPath:"clip_"+this.task.id,append_to:this.bar_group})}draw_resize_handles(){if(this.invalid||this.gantt.options.readonly)return;const t=this.$bar;_("rect",{x:t.getX()+t.getWidth()+8-4,y:t.getY()+1,width:8,height:this.height-2,rx:this.corner_radius,ry:this.corner_radius,class:"handle right",append_to:this.handle_group}),_("rect",{x:t.getX()-8-4,y:t.getY()+1,width:8,height:this.height-2,rx:this.corner_radius,ry:this.corner_radius,class:"handle left",append_to:this.handle_group}),this.$handle_progress=_("polygon",{points:this.get_progress_polygon_points().join(","),class:"handle progress",append_to:this.handle_group})}get_progress_polygon_points(){const t=this.$bar_progress;return[t.getEndX()-6,t.getY()+t.getHeight()+8,t.getEndX()+6,t.getY()+t.getHeight()+8,t.getEndX(),t.getY()+t.getHeight()+.5]}bind(){this.invalid||this.setup_click_event()}setup_click_event(){p.on(this.group,"mouseover",(t=>this.gantt.trigger_event("hover",[this.task,t.screenX,t.screenY,t]))),p.on(this.group,"mouseenter",(t=>this.show_popup(t.offsetX))),p.on(this.group,"mouseleave",(()=>this.gantt.hide_popup())),p.on(this.group,"focus "+this.gantt.options.popup_trigger,(t=>{this.gantt.trigger_event("click",[this.task])})),p.on(this.group,"dblclick",(t=>{this.action_completed||this.gantt.trigger_event("double_click",[this.task])}))}show_popup(t){if(this.gantt.bar_being_dragged)return;const e=`${h.format(this.task._start,"MMM D",this.gantt.options.language)} - ${h.format(h.add(this.task._end,-1,"second"),"MMM D",this.gantt.options.language)}
Progress: ${this.task.progress}`;this.gantt.show_popup({x:t,target_element:this.$bar,title:this.task.name,subtitle:e,task:this.task})}update_bar_position({x:t=null,width:e=null}){const s=this.$bar;if(t){if(!this.task.dependencies.map((t=>this.gantt.get_bar(t).$bar.getX())).reduce(((e,s)=>t>=s),t))return void(e=null);this.update_attr(s,"x",t),this.update_attr(this.$date_highlight,"x",t)}e&&(this.update_attr(s,"width",e),this.update_attr(this.$date_highlight,"width",e)),this.update_label_position(),this.update_handle_position(),this.gantt.options.show_expected_progress&&(this.date_changed(),this.compute_duration(),this.update_expected_progressbar_position()),this.update_progressbar_position(),this.update_arrow_position()}update_label_position_on_horizontal_scroll({x:t,sx:e}){const s=document.querySelector(".gantt-container"),i=this.group.querySelector(".bar-label"),a=this.group.querySelector(".bar-img")||"",o=this.bar_group.querySelector(".img_mask")||"";let n=this.$bar.getX()+this.$bar.getWidth(),r=i.getX()+t,h=a&&a.getX()+t||0,d=a&&a.getBBox().width+7||7,p=r+i.getBBox().width+7,_=e+s.clientWidth/2;i.classList.contains("big")||(p0&&p<_||r-d>this.$bar.getX()&&t<0&&p>_)&&(i.setAttribute("x",r),a&&(a.setAttribute("x",h),o.setAttribute("x",h)))}date_changed(){let t=!1;const{new_start_date:e,new_end_date:s}=this.compute_start_end_date();Number(this.task._start)!==Number(e)&&(t=!0,this.task._start=e),Number(this.task._end)!==Number(s)&&(t=!0,this.task._end=s),t&&this.gantt.trigger_event("date_change",[this.task,e,h.add(s,-1,"second")])}progress_changed(){const t=this.compute_progress();this.task.progress=t,this.gantt.trigger_event("progress_change",[this.task,t])}set_action_completed(){this.action_completed=!0,setTimeout((()=>this.action_completed=!1),1e3)}compute_start_end_date(){const t=this.$bar,e=t.getX()/this.gantt.options.column_width,s=h.add(this.gantt.gantt_start,e*this.gantt.options.step,"hour"),i=t.getWidth()/this.gantt.options.column_width;return{new_start_date:s,new_end_date:h.add(s,i*this.gantt.options.step,"hour")}}compute_progress(){const t=this.$bar_progress.getWidth()/this.$bar.getWidth()*100;return parseInt(t,10)}compute_expected_progress(){this.expected_progress=h.diff(h.today(),this.task._start,"hour")/this.gantt.options.step,this.expected_progress=100*(this.expected_progressn?(s.classList.add("big"),i?(i.setAttribute("x",e.getX()+e.getWidth()+5),t.setAttribute("x",e.getX()+e.getWidth()+5),s.setAttribute("x",e.getX()+e.getWidth()+a)):s.setAttribute("x",e.getX()+e.getWidth()+5)):(s.classList.remove("big"),i?(i.setAttribute("x",e.getX()+5),t.setAttribute("x",e.getX()+5),s.setAttribute("x",e.getX()+n/2+a)):s.setAttribute("x",e.getX()+n/2-o/2))}update_handle_position(){if(this.invalid||this.gantt.options.readonly)return;const t=this.$bar;this.handle_group.querySelector(".handle.left").setAttribute("x",t.getX()-12),this.handle_group.querySelector(".handle.right").setAttribute("x",t.getEndX()+4);const e=this.group.querySelector(".handle.progress");e&&e.setAttribute("points",this.get_progress_polygon_points())}update_arrow_position(){this.arrows=this.arrows||[];for(let t of this.arrows)t.update()}}class c{constructor(t,e,s){this.gantt=t,this.from_task=e,this.to_task=s,this.calculate_path(),this.draw()}calculate_path(){let t=this.from_task.$bar.getX()+this.from_task.$bar.getWidth()/2;const e=()=>this.to_task.$bar.getX()this.from_task.$bar.getX()+this.gantt.options.padding;for(;e();)t-=10;const s=this.gantt.options.header_height+this.gantt.options.bar_height+(this.gantt.options.padding+this.gantt.options.bar_height)*this.from_task.task._index+this.gantt.options.padding,i=this.to_task.$bar.getX()-this.gantt.options.padding/2-7,a=this.gantt.options.header_height+this.gantt.options.bar_height/2+(this.gantt.options.padding+this.gantt.options.bar_height)*this.to_task.task._index+this.gantt.options.padding,o=this.from_task.task._index>this.to_task.task._index,n=this.gantt.options.arrow_curve,r=o?1:0,h=o?-n:n,d=o?a+this.gantt.options.arrow_curve:a-this.gantt.options.arrow_curve;if(this.path=`\n M ${t} ${s}\n V ${d}\n a ${n} ${n} 0 0 ${r} ${n} ${h}\n L ${i} ${a}\n m -5 -5\n l 5 5\n l -5 5`,this.to_task.$bar.getX()\n
\n
\n ',this.hide(),this.title=this.parent.querySelector(".title"),this.subtitle=this.parent.querySelector(".subtitle"),this.pointer=this.parent.querySelector(".pointer")}show(t){if(!t.target_element)throw new Error("target_element is required to show popup");const e=t.target_element;if(this.custom_html){let e=this.custom_html(t.task);e+='
',this.parent.innerHTML=e,this.pointer=this.parent.querySelector(".pointer")}else this.title.innerHTML=t.title,this.subtitle.innerHTML=t.subtitle;let s;e instanceof HTMLElement?s=e.getBoundingClientRect():e instanceof SVGElement&&(s=t.target_element.getBBox()),this.parent.style.left=t.x-this.parent.clientWidth/2+"px",this.parent.style.top=s.y+s.height+10+"px",this.pointer.style.left=this.parent.clientWidth/2+"px",this.pointer.style.top="-15px",this.parent.style.opacity=1}hide(){this.parent.style.opacity=0,this.parent.style.left=0}}const w={HOUR:"Hour",QUARTER_DAY:"Quarter Day",HALF_DAY:"Half Day",DAY:"Day",WEEK:"Week",MONTH:"Month",YEAR:"Year"},f={HOUR:["7d","7d"],QUARTER_DAY:["7d","7d"],HALF_DAY:["7d","7d"],DAY:["1m","1m"],WEEK:["1m","1m"],MONTH:["1m","1m"],YEAR:["2y","2y"]};class b{constructor(t,e,s){this.setup_wrapper(t),this.setup_options(s),this.setup_tasks(e),this.change_view_mode(),this.bind_events()}setup_wrapper(t){let e,s;if("string"==typeof t&&(t=document.querySelector(t)),t instanceof HTMLElement)s=t,e=t.querySelector("svg");else{if(!(t instanceof SVGElement))throw new TypeError("Frappé Gantt only supports usage of a string CSS selector, HTML DOM element or SVG DOM element for the 'element' parameter");e=t}e?(this.$svg=e,this.$svg.classList.add("gantt")):this.$svg=_("svg",{append_to:s,class:"gantt"}),this.$container=document.createElement("div"),this.$container.classList.add("gantt-container");this.$svg.parentElement.appendChild(this.$container),this.$container.appendChild(this.$svg),this.popup_wrapper=document.createElement("div"),this.popup_wrapper.classList.add("popup-wrapper"),this.$container.appendChild(this.popup_wrapper)}setup_options(t){const e={header_height:50,column_width:30,step:24,view_modes:[...Object.values(w)],bar_height:30,bar_corner_radius:3,arrow_curve:5,padding:18,view_mode:"Day",date_format:"YYYY-MM-DD",popup_trigger:"click",custom_popup_html:null,language:"en",readonly:!1,highlight_weekend:!0,scroll_today:!0,lines:"both",auto_move_label:!0};this.options=Object.assign({},e,t),t.view_mode_padding||(t.view_mode_padding={});for(let[e,s]of Object.entries(t.view_mode_padding))"string"==typeof s&&(t.view_mode_padding[e]=[s,s]);this.options.view_mode_padding={...f,...t.view_mode_padding}}setup_tasks(t){this.tasks=t.map(((t,e)=>{if(t._start=h.parse(t.start),void 0===t.end&&void 0!==t.duration){t.end=t._start,t.duration.split(" ").forEach((e=>{let{duration:s,scale:i}=h.parse_duration(e);t.end=h.add(t.end,s,i)}))}if(t._end=h.parse(t.end),h.diff(t._end,t._start,"year")<0)throw Error("start of task can't be after end of task: in task #, "+(e+1));if(h.diff(t._end,t._start,"year")>10&&(t.end=null),t._index=e,!t.start&&!t.end){const e=h.today();t._start=e,t._end=h.add(e,2,"day")}!t.start&&t.end&&(t._start=h.add(t._end,-2,"day")),t.start&&!t.end&&(t._end=h.add(t._start,2,"day"));if(h.get_date_values(t._end).slice(3).every((t=>0===t))&&(t._end=h.add(t._end,24,"hour")),t.start&&t.end||(t.invalid=!0),"string"==typeof t.dependencies||!t.dependencies){let e=[];t.dependencies&&(e=t.dependencies.split(",").map((t=>t.trim().replaceAll(" ","_"))).filter((t=>t))),t.dependencies=e}return t.id?"string"==typeof t.id?t.id=t.id.replaceAll(" ","_"):t.id=`${t.id}`:t.id=function(t){return t.name+"_"+Math.random().toString(36).slice(2,12)}(t),t})),this.setup_dependencies()}setup_dependencies(){this.dependency_map={};for(let t of this.tasks)for(let e of t.dependencies)this.dependency_map[e]=this.dependency_map[e]||[],this.dependency_map[e].push(t.id)}refresh(t){this.setup_tasks(t),this.change_view_mode()}change_view_mode(t=this.options.view_mode){this.update_view_scale(t),this.setup_dates(),this.render(),this.trigger_event("view_change",[t])}update_view_scale(t){this.options.view_mode=t,t===w.HOUR?(this.options.step=1,this.options.column_width=38):t===w.DAY?(this.options.step=24,this.options.column_width=38):t===w.HALF_DAY?(this.options.step=12,this.options.column_width=38):t===w.QUARTER_DAY?(this.options.step=6,this.options.column_width=38):t===w.WEEK?(this.options.step=168,this.options.column_width=140):t===w.MONTH?(this.options.step=720,this.options.column_width=120):t===w.YEAR&&(this.options.step=8760,this.options.column_width=120)}setup_dates(){this.setup_gantt_dates(),this.setup_date_values()}setup_gantt_dates(){this.gantt_start=this.gantt_end=null;for(let t of this.tasks)(!this.gantt_start||t._startthis.gantt_end)&&(this.gantt_end=t._end);let t,e,s;t=this.gantt_start?h.start_of(this.gantt_start,"day"):new Date,e=this.gantt_end?h.start_of(this.gantt_end,"day"):new Date;for(let[t,e]of Object.entries(w))e===this.options.view_mode&&(s=t);const[i,a]=this.options.view_mode_padding[s].map(h.parse_duration);let o;t=h.add(t,-i.duration,i.scale),o=this.view_is(w.YEAR)?"YYYY":this.view_is(w.MONTH)?"YYYY-MM":this.view_is(w.DAY)?"YYYY-MM-DD":"YYYY-MM-DD HH",this.gantt_start=h.parse(h.format(t,o)),this.gantt_start.setHours(0,0,0,0),this.gantt_end=h.add(e,a.duration,a.scale)}setup_date_values(){this.dates=[];let t=null;for(;null===t||t=1&&i.getDate()<8&&(a+=" thick"),this.view_is(w.MONTH)&&i.getMonth()%3==0&&(a+=" thick"),_("path",{d:`M ${t} ${e} v ${s}`,class:a,append_to:this.layers.grid}),this.view_is(w.MONTH)?t+=h.get_days_in_month(i)*this.options.column_width/30:t+=this.options.column_width}}highlightWeekends(){if(this.view_is("Day")||this.view_is("Half Day"))for(let t=new Date(this.gantt_start);t<=this.gantt_end;t.setDate(t.getDate()+1))if(0===t.getDay()||6===t.getDay()){const e=h.diff(t,this.gantt_start,"hour")/this.options.step*this.options.column_width,s=(this.options.bar_height+this.options.padding)*this.tasks.length;_("rect",{x:e,y:this.options.header_height+this.options.padding/2,width:(this.view_is("Day")?1:2)*this.options.column_width,height:s,class:"holiday-highlight",append_to:this.layers.grid})}}computeGridHighlightDimensions(t){let e=0;if(this.view_is(w.DAY))return h.diff(h.today(),this.gantt_start,"hour")/this.options.step*this.options.column_width;for(let s of this.dates){const i=new Date,a=new Date(s),o=new Date(s);switch(t){case w.WEEK:o.setDate(s.getDate()+7);break;case w.MONTH:o.setMonth(s.getMonth()+1);break;case w.YEAR:o.setFullYear(s.getFullYear()+1)}if(i>=a&&i<=o)break;e+=this.options.column_width}return e}make_grid_highlights(){if(this.options.highlight_weekend&&this.highlightWeekends(),this.view_is(w.DAY)||this.view_is(w.WEEK)||this.view_is(w.MONTH)||this.view_is(w.YEAR)){const t=this.computeGridHighlightDimensions(this.options.view_mode),e=0,s=this.options.column_width,i=(this.options.bar_height+this.options.padding)*this.tasks.length+this.options.header_height+this.options.padding/2;let a="";switch(this.options.view_mode){case w.DAY:a="today-highlight";break;case w.WEEK:a="week-highlight";break;case w.MONTH:a="month-highlight";break;case w.YEAR:a="year-highlight"}_("rect",{x:t,y:e,width:s,height:i,class:a,append_to:this.layers.grid})}}make_dates(){this.upper_texts_x={};for(let t of this.get_dates_to_draw()){let e=document.createElement("div");if(e.classList.add("lower-text"),e.style.left=t.lower_x+"px",e.style.top=t.lower_y+"px",e.innerText=t.lower_text,this.$lower_header.appendChild(e),t.upper_text){this.upper_texts_x[t.upper_text]=t.upper_x;let e=document.createElement("div");e.classList.add("upper-text"),e.style.left=t.upper_x+"px",e.style.top=t.upper_y+"px",e.innerText=t.upper_text,this.$upper_header.appendChild(e),t.upper_x>this.layers.grid.getBBox().width&&e.remove()}}}get_dates_to_draw(){let t=null;return this.dates.map(((e,s)=>{const i=this.get_date_info(e,t,s);return t=i,i}))}get_date_info(t,e){let s=e?e.date:h.add(t,1,"day");const i={Hour_lower:h.format(t,"HH",this.options.language),"Quarter Day_lower":h.format(t,"HH",this.options.language),"Half Day_lower":h.format(t,"HH",this.options.language),Day_lower:t.getDate()!==s.getDate()?h.format(t,"D",this.options.language):"",Week_lower:t.getMonth()!==s.getMonth()?h.format(t,"D MMM",this.options.language):h.format(t,"D",this.options.language),Month_lower:h.format(t,"MMMM",this.options.language),Year_lower:h.format(t,"YYYY",this.options.language),Hour_upper:t.getDate()!==s.getDate()?h.format(t,"D MMMM",this.options.language):"","Quarter Day_upper":t.getDate()!==s.getDate()?h.format(t,"D MMM",this.options.language):"","Half Day_upper":t.getDate()!==s.getDate()?t.getMonth()!==s.getMonth()?h.format(t,"D MMM",this.options.language):h.format(t,"D",this.options.language):"",Day_upper:t.getMonth()===s.getMonth()&&e?"":h.format(t,"MMMM",this.options.language),Week_upper:t.getMonth()!==s.getMonth()?h.format(t,"MMMM",this.options.language):"",Month_upper:t.getFullYear()!==s.getFullYear()?h.format(t,"YYYY",this.options.language):"",Year_upper:t.getFullYear()!==s.getFullYear()?h.format(t,"YYYY",this.options.language):""};let a=this.view_is(w.MONTH)?h.get_days_in_month(t)*this.options.column_width/30:this.options.column_width;const o={x:e?e.base_pos_x+e.column_width:0,lower_y:this.options.header_height-15,upper_y:this.options.header_height-40},n={Hour_lower:a/2,Hour_upper:12*a,"Quarter Day_lower":a/2,"Quarter Day_upper":2*a,"Half Day_lower":a/2,"Half Day_upper":a,Day_lower:a/2,Day_upper:a/2,Week_lower:0,Week_upper:4*a/2,Month_lower:a/2,Month_upper:a/2,Year_lower:a/2,Year_upper:30*a/2};return{date:t,column_width:a,base_pos_x:o.x,upper_text:i[`${this.options.view_mode}_upper`],lower_text:i[`${this.options.view_mode}_lower`],upper_x:o.x+n[`${this.options.view_mode}_upper`],upper_y:o.upper_y,lower_x:o.x+n[`${this.options.view_mode}_lower`],lower_y:o.lower_y}}make_bars(){this.bars=this.tasks.map((t=>{const e=new u(this,t);return this.layers.bar.appendChild(e.group),e}))}make_arrows(){this.arrows=[];for(let t of this.tasks){let e=[];e=t.dependencies.map((e=>{const s=this.get_task(e);if(!s)return;const i=new c(this,this.bars[s._index],this.bars[t._index]);return this.layers.arrow.appendChild(i.element),i})).filter(Boolean),this.arrows=this.arrows.concat(e)}}map_arrows_on_bars(){for(let t of this.bars)t.arrows=this.arrows.filter((e=>e.from_task.task.id===t.task.id||e.to_task.task.id===t.task.id))}set_width(){const t=this.$svg.getBoundingClientRect().width,e=this.$svg.querySelector(".grid .grid-row")?this.$svg.querySelector(".grid .grid-row").getAttribute("width"):0;t{this.unselect_all(),this.hide_popup()}))}bind_bar_events(){let t=!1,e=0,s=0,i=0,a=!1,o=!1,n=null,r=[];this.bar_being_dragged=null,p.on(this.$svg,"mousedown",".bar-wrapper, .handle",((s,h)=>{const d=p.closest(".bar-wrapper",h);r.forEach((t=>t.group.classList.remove("active"))),h.classList.contains("left")?a=!0:h.classList.contains("right")?o=!0:h.classList.contains("bar-wrapper")&&(t=!0),d.classList.add("active"),this.popup.parent.classList.add("hidden"),e=s.offsetX,i=s.offsetY,n=d.getAttribute("data-id");const _=[n,...this.get_all_dependent_tasks(n)];r=_.map((t=>this.get_bar(t))),this.bar_being_dragged=n,r.forEach((t=>{const e=t.$bar;e.ox=e.getX(),e.oy=e.getY(),e.owidth=e.getWidth(),e.finaldx=0}))})),p.on(this.$container,"scroll",(t=>{let e=document.querySelectorAll(".bar-wrapper"),i=[];const a=[];let o;s&&(o=t.currentTarget.scrollLeft-s);const n=t.currentTarget.scrollLeft/this.options.column_width*this.options.step/24;let r="D MMM";["Year","Month"].includes(this.options.view_mode)?r="YYYY":["Day","Week"].includes(this.options.view_mode)?r="MMMM":this.view_is("Half Day")?r="D":this.view_is("Hour")&&(r="D MMMM");let d=h.format(h.add(this.gantt_start,n,"day"),r);const p=Array.from(document.querySelectorAll(".upper-text")).find((t=>t.textContent===d));if(p&&!p.classList.contains("current-upper")){const t=document.querySelector(".current-upper");t&&(t.classList.remove("current-upper"),t.style.left=this.upper_texts_x[t.textContent]+"px",t.style.top=this.options.header_height-40+"px"),p.classList.add("current-upper");let e=this.$svg.getBoundingClientRect();p.style.left=e.x+this.$container.scrollLeft+10+"px",p.style.top=e.y+this.options.header_height-40+"px"}Array.prototype.forEach.call(e,(function(t,e){a.push(t.getAttribute("data-id"))})),o&&(i=a.map((t=>this.get_bar(t))),this.options.auto_move_label&&i.forEach((e=>{e.update_label_position_on_horizontal_scroll({x:o,sx:t.currentTarget.scrollLeft})}))),s=t.currentTarget.scrollLeft})),p.on(this.$svg,"mousemove",(s=>{if(!(t||a||o))return;const i=s.offsetX-e;s.offsetY,r.forEach((e=>{const s=e.$bar;s.finaldx=this.get_snap_position(i),this.hide_popup(),a?n===e.task.id?e.update_bar_position({x:s.ox+s.finaldx,width:s.owidth-s.finaldx}):e.update_bar_position({x:s.ox+s.finaldx}):o?n===e.task.id&&e.update_bar_position({width:s.owidth+s.finaldx}):t&&!this.options.readonly&&e.update_bar_position({x:s.ox+s.finaldx})}))})),document.addEventListener("mouseup",(e=>{t=!1,a=!1,o=!1})),p.on(this.$svg,"mouseup",(t=>{this.bar_being_dragged=null,r.forEach((t=>{t.$bar.finaldx&&(t.date_changed(),t.set_action_completed())}))})),this.bind_bar_progress()}bind_bar_progress(){let t=0,e=0,s=null,i=null,a=null,o=null;p.on(this.$svg,"mousedown",".handle.progress",((n,r)=>{s=!0,t=n.offsetX,e=n.offsetY;const h=p.closest(".bar-wrapper",r).getAttribute("data-id");i=this.get_bar(h),a=i.$bar_progress,o=i.$bar,a.finaldx=0,a.owidth=a.getWidth(),a.min_dx=-a.getWidth(),a.max_dx=o.getWidth()-a.getWidth()})),p.on(this.$svg,"mousemove",(e=>{if(!s)return;let o=e.offsetX-t;e.offsetY,o>a.max_dx&&(o=a.max_dx),o{s=!1,a&&a.finaldx&&(a.finaldx=0,i.progress_changed(),i.set_action_completed(),i=null,a=null,o=null)}))}get_all_dependent_tasks(t){let e=[],s=[t];for(;s.length;){const t=s.reduce(((t,e)=>t=t.concat(this.dependency_map[e])),[]);e=e.concat(t),s=t.filter((t=>!s.includes(t)))}return e.filter(Boolean)}get_snap_position(t){let e,s,i=t;return this.view_is(w.WEEK)?(e=t%(this.options.column_width/7),s=i-e+(e{t.classList.remove("active")})),this.popup.parent.classList.remove("hidden")}view_is(t){return"string"==typeof t?this.options.view_mode===t:!!Array.isArray(t)&&t.some((t=>this.options.view_mode===t))}get_task(t){return this.tasks.find((e=>e.id===t))}get_bar(t){return this.bars.find((e=>e.task.id===t))}show_popup(t){this.popup||(this.popup=new m(this.popup_wrapper,this.options.custom_popup_html)),this.popup.show(t)}hide_popup(){this.popup&&this.popup.hide()}trigger_event(t,e){this.options["on_"+t]&&this.options["on_"+t].apply(null,e)}get_oldest_starting_date(){return this.tasks.length?this.tasks.map((t=>t._start)).reduce(((t,e)=>e<=t?e:t)):new Date}clear(){this.$svg.innerHTML=""}}return b.VIEW_MODE=w,b}(); //# sourceMappingURL=frappe-gantt.min.js.map diff --git a/dist/frappe-gantt.min.js.map b/dist/frappe-gantt.min.js.map index 41ab608..ab890c2 100644 --- a/dist/frappe-gantt.min.js.map +++ b/dist/frappe-gantt.min.js.map @@ -1 +1 @@ -{"version":3,"file":"frappe-gantt.min.js","sources":["../src/date_utils.js","../src/svg_utils.js","../src/bar.js","../src/arrow.js","../src/popup.js","../src/index.js"],"sourcesContent":["const YEAR = \"year\";\nconst MONTH = \"month\";\nconst DAY = \"day\";\nconst HOUR = \"hour\";\nconst MINUTE = \"minute\";\nconst SECOND = \"second\";\nconst MILLISECOND = \"millisecond\";\n\nconst SHORTENED = {\n January: \"Jan\",\n February: \"Feb\",\n March: \"Mar\",\n April: \"Apr\",\n May: \"May\",\n June: \"Jun\",\n July: \"Jul\",\n August: \"Aug\",\n September: \"Sep\",\n October: \"Oct\",\n November: \"Nov\",\n December: \"Dec\"\n};\n\nexport default {\n parse_duration(duration) {\n const regex = /([0-9])+(y|m|d|h|min|s|ms)/gm;\n const matches = regex.exec(duration);\n\n if (matches !== null) {\n if (matches[2] === \"y\") {\n return { duration: parseInt(matches[1]), scale: `year` };\n } else if (matches[2] === \"m\") {\n return { duration: parseInt(matches[1]), scale: `month` };\n } else if (matches[2] === \"d\") {\n return { duration: parseInt(matches[1]), scale: `day` };\n } else if (matches[2] === \"h\") {\n return { duration: parseInt(matches[1]), scale: `hour` };\n } else if (matches[2] === \"min\") {\n return { duration: parseInt(matches[1]), scale: `minute` };\n } else if (matches[2] === \"s\") {\n return { duration: parseInt(matches[1]), scale: `second` };\n } else if (matches[2] === \"ms\") {\n return { duration: parseInt(matches[1]), scale: `millisecond` };\n }\n }\n },\n parse(date, date_separator = \"-\", time_separator = /[.:]/) {\n if (date instanceof Date) {\n return date;\n }\n if (typeof date === \"string\") {\n let date_parts, time_parts;\n const parts = date.split(\" \");\n date_parts = parts[0]\n .split(date_separator)\n .map((val) => parseInt(val, 10));\n time_parts = parts[1] && parts[1].split(time_separator);\n\n // month is 0 indexed\n date_parts[1] = date_parts[1] ? date_parts[1] - 1 : 0;\n\n let vals = date_parts;\n\n if (time_parts && time_parts.length) {\n if (time_parts.length === 4) {\n time_parts[3] = \"0.\" + time_parts[3];\n time_parts[3] = parseFloat(time_parts[3]) * 1000;\n }\n vals = vals.concat(time_parts);\n }\n return new Date(...vals);\n }\n },\n\n to_string(date, with_time = false) {\n if (!(date instanceof Date)) {\n throw new TypeError(\"Invalid argument type\");\n }\n const vals = this.get_date_values(date).map((val, i) => {\n if (i === 1) {\n // add 1 for month\n val = val + 1;\n }\n\n if (i === 6) {\n return padStart(val + \"\", 3, \"0\");\n }\n\n return padStart(val + \"\", 2, \"0\");\n });\n const date_string = `${vals[0]}-${vals[1]}-${vals[2]}`;\n const time_string = `${vals[3]}:${vals[4]}:${vals[5]}.${vals[6]}`;\n\n return date_string + (with_time ? \" \" + time_string : \"\");\n },\n\n format(date, format_string = \"YYYY-MM-DD HH:mm:ss.SSS\", lang = \"en\") {\n const dateTimeFormat = new Intl.DateTimeFormat(lang, {\n month: \"long\",\n });\n const month_name = dateTimeFormat.format(date);\n const month_name_capitalized =\n month_name.charAt(0).toUpperCase() + month_name.slice(1);\n\n const values = this.get_date_values(date).map((d) => padStart(d, 2, 0));\n const format_map = {\n YYYY: values[0],\n MM: padStart(+values[1] + 1, 2, 0),\n DD: values[2],\n HH: values[3],\n mm: values[4],\n ss: values[5],\n SSS: values[6],\n D: values[2],\n MMMM: month_name_capitalized,\n MMM: SHORTENED[month_name_capitalized],\n };\n\n let str = format_string;\n const formatted_values = [];\n\n Object.keys(format_map)\n .sort((a, b) => b.length - a.length) // big string first\n .forEach((key) => {\n if (str.includes(key)) {\n str = str.replaceAll(key, `$${formatted_values.length}`);\n formatted_values.push(format_map[key]);\n }\n });\n\n formatted_values.forEach((value, i) => {\n str = str.replaceAll(`$${i}`, value);\n });\n\n return str;\n },\n\n diff(date_a, date_b, scale = DAY) {\n let milliseconds, seconds, hours, minutes, days, months, years;\n\n milliseconds = date_a - date_b;\n seconds = milliseconds / 1000;\n minutes = seconds / 60;\n hours = minutes / 60;\n days = hours / 24;\n months = days / 30;\n years = months / 12;\n\n if (!scale.endsWith(\"s\")) {\n scale += \"s\";\n }\n\n return Math.floor(\n {\n milliseconds,\n seconds,\n minutes,\n hours,\n days,\n months,\n years,\n }[scale],\n );\n },\n\n today() {\n const vals = this.get_date_values(new Date()).slice(0, 3);\n return new Date(...vals);\n },\n\n now() {\n return new Date();\n },\n\n add(date, qty, scale) {\n qty = parseInt(qty, 10);\n const vals = [\n date.getFullYear() + (scale === YEAR ? qty : 0),\n date.getMonth() + (scale === MONTH ? qty : 0),\n date.getDate() + (scale === DAY ? qty : 0),\n date.getHours() + (scale === HOUR ? qty : 0),\n date.getMinutes() + (scale === MINUTE ? qty : 0),\n date.getSeconds() + (scale === SECOND ? qty : 0),\n date.getMilliseconds() + (scale === MILLISECOND ? qty : 0),\n ];\n return new Date(...vals);\n },\n\n start_of(date, scale) {\n const scores = {\n [YEAR]: 6,\n [MONTH]: 5,\n [DAY]: 4,\n [HOUR]: 3,\n [MINUTE]: 2,\n [SECOND]: 1,\n [MILLISECOND]: 0,\n };\n\n function should_reset(_scale) {\n const max_score = scores[scale];\n return scores[_scale] <= max_score;\n }\n\n const vals = [\n date.getFullYear(),\n should_reset(YEAR) ? 0 : date.getMonth(),\n should_reset(MONTH) ? 1 : date.getDate(),\n should_reset(DAY) ? 0 : date.getHours(),\n should_reset(HOUR) ? 0 : date.getMinutes(),\n should_reset(MINUTE) ? 0 : date.getSeconds(),\n should_reset(SECOND) ? 0 : date.getMilliseconds(),\n ];\n\n return new Date(...vals);\n },\n\n clone(date) {\n return new Date(...this.get_date_values(date));\n },\n\n get_date_values(date) {\n return [\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds(),\n ];\n },\n\n get_days_in_month(date) {\n const no_of_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\n const month = date.getMonth();\n\n if (month !== 1) {\n return no_of_days[month];\n }\n\n // Feb\n const year = date.getFullYear();\n if ((year % 4 === 0 && year % 100 != 0) || year % 400 === 0) {\n return 29;\n }\n return 28;\n },\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart\nfunction padStart(str, targetLength, padString) {\n str = str + \"\";\n targetLength = targetLength >> 0;\n padString = String(typeof padString !== \"undefined\" ? padString : \" \");\n if (str.length > targetLength) {\n return String(str);\n } else {\n targetLength = targetLength - str.length;\n if (targetLength > padString.length) {\n padString += padString.repeat(targetLength / padString.length);\n }\n return padString.slice(0, targetLength) + String(str);\n }\n}\n","export function $(expr, con) {\n return typeof expr === \"string\"\n ? (con || document).querySelector(expr)\n : expr || null;\n}\n\nexport function createSVG(tag, attrs) {\n const elem = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n for (let attr in attrs) {\n if (attr === \"append_to\") {\n const parent = attrs.append_to;\n parent.appendChild(elem);\n } else if (attr === \"innerHTML\") {\n elem.innerHTML = attrs.innerHTML;\n } else if (attr === 'clipPath') {\n elem.setAttribute('clip-path', 'url(#' + attrs[attr] + ')');\n } else {\n elem.setAttribute(attr, attrs[attr]);\n }\n }\n return elem;\n}\n\nexport function animateSVG(svgElement, attr, from, to) {\n const animatedSvgElement = getAnimationElement(svgElement, attr, from, to);\n\n if (animatedSvgElement === svgElement) {\n // triggered 2nd time programmatically\n // trigger artificial click event\n const event = document.createEvent(\"HTMLEvents\");\n event.initEvent(\"click\", true, true);\n event.eventName = \"click\";\n animatedSvgElement.dispatchEvent(event);\n }\n}\n\nfunction getAnimationElement(\n svgElement,\n attr,\n from,\n to,\n dur = \"0.4s\",\n begin = \"0.1s\",\n) {\n const animEl = svgElement.querySelector(\"animate\");\n if (animEl) {\n $.attr(animEl, {\n attributeName: attr,\n from,\n to,\n dur,\n begin: \"click + \" + begin, // artificial click\n });\n return svgElement;\n }\n\n const animateElement = createSVG(\"animate\", {\n attributeName: attr,\n from,\n to,\n dur,\n begin,\n calcMode: \"spline\",\n values: from + \";\" + to,\n keyTimes: \"0; 1\",\n keySplines: cubic_bezier(\"ease-out\"),\n });\n svgElement.appendChild(animateElement);\n\n return svgElement;\n}\n\nfunction cubic_bezier(name) {\n return {\n ease: \".25 .1 .25 1\",\n linear: \"0 0 1 1\",\n \"ease-in\": \".42 0 1 1\",\n \"ease-out\": \"0 0 .58 1\",\n \"ease-in-out\": \".42 0 .58 1\",\n }[name];\n}\n\n$.on = (element, event, selector, callback) => {\n if (!callback) {\n callback = selector;\n $.bind(element, event, callback);\n } else {\n $.delegate(element, event, selector, callback);\n }\n};\n\n$.off = (element, event, handler) => {\n element.removeEventListener(event, handler);\n};\n\n$.bind = (element, event, callback) => {\n event.split(/\\s+/).forEach(function (event) {\n element.addEventListener(event, callback);\n });\n};\n\n$.delegate = (element, event, selector, callback) => {\n element.addEventListener(event, function (e) {\n const delegatedTarget = e.target.closest(selector);\n if (delegatedTarget) {\n e.delegatedTarget = delegatedTarget;\n callback.call(this, e, delegatedTarget);\n }\n });\n};\n\n$.closest = (selector, element) => {\n if (!element) return null;\n\n if (element.matches(selector)) {\n return element;\n }\n\n return $.closest(selector, element.parentNode);\n};\n\n$.attr = (element, attr, value) => {\n if (!value && typeof attr === \"string\") {\n return element.getAttribute(attr);\n }\n\n if (typeof attr === \"object\") {\n for (let key in attr) {\n $.attr(element, key, attr[key]);\n }\n return;\n }\n\n element.setAttribute(attr, value);\n};\n","import date_utils from \"./date_utils\";\nimport { $, createSVG, animateSVG } from \"./svg_utils\";\n\nexport default class Bar {\n constructor(gantt, task) {\n this.set_defaults(gantt, task);\n this.prepare();\n this.draw();\n this.bind();\n }\n\n set_defaults(gantt, task) {\n this.action_completed = false;\n this.gantt = gantt;\n this.task = task;\n }\n\n prepare() {\n this.prepare_values();\n this.prepare_helpers();\n }\n\n prepare_values() {\n this.invalid = this.task.invalid;\n this.height = this.gantt.options.bar_height;\n this.image_size = this.height - 5;\n this.compute_x();\n this.compute_y();\n this.compute_duration();\n this.corner_radius = this.gantt.options.bar_corner_radius;\n this.width = this.gantt.options.column_width * this.duration;\n this.progress_width =\n this.gantt.options.column_width *\n this.duration *\n (this.task.progress / 100) || 0;\n this.group = createSVG(\"g\", {\n class: \"bar-wrapper\" + (this.task.custom_class ? \" \" + this.task.custom_class : \"\") + (this.task.important ? ' important' : ''),\n \"data-id\": this.task.id,\n });\n this.bar_group = createSVG(\"g\", {\n class: \"bar-group\",\n append_to: this.group,\n });\n this.handle_group = createSVG(\"g\", {\n class: \"handle-group\",\n append_to: this.group,\n });\n }\n\n prepare_helpers() {\n SVGElement.prototype.getX = function () {\n return +this.getAttribute(\"x\");\n };\n SVGElement.prototype.getY = function () {\n return +this.getAttribute(\"y\");\n };\n SVGElement.prototype.getWidth = function () {\n return +this.getAttribute(\"width\");\n };\n SVGElement.prototype.getHeight = function () {\n return +this.getAttribute(\"height\");\n };\n SVGElement.prototype.getEndX = function () {\n return this.getX() + this.getWidth();\n };\n }\n\n prepare_expected_progress_values() {\n this.compute_expected_progress();\n this.expected_progress_width =\n this.gantt.options.column_width *\n this.duration *\n (this.expected_progress / 100) || 0;\n }\n\n draw() {\n this.draw_bar();\n this.draw_progress_bar();\n if (this.gantt.options.show_expected_progress) {\n this.prepare_expected_progress_values();\n this.draw_expected_progress_bar();\n }\n this.draw_label();\n this.draw_resize_handles();\n\n if (this.task.thumbnail) {\n this.draw_thumbnail();\n }\n }\n\n draw_bar() {\n this.$bar = createSVG(\"rect\", {\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"bar\",\n append_to: this.bar_group,\n });\n\n animateSVG(this.$bar, \"width\", 0, this.width);\n\n if (this.invalid) {\n this.$bar.classList.add(\"bar-invalid\");\n }\n }\n\n draw_expected_progress_bar() {\n if (this.invalid) return;\n this.$expected_bar_progress = createSVG(\"rect\", {\n x: this.x,\n y: this.y,\n width: this.expected_progress_width,\n height: this.height,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"bar-expected-progress\",\n append_to: this.bar_group,\n });\n\n animateSVG(\n this.$expected_bar_progress,\n \"width\",\n 0,\n this.expected_progress_width,\n );\n }\n\n draw_progress_bar() {\n if (this.invalid) return;\n this.$bar_progress = createSVG(\"rect\", {\n x: this.x,\n y: this.y,\n width: this.progress_width,\n height: this.height,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"bar-progress\",\n append_to: this.bar_group,\n });\n const x = (date_utils.diff(this.task._start, this.gantt.gantt_start, 'hour') /\n this.gantt.options.step) *\n this.gantt.options.column_width;\n\n this.$date_highlight = createSVG(\"rect\", {\n x,\n y: this.gantt.options.header_height - 17,\n width: this.width,\n height: this.height * 0.8,\n rx: 12,\n class: \"date-highlight\",\n append_to: this.bar_group,\n });\n\n\n animateSVG(this.$bar_progress, \"width\", 0, this.progress_width);\n }\n\n draw_label() {\n let x_coord = this.x + this.$bar.getWidth() / 2;\n\n if (this.task.thumbnail) {\n x_coord = this.x + this.image_size + 5;\n }\n\n createSVG(\"text\", {\n x: x_coord,\n y: this.y + this.height / 2,\n innerHTML: this.task.name,\n class: \"bar-label\",\n append_to: this.bar_group,\n });\n // labels get BBox in the next tick\n requestAnimationFrame(() => this.update_label_position());\n }\n draw_thumbnail() {\n let x_offset = 10, y_offset = 2;\n let defs, clipPath;\n\n defs = createSVG('defs', {\n append_to: this.bar_group\n });\n\n createSVG('rect', {\n id: 'rect_' + this.task.id,\n x: this.x + x_offset,\n y: this.y + y_offset,\n width: this.image_size,\n height: this.image_size,\n rx: '15',\n class: 'img_mask',\n append_to: defs\n });\n\n clipPath = createSVG('clipPath', {\n id: 'clip_' + this.task.id,\n append_to: defs\n });\n\n createSVG('use', {\n href: '#rect_' + this.task.id,\n append_to: clipPath\n });\n\n createSVG('image', {\n x: this.x + x_offset,\n y: this.y + y_offset,\n width: this.image_size,\n height: this.image_size,\n class: 'bar-img',\n href: this.task.thumbnail,\n clipPath: 'clip_' + this.task.id,\n append_to: this.bar_group\n });\n }\n\n draw_resize_handles() {\n if (this.invalid || this.gantt.options.readonly) return;\n\n const bar = this.$bar;\n const handle_width = 8;\n\n createSVG(\"rect\", {\n x: bar.getX() + bar.getWidth() + handle_width - 4,\n y: bar.getY() + 1,\n width: handle_width,\n height: this.height - 2,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"handle right\",\n append_to: this.handle_group,\n });\n\n createSVG(\"rect\", {\n x: bar.getX() - handle_width - 4,\n y: bar.getY() + 1,\n width: handle_width,\n height: this.height - 2,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"handle left\",\n append_to: this.handle_group,\n });\n\n this.$handle_progress = createSVG(\"polygon\", {\n points: this.get_progress_polygon_points().join(\",\"),\n class: \"handle progress\",\n append_to: this.handle_group,\n });\n }\n\n get_progress_polygon_points() {\n const bar_progress = this.$bar_progress;\n return [\n bar_progress.getEndX() - 6,\n bar_progress.getY() + bar_progress.getHeight() + 8,\n bar_progress.getEndX() + 6,\n bar_progress.getY() + bar_progress.getHeight() + 8,\n bar_progress.getEndX(),\n bar_progress.getY() + bar_progress.getHeight() + 0.5,\n ];\n }\n\n bind() {\n if (this.invalid) return;\n this.setup_click_event();\n }\n\n setup_click_event() {\n let in_action = false;\n $.on(this.group, \"mouseover\", (e) => this.gantt.trigger_event(\"hover\", [this.task, e.screenX, e.screenY, e]))\n $.on(this.group, \"mouseenter\", (e) => this.show_popup(e.offsetX))\n $.on(this.group, \"mouseleave\", () => this.gantt.hide_popup())\n\n\n $.on(this.group, \"focus \" + this.gantt.options.popup_trigger, (e) => {\n this.gantt.trigger_event(\"click\", [this.task]);\n });\n\n $.on(this.group, \"dblclick\", (e) => {\n if (this.action_completed) {\n // just finished a move action, wait for a few seconds\n return;\n }\n\n this.gantt.trigger_event(\"double_click\", [this.task]);\n });\n }\n\n show_popup(x) {\n if (this.gantt.bar_being_dragged) return;\n\n const start_date = date_utils.format(\n this.task._start,\n \"MMM D\",\n this.gantt.options.language,\n );\n const end_date = date_utils.format(\n date_utils.add(this.task._end, -1, \"second\"),\n \"MMM D\",\n this.gantt.options.language,\n );\n const subtitle = `${start_date} - ${end_date}
Progress: ${this.task.progress}`;\n\n this.gantt.show_popup({\n x,\n target_element: this.$bar,\n title: this.task.name,\n subtitle: subtitle,\n task: this.task,\n });\n }\n\n update_bar_position({ x = null, width = null }) {\n const bar = this.$bar;\n if (x) {\n // get all x values of parent task\n const xs = this.task.dependencies.map((dep) => {\n return this.gantt.get_bar(dep).$bar.getX();\n });\n // child task must not go before parent\n const valid_x = xs.reduce((prev, curr) => {\n return x >= curr;\n }, x);\n if (!valid_x) {\n width = null;\n return;\n }\n this.update_attr(bar, \"x\", x);\n this.update_attr(this.$date_highlight, \"x\", x);\n }\n if (width) {\n this.update_attr(bar, \"width\", width);\n this.update_attr(this.$date_highlight, \"width\", width);\n }\n this.update_label_position();\n this.update_handle_position();\n if (this.gantt.options.show_expected_progress) {\n this.date_changed();\n this.compute_duration();\n this.update_expected_progressbar_position();\n }\n this.update_progressbar_position();\n this.update_arrow_position();\n }\n\n update_label_position_on_horizontal_scroll({ x, sx }) {\n const container = document.querySelector('.gantt-container');\n const label = this.group.querySelector('.bar-label');\n const img = this.group.querySelector('.bar-img') || '';\n const img_mask = this.bar_group.querySelector('.img_mask') || '';\n\n let barWidthLimit = this.$bar.getX() + this.$bar.getWidth();\n let newLabelX = label.getX() + x;\n let newImgX = img && img.getX() + x || 0;\n let imgWidth = img && img.getBBox().width + 7 || 7;\n let labelEndX = newLabelX + label.getBBox().width + 7;\n let viewportCentral = sx + container.clientWidth / 2;\n\n if (label.classList.contains('big')) return;\n\n if (labelEndX < barWidthLimit && x > 0 && labelEndX < viewportCentral) {\n label.setAttribute('x', newLabelX);\n if (img) {\n img.setAttribute('x', newImgX);\n img_mask.setAttribute('x', newImgX);\n }\n } else if ((newLabelX - imgWidth) > this.$bar.getX() && x < 0 && labelEndX > viewportCentral) {\n label.setAttribute('x', newLabelX);\n if (img) {\n img.setAttribute('x', newImgX);\n img_mask.setAttribute('x', newImgX);\n }\n\n }\n }\n\n date_changed() {\n let changed = false;\n const { new_start_date, new_end_date } = this.compute_start_end_date();\n\n if (Number(this.task._start) !== Number(new_start_date)) {\n changed = true;\n this.task._start = new_start_date;\n }\n\n if (Number(this.task._end) !== Number(new_end_date)) {\n changed = true;\n this.task._end = new_end_date;\n }\n\n if (!changed) return;\n\n this.gantt.trigger_event(\"date_change\", [\n this.task,\n new_start_date,\n date_utils.add(new_end_date, -1, \"second\"),\n ]);\n }\n\n progress_changed() {\n const new_progress = this.compute_progress();\n this.task.progress = new_progress;\n this.gantt.trigger_event(\"progress_change\", [this.task, new_progress]);\n }\n\n set_action_completed() {\n this.action_completed = true;\n setTimeout(() => (this.action_completed = false), 1000);\n }\n\n compute_start_end_date() {\n const bar = this.$bar;\n const x_in_units = bar.getX() / this.gantt.options.column_width;\n const new_start_date = date_utils.add(\n this.gantt.gantt_start,\n x_in_units * this.gantt.options.step,\n \"hour\",\n );\n const width_in_units = bar.getWidth() / this.gantt.options.column_width;\n const new_end_date = date_utils.add(\n new_start_date,\n width_in_units * this.gantt.options.step,\n \"hour\",\n );\n\n return { new_start_date, new_end_date };\n }\n\n compute_progress() {\n const progress =\n (this.$bar_progress.getWidth() / this.$bar.getWidth()) * 100;\n return parseInt(progress, 10);\n }\n\n compute_expected_progress() {\n this.expected_progress =\n date_utils.diff(date_utils.today(), this.task._start, \"hour\") /\n this.gantt.options.step;\n this.expected_progress =\n ((this.expected_progress < this.duration\n ? this.expected_progress\n : this.duration) *\n 100) /\n this.duration;\n }\n\n compute_x() {\n const { step, column_width } = this.gantt.options;\n const task_start = this.task._start;\n const gantt_start = this.gantt.gantt_start;\n\n const diff = date_utils.diff(task_start, gantt_start, \"hour\");\n let x = (diff / step) * column_width;\n\n if (this.gantt.view_is(\"Month\")) {\n const diff = date_utils.diff(task_start, gantt_start, \"day\");\n x = (diff * column_width) / 30;\n }\n this.x = x;\n }\n\n compute_y() {\n this.y =\n this.gantt.options.header_height +\n this.gantt.options.padding +\n this.task._index * (this.height + this.gantt.options.padding);\n }\n\n compute_duration() {\n this.duration =\n date_utils.diff(this.task._end, this.task._start, \"hour\") /\n this.gantt.options.step;\n }\n\n get_snap_position(dx) {\n let odx = dx,\n rem,\n position;\n\n if (this.gantt.view_is(\"Week\")) {\n rem = dx % (this.gantt.options.column_width / 7);\n position =\n odx -\n rem +\n (rem < this.gantt.options.column_width / 14\n ? 0\n : this.gantt.options.column_width / 7);\n } else if (this.gantt.view_is(\"Month\")) {\n rem = dx % (this.gantt.options.column_width / 30);\n position =\n odx -\n rem +\n (rem < this.gantt.options.column_width / 60\n ? 0\n : this.gantt.options.column_width / 30);\n } else {\n rem = dx % this.gantt.options.column_width;\n position =\n odx -\n rem +\n (rem < this.gantt.options.column_width / 2\n ? 0\n : this.gantt.options.column_width);\n }\n return position;\n }\n\n update_attr(element, attr, value) {\n value = +value;\n if (!isNaN(value)) {\n element.setAttribute(attr, value);\n }\n return element;\n }\n\n update_expected_progressbar_position() {\n if (this.invalid) return;\n this.$expected_bar_progress.setAttribute(\"x\", this.$bar.getX());\n this.compute_expected_progress();\n this.$expected_bar_progress.setAttribute(\n \"width\",\n this.gantt.options.column_width *\n this.duration *\n (this.expected_progress / 100) || 0,\n );\n }\n\n update_progressbar_position() {\n if (this.invalid || this.gantt.options.readonly) return;\n this.$bar_progress.setAttribute(\"x\", this.$bar.getX());\n this.$bar_progress.setAttribute(\n \"width\",\n this.$bar.getWidth() * (this.task.progress / 100),\n );\n }\n\n update_label_position() {\n const img_mask = this.bar_group.querySelector('.img_mask') || '';\n const bar = this.$bar,\n label = this.group.querySelector(\".bar-label\"),\n img = this.group.querySelector('.bar-img');\n\n\n let padding = 5;\n let x_offset_label_img = this.image_size + 10;\n const labelWidth = label.getBBox().width\n const barWidth = bar.getWidth()\n if (labelWidth > barWidth) {\n label.classList.add(\"big\");\n if (img) {\n img.setAttribute('x', bar.getX() + bar.getWidth() + padding);\n img_mask.setAttribute('x', bar.getX() + bar.getWidth() + padding);\n label.setAttribute('x', bar.getX() + bar.getWidth() + x_offset_label_img);\n } else {\n label.setAttribute('x', bar.getX() + bar.getWidth() + padding);\n }\n } else {\n label.classList.remove(\"big\");\n if (img) {\n img.setAttribute('x', bar.getX() + padding);\n img_mask.setAttribute('x', bar.getX() + padding);\n label.setAttribute('x', bar.getX() + barWidth / 2 + x_offset_label_img);\n } else {\n label.setAttribute('x', bar.getX() + barWidth / 2 - labelWidth / 2);\n }\n }\n }\n\n update_handle_position() {\n if (this.invalid || this.gantt.options.readonly) return;\n const bar = this.$bar;\n this.handle_group\n .querySelector(\".handle.left\")\n .setAttribute(\"x\", bar.getX() - 12);\n this.handle_group\n .querySelector(\".handle.right\")\n .setAttribute(\"x\", bar.getEndX() + 4);\n const handle = this.group.querySelector(\".handle.progress\");\n handle && handle.setAttribute(\"points\", this.get_progress_polygon_points());\n }\n\n update_arrow_position() {\n this.arrows = this.arrows || [];\n for (let arrow of this.arrows) {\n arrow.update();\n }\n }\n}\n\nfunction isFunction(functionToCheck) {\n let getType = {};\n return (\n functionToCheck &&\n getType.toString.call(functionToCheck) === \"[object Function]\"\n );\n}\n","import { createSVG } from \"./svg_utils\";\n\nexport default class Arrow {\n constructor(gantt, from_task, to_task) {\n this.gantt = gantt;\n this.from_task = from_task;\n this.to_task = to_task;\n\n this.calculate_path();\n this.draw();\n }\n\n calculate_path() {\n let start_x =\n this.from_task.$bar.getX() + this.from_task.$bar.getWidth() / 2;\n\n const condition = () =>\n this.to_task.$bar.getX() < start_x + this.gantt.options.padding &&\n start_x > this.from_task.$bar.getX() + this.gantt.options.padding;\n\n while (condition()) {\n start_x -= 10;\n }\n\n const start_y =\n this.gantt.options.header_height +\n this.gantt.options.bar_height +\n (this.gantt.options.padding + this.gantt.options.bar_height) *\n this.from_task.task._index +\n this.gantt.options.padding;\n\n const end_x = this.to_task.$bar.getX() - this.gantt.options.padding / 2 - 7;\n const end_y =\n this.gantt.options.header_height +\n this.gantt.options.bar_height / 2 +\n (this.gantt.options.padding + this.gantt.options.bar_height) *\n this.to_task.task._index +\n this.gantt.options.padding;\n\n const from_is_below_to =\n this.from_task.task._index > this.to_task.task._index;\n const curve = this.gantt.options.arrow_curve;\n const clockwise = from_is_below_to ? 1 : 0;\n const curve_y = from_is_below_to ? -curve : curve;\n const offset = from_is_below_to\n ? end_y + this.gantt.options.arrow_curve\n : end_y - this.gantt.options.arrow_curve;\n\n this.path = `\n M ${start_x} ${start_y}\n V ${offset}\n a ${curve} ${curve} 0 0 ${clockwise} ${curve} ${curve_y}\n L ${end_x} ${end_y}\n m -5 -5\n l 5 5\n l -5 5`;\n\n if (\n this.to_task.$bar.getX() <\n this.from_task.$bar.getX() + this.gantt.options.padding\n ) {\n const down_1 = this.gantt.options.padding / 2 - curve;\n const down_2 =\n this.to_task.$bar.getY() + this.to_task.$bar.getHeight() / 2 - curve_y;\n const left = this.to_task.$bar.getX() - this.gantt.options.padding;\n\n this.path = `\n M ${start_x} ${start_y}\n v ${down_1}\n a ${curve} ${curve} 0 0 1 -${curve} ${curve}\n H ${left}\n a ${curve} ${curve} 0 0 ${clockwise} -${curve} ${curve_y}\n V ${down_2}\n a ${curve} ${curve} 0 0 ${clockwise} ${curve} ${curve_y}\n L ${end_x} ${end_y}\n m -5 -5\n l 5 5\n l -5 5`;\n }\n }\n\n draw() {\n this.element = createSVG(\"path\", {\n d: this.path,\n \"data-from\": this.from_task.task.id,\n \"data-to\": this.to_task.task.id,\n });\n }\n\n update() {\n this.calculate_path();\n this.element.setAttribute(\"d\", this.path);\n }\n}\n","export default class Popup {\n constructor(parent, custom_html) {\n this.parent = parent;\n this.custom_html = custom_html;\n this.make();\n }\n\n make() {\n this.parent.innerHTML = `\n
\n
\n
\n `;\n\n this.hide();\n\n this.title = this.parent.querySelector(\".title\");\n this.subtitle = this.parent.querySelector(\".subtitle\");\n this.pointer = this.parent.querySelector(\".pointer\");\n }\n\n show(options) {\n if (!options.target_element) {\n throw new Error(\"target_element is required to show popup\");\n }\n const target_element = options.target_element;\n\n if (this.custom_html) {\n let html = this.custom_html(options.task);\n html += '
';\n this.parent.innerHTML = html;\n this.pointer = this.parent.querySelector(\".pointer\");\n } else {\n // set data\n this.title.innerHTML = options.title;\n this.subtitle.innerHTML = options.subtitle;\n }\n\n // set position\n let position_meta;\n if (target_element instanceof HTMLElement) {\n position_meta = target_element.getBoundingClientRect();\n } else if (target_element instanceof SVGElement) {\n position_meta = options.target_element.getBBox();\n }\n\n this.parent.style.left = options.x - this.parent.clientWidth / 2 + \"px\";\n this.parent.style.top = position_meta.y + position_meta.height + 10 + \"px\";\n\n this.pointer.style.left = this.parent.clientWidth / 2 + \"px\";\n this.pointer.style.top = \"-15px\";\n\n // show\n this.parent.style.opacity = 1;\n }\n\n hide() {\n this.parent.style.opacity = 0;\n this.parent.style.left = 0;\n }\n}\n","import date_utils from \"./date_utils\";\nimport { $, createSVG } from \"./svg_utils\";\nimport Bar from \"./bar\";\nimport Arrow from \"./arrow\";\nimport Popup from \"./popup\";\n\nimport \"./gantt.scss\";\n\nconst VIEW_MODE = {\n HOUR: \"Hour\",\n QUARTER_DAY: \"Quarter Day\",\n HALF_DAY: \"Half Day\",\n DAY: \"Day\",\n WEEK: \"Week\",\n MONTH: \"Month\",\n YEAR: \"Year\",\n};\n\nconst VIEW_MODE_PADDING = {\n HOUR: [\"7d\", \"7d\"],\n QUARTER_DAY: [\"7d\", \"7d\"],\n HALF_DAY: [\"7d\", \"7d\"],\n DAY: [\"1m\", \"1m\"],\n WEEK: [\"1m\", \"1m\"],\n MONTH: [\"1m\", \"1m\"],\n YEAR: [\"2y\", \"2y\"],\n};\n\nexport default class Gantt {\n constructor(wrapper, tasks, options) {\n this.setup_wrapper(wrapper);\n this.setup_options(options);\n this.setup_tasks(tasks);\n // initialize with default view mode\n this.change_view_mode();\n this.bind_events();\n }\n\n setup_wrapper(element) {\n let svg_element, wrapper_element;\n\n // CSS Selector is passed\n if (typeof element === \"string\") {\n element = document.querySelector(element);\n }\n\n // get the SVGElement\n if (element instanceof HTMLElement) {\n wrapper_element = element;\n svg_element = element.querySelector(\"svg\");\n } else if (element instanceof SVGElement) {\n svg_element = element;\n } else {\n throw new TypeError(\n \"Frappé Gantt only supports usage of a string CSS selector,\" +\n \" HTML DOM element or SVG DOM element for the 'element' parameter\",\n );\n }\n\n // svg element\n if (!svg_element) {\n // create it\n this.$svg = createSVG(\"svg\", {\n append_to: wrapper_element,\n class: \"gantt\",\n });\n } else {\n this.$svg = svg_element;\n this.$svg.classList.add(\"gantt\");\n }\n\n // wrapper element\n this.$container = document.createElement(\"div\");\n this.$container.classList.add(\"gantt-container\");\n\n const parent_element = this.$svg.parentElement;\n parent_element.appendChild(this.$container);\n this.$container.appendChild(this.$svg);\n\n // popup wrapper\n this.popup_wrapper = document.createElement(\"div\");\n this.popup_wrapper.classList.add(\"popup-wrapper\");\n this.$container.appendChild(this.popup_wrapper);\n }\n\n setup_options(options) {\n const default_options = {\n header_height: 50,\n column_width: 30,\n step: 24,\n view_modes: [...Object.values(VIEW_MODE)],\n bar_height: 30,\n bar_corner_radius: 3,\n arrow_curve: 5,\n padding: 18,\n view_mode: \"Day\",\n date_format: \"YYYY-MM-DD\",\n popup_trigger: \"click\",\n custom_popup_html: null,\n language: \"en\",\n readonly: false,\n highlight_weekend: true,\n scroll_today: true,\n lines: 'both',\n auto_move_label: true,\n };\n this.options = Object.assign({}, default_options, options);\n if (!options.view_mode_padding) options.view_mode_padding = {}\n for (let [key, value] of Object.entries(options.view_mode_padding)) {\n if (typeof value === \"string\") {\n // Configure for single value given\n options.view_mode_padding[key] = [value, value];\n }\n }\n\n this.options.view_mode_padding = {\n ...VIEW_MODE_PADDING,\n ...options.view_mode_padding,\n };\n }\n\n setup_tasks(tasks) {\n // prepare tasks\n this.tasks = tasks.map((task, i) => {\n // convert to Date objects\n task._start = date_utils.parse(task.start);\n if (task.end === undefined && task.duration !== undefined) {\n task.end = task._start;\n let durations = task.duration.split(\" \");\n\n durations.forEach((tmpDuration) => {\n let { duration, scale } = date_utils.parse_duration(tmpDuration);\n task.end = date_utils.add(task.end, duration, scale);\n });\n }\n task._end = date_utils.parse(task.end);\n let diff = date_utils.diff(task._end, task._start, \"year\");\n if (diff < 0) {\n console.log(task._end, task._start)\n throw Error(\"start of task can't be after end of task: in task #, \" + (i + 1))\n }\n // make task invalid if duration too large\n if (date_utils.diff(task._end, task._start, \"year\") > 10) {\n task.end = null;\n }\n\n\n // cache index\n task._index = i;\n\n // invalid dates\n if (!task.start && !task.end) {\n const today = date_utils.today();\n task._start = today;\n task._end = date_utils.add(today, 2, \"day\");\n }\n\n if (!task.start && task.end) {\n task._start = date_utils.add(task._end, -2, \"day\");\n }\n\n if (task.start && !task.end) {\n task._end = date_utils.add(task._start, 2, \"day\");\n }\n\n // if hours is not set, assume the last day is full day\n // e.g: 2018-09-09 becomes 2018-09-09 23:59:59\n const task_end_values = date_utils.get_date_values(task._end);\n if (task_end_values.slice(3).every((d) => d === 0)) {\n task._end = date_utils.add(task._end, 24, \"hour\");\n }\n\n // invalid flag\n if (!task.start || !task.end) {\n task.invalid = true;\n }\n\n // dependencies\n if (typeof task.dependencies === \"string\" || !task.dependencies) {\n let deps = [];\n if (task.dependencies) {\n deps = task.dependencies\n .split(\",\")\n .map((d) => d.trim().replaceAll(' ', '_'))\n .filter((d) => d);\n }\n task.dependencies = deps;\n }\n\n // uids\n if (!task.id) {\n task.id = generate_id(task);\n } else if (typeof task.id === 'string') {\n task.id = task.id.replaceAll(' ', '_')\n } else {\n task.id = `${task.id}`\n }\n\n return task;\n });\n\n this.setup_dependencies();\n }\n\n setup_dependencies() {\n this.dependency_map = {};\n for (let t of this.tasks) {\n for (let d of t.dependencies) {\n this.dependency_map[d] = this.dependency_map[d] || [];\n this.dependency_map[d].push(t.id);\n }\n }\n }\n\n refresh(tasks) {\n this.setup_tasks(tasks);\n this.change_view_mode();\n }\n\n change_view_mode(mode = this.options.view_mode) {\n this.update_view_scale(mode);\n this.setup_dates();\n this.render();\n // fire viewmode_change event\n this.trigger_event(\"view_change\", [mode]);\n }\n\n update_view_scale(view_mode) {\n this.options.view_mode = view_mode;\n if (view_mode === VIEW_MODE.HOUR) {\n this.options.step = 24 / 24;\n this.options.column_width = 38;\n } else if (view_mode === VIEW_MODE.DAY) {\n this.options.step = 24;\n this.options.column_width = 38;\n } else if (view_mode === VIEW_MODE.HALF_DAY) {\n this.options.step = 24 / 2;\n this.options.column_width = 38;\n } else if (view_mode === VIEW_MODE.QUARTER_DAY) {\n this.options.step = 24 / 4;\n this.options.column_width = 38;\n } else if (view_mode === VIEW_MODE.WEEK) {\n this.options.step = 24 * 7;\n this.options.column_width = 140;\n } else if (view_mode === VIEW_MODE.MONTH) {\n this.options.step = 24 * 30;\n this.options.column_width = 120;\n } else if (view_mode === VIEW_MODE.YEAR) {\n this.options.step = 24 * 365;\n this.options.column_width = 120;\n }\n }\n\n setup_dates() {\n this.setup_gantt_dates();\n this.setup_date_values();\n }\n\n setup_gantt_dates() {\n this.gantt_start = this.gantt_end = null;\n\n for (let task of this.tasks) {\n // set global start and end date\n if (!this.gantt_start || task._start < this.gantt_start) {\n this.gantt_start = task._start;\n }\n if (!this.gantt_end || task._end > this.gantt_end) {\n this.gantt_end = task._end;\n }\n }\n let gantt_start, gantt_end;\n if (!this.gantt_start) gantt_start = new Date();\n else gantt_start = date_utils.start_of(this.gantt_start, \"day\");\n if (!this.gantt_end) gantt_end = new Date();\n else gantt_end = date_utils.start_of(this.gantt_end, \"day\");\n\n // add date padding on both sides\n let viewKey;\n for (let [key, value] of Object.entries(VIEW_MODE)) {\n if (value === this.options.view_mode) {\n viewKey = key;\n }\n }\n const [padding_start, padding_end] = this.options.view_mode_padding[\n viewKey\n ].map(date_utils.parse_duration);\n gantt_start = date_utils.add(\n gantt_start,\n -padding_start.duration,\n padding_start.scale,\n );\n\n let format_string;\n if (this.view_is(VIEW_MODE.YEAR)) {\n format_string = \"YYYY\"\n } else if (this.view_is(VIEW_MODE.MONTH)) {\n format_string = \"YYYY-MM\"\n } else if (this.view_is(VIEW_MODE.DAY)) {\n format_string = \"YYYY-MM-DD\"\n } else {\n format_string = \"YYYY-MM-DD HH\"\n }\n this.gantt_start = date_utils.parse(date_utils.format(gantt_start, format_string));\n this.gantt_start.setHours(0, 0, 0, 0)\n this.gantt_end = date_utils.add(\n gantt_end,\n padding_end.duration,\n padding_end.scale,\n );\n }\n\n setup_date_values() {\n this.dates = [];\n let cur_date = null;\n\n while (cur_date === null || cur_date < this.gantt_end) {\n if (!cur_date) {\n cur_date = date_utils.clone(this.gantt_start);\n } else {\n if (this.view_is(VIEW_MODE.YEAR)) {\n cur_date = date_utils.add(cur_date, 1, \"year\");\n } else if (this.view_is(VIEW_MODE.MONTH)) {\n cur_date = date_utils.add(cur_date, 1, \"month\");\n } else {\n cur_date = date_utils.add(cur_date, this.options.step, \"hour\");\n }\n }\n this.dates.push(cur_date);\n }\n }\n\n bind_events() {\n if (this.options.readonly) return\n this.bind_grid_click();\n this.bind_bar_events();\n }\n\n render() {\n this.clear();\n this.setup_layers();\n this.make_grid();\n this.make_dates();\n this.make_bars();\n this.make_arrows();\n this.map_arrows_on_bars();\n this.set_width();\n this.set_scroll_position();\n if (this.options.scroll_today) this.scroll_today()\n }\n\n setup_layers() {\n this.layers = {};\n const layers = [\"grid\", \"arrow\", \"progress\", \"bar\", \"details\"];\n // make group layers\n for (let layer of layers) {\n this.layers[layer] = createSVG(\"g\", {\n class: layer,\n append_to: this.$svg,\n });\n }\n }\n\n make_grid() {\n this.make_grid_background();\n this.make_grid_rows();\n this.make_grid_header();\n this.make_grid_ticks();\n this.make_grid_highlights();\n }\n\n make_grid_background() {\n const grid_width = this.dates.length * this.options.column_width;\n const grid_height =\n this.options.header_height +\n this.options.padding +\n (this.options.bar_height + this.options.padding) * this.tasks.length;\n\n createSVG(\"rect\", {\n x: 0,\n y: 0,\n width: grid_width,\n height: grid_height,\n class: \"grid-background\",\n append_to: this.$svg,\n });\n\n $.attr(this.$svg, {\n height: grid_height + this.options.padding + 100,\n width: \"100%\",\n });\n }\n\n make_grid_rows() {\n const rows_layer = createSVG(\"g\", { append_to: this.layers.grid });\n const lines_layer = createSVG(\"g\", { append_to: this.layers.grid });\n\n const row_width = this.dates.length * this.options.column_width;\n const row_height = this.options.bar_height + this.options.padding;\n\n let row_y = this.options.header_height + this.options.padding / 2;\n\n for (let task of this.tasks) {\n createSVG(\"rect\", {\n x: 0,\n y: row_y,\n width: row_width,\n height: row_height,\n class: \"grid-row\",\n append_to: rows_layer,\n });\n if (this.options.lines === 'both' || this.options.lines === 'horizontal') {\n createSVG(\"line\", {\n x1: 0,\n y1: row_y + row_height,\n x2: row_width,\n y2: row_y + row_height,\n class: \"row-line\",\n append_to: lines_layer,\n });\n }\n\n row_y += this.options.bar_height + this.options.padding;\n }\n }\n\n make_grid_header() {\n let $header = document.createElement(\"div\");\n\n $header.style.height = this.options.header_height + 10 + \"px\";\n $header.style.width = this.dates.length * this.options.column_width + \"px\";\n $header.classList.add('grid-header')\n this.$header = $header\n this.$svg.parentElement.appendChild($header)\n\n let $today_button = document.createElement('button')\n $today_button.id = 'today-button'\n $today_button.textContent = 'Today'\n $today_button.onclick = this.scroll_today.bind(this)\n this.$header.appendChild($today_button)\n }\n\n make_grid_ticks() {\n if (this.options.lines !== 'both' && this.options.lines !== 'vertical') return\n let tick_x = 0;\n let tick_y = this.options.header_height + this.options.padding / 2;\n let tick_height =\n (this.options.bar_height + this.options.padding) * this.tasks.length;\n\n for (let date of this.dates) {\n let tick_class = \"tick\";\n // thick tick for monday\n if (this.view_is(VIEW_MODE.DAY) && date.getDate() === 1) {\n tick_class += \" thick\";\n }\n // thick tick for first week\n if (\n this.view_is(VIEW_MODE.WEEK) &&\n date.getDate() >= 1 &&\n date.getDate() < 8\n ) {\n tick_class += \" thick\";\n }\n // thick ticks for quarters\n if (this.view_is(VIEW_MODE.MONTH) && date.getMonth() % 3 === 0) {\n tick_class += \" thick\";\n }\n\n createSVG(\"path\", {\n d: `M ${tick_x} ${tick_y} v ${tick_height}`,\n class: tick_class,\n append_to: this.layers.grid,\n });\n\n if (this.view_is(VIEW_MODE.MONTH)) {\n tick_x +=\n (date_utils.get_days_in_month(date) * this.options.column_width) / 30;\n } else {\n tick_x += this.options.column_width;\n }\n }\n }\n\n highlightWeekends() {\n if (!this.view_is('Day') && !this.view_is('Half Day')) return\n for (let d = new Date(this.gantt_start); d <= this.gantt_end; d.setDate(d.getDate() + 1)) {\n if (d.getDay() === 0 || d.getDay() === 6) {\n const x = (date_utils.diff(d, this.gantt_start, 'hour') /\n this.options.step) *\n this.options.column_width;\n const height = (this.options.bar_height + this.options.padding) * this.tasks.length;\n createSVG('rect', {\n x,\n y: this.options.header_height + this.options.padding / 2,\n width: (this.view_is('Day') ? 1 : 2) * this.options.column_width,\n height,\n class: 'holiday-highlight',\n append_to: this.layers.grid,\n });\n }\n }\n }\n\n //compute the horizontal x distance\n computeGridHighlightDimensions(view_mode) {\n let xDist = 0;\n\n if (this.view_is(VIEW_MODE.DAY)) {\n return (\n (date_utils.diff(date_utils.today(), this.gantt_start, \"hour\") /\n this.options.step) *\n this.options.column_width\n );\n }\n\n for (let date of this.dates) {\n const todayDate = new Date();\n const startDate = new Date(date);\n const endDate = new Date(date);\n switch (view_mode) {\n case VIEW_MODE.WEEK:\n endDate.setDate(date.getDate() + 7);\n break;\n case VIEW_MODE.MONTH:\n endDate.setMonth(date.getMonth() + 1);\n break;\n case VIEW_MODE.YEAR:\n endDate.setFullYear(date.getFullYear() + 1);\n break;\n }\n if (todayDate >= startDate && todayDate <= endDate) {\n break;\n } else {\n xDist += this.options.column_width;\n }\n }\n return xDist;\n }\n\n make_grid_highlights() {\n if (this.options.highlight_weekend) this.highlightWeekends()\n // highlight today's | week's | month's | year's\n if (\n this.view_is(VIEW_MODE.DAY) ||\n this.view_is(VIEW_MODE.WEEK) ||\n this.view_is(VIEW_MODE.MONTH) ||\n this.view_is(VIEW_MODE.YEAR)\n ) {\n const x = this.computeGridHighlightDimensions(this.options.view_mode);\n const y = 0;\n const width = this.options.column_width;\n const height =\n (this.options.bar_height + this.options.padding) * this.tasks.length +\n this.options.header_height +\n this.options.padding / 2;\n\n let className = \"\";\n switch (this.options.view_mode) {\n case VIEW_MODE.DAY:\n className = \"today-highlight\";\n break;\n case VIEW_MODE.WEEK:\n className = \"week-highlight\";\n break;\n case VIEW_MODE.MONTH:\n className = \"month-highlight\";\n break;\n case VIEW_MODE.YEAR:\n className = \"year-highlight\";\n break;\n }\n createSVG(\"rect\", {\n x,\n y,\n width,\n height,\n class: className,\n append_to: this.layers.grid,\n });\n }\n }\n\n make_dates() {\n for (let date of this.get_dates_to_draw()) {\n let $lower_text = document.createElement('div');\n $lower_text.classList.add('lower-text')\n $lower_text.style.left = date.lower_x + 'px'\n $lower_text.style.top = date.lower_y + 'px'\n $lower_text.innerText = date.lower_text\n this.$header.appendChild($lower_text)\n\n if (date.upper_text) {\n let $upper_text = document.createElement('div');\n $upper_text.classList.add('lower-text')\n $upper_text.style.left = date.upper_x + 'px'\n $upper_text.style.top = date.upper_y + 'px'\n $upper_text.innerText = date.upper_text\n this.$header.appendChild($upper_text)\n\n // remove out-of-bound dates\n if (date.upper_x > this.layers.grid.getBBox().width) {\n $upper_text.remove();\n }\n }\n }\n }\n\n get_dates_to_draw() {\n let last_date = null;\n const dates = this.dates.map((date, i) => {\n const d = this.get_date_info(date, last_date, i);\n last_date = d;\n return d;\n });\n return dates;\n }\n\n get_date_info(date, last_date_info, i) {\n let last_date = last_date_info ? last_date_info.date : date_utils.add(date, 1, \"day\")\n\n const date_text = {\n Hour_lower: date_utils.format(date, \"HH\", this.options.language),\n \"Quarter Day_lower\": date_utils.format(date, \"HH\", this.options.language),\n \"Half Day_lower\": date_utils.format(date, \"HH\", this.options.language),\n Day_lower:\n date.getDate() !== last_date.getDate()\n ? date_utils.format(date, \"D\", this.options.language)\n : \"\",\n Week_lower:\n date.getMonth() !== last_date.getMonth()\n ? date_utils.format(date, \"D MMM\", this.options.language)\n : date_utils.format(date, \"D\", this.options.language),\n Month_lower: date_utils.format(date, \"MMMM\", this.options.language),\n Year_lower: date_utils.format(date, \"YYYY\", this.options.language),\n Hour_upper:\n date.getDate() !== last_date.getDate()\n ? date_utils.format(date, \"D MMMM\", this.options.language)\n : \"\",\n \"Quarter Day_upper\":\n date.getDate() !== last_date.getDate()\n ? date_utils.format(date, \"D MMM\", this.options.language)\n : \"\",\n \"Half Day_upper\":\n date.getDate() !== last_date.getDate()\n ? date.getMonth() !== last_date.getMonth()\n ? date_utils.format(date, \"D MMM\", this.options.language)\n : date_utils.format(date, \"D\", this.options.language)\n : \"\",\n Day_upper:\n date.getMonth() !== last_date.getMonth()\n ? date_utils.format(date, \"MMMM\", this.options.language)\n : \"\",\n Week_upper:\n date.getMonth() !== last_date.getMonth()\n ? date_utils.format(date, \"MMMM\", this.options.language)\n : \"\",\n Month_upper:\n date.getFullYear() !== last_date.getFullYear()\n ? date_utils.format(date, \"YYYY\", this.options.language)\n : \"\",\n Year_upper:\n date.getFullYear() !== last_date.getFullYear()\n ? date_utils.format(date, \"YYYY\", this.options.language)\n : \"\",\n };\n let column_width = this.view_is(VIEW_MODE.MONTH) ? (date_utils.get_days_in_month(date) * this.options.column_width) / 30 : this.options.column_width;\n const base_pos = {\n x: last_date_info\n ? last_date_info.base_pos_x + last_date_info.column_width\n : 0,\n lower_y: this.options.header_height - 15,\n upper_y: this.options.header_height - 35,\n };\n\n const x_pos = {\n Hour_lower: this.options.column_width / 2,\n Hour_upper: this.options.column_width * 12,\n \"Quarter Day_lower\": this.options.column_width / 2,\n \"Quarter Day_upper\": this.options.column_width * 2,\n \"Half Day_lower\": this.options.column_width / 2,\n \"Half Day_upper\": this.options.column_width,\n Day_lower: this.options.column_width / 2,\n Day_upper: (this.options.column_width * 30) / 2,\n Week_lower: 0,\n Week_upper: (this.options.column_width * 4) / 2,\n Month_lower: column_width / 2,\n Month_upper: (column_width * 12) / 2,\n Year_lower: this.options.column_width / 2,\n Year_upper: (this.options.column_width * 30) / 2,\n };\n console.log(base_pos.x, x_pos[`${this.options.view_mode}_lower`],)\n return {\n date,\n column_width,\n base_pos_x: base_pos.x,\n upper_text: date_text[`${this.options.view_mode}_upper`],\n lower_text: date_text[`${this.options.view_mode}_lower`],\n upper_x: base_pos.x + x_pos[`${this.options.view_mode}_upper`],\n upper_y: base_pos.upper_y,\n lower_x: base_pos.x + x_pos[`${this.options.view_mode}_lower`],\n lower_y: base_pos.lower_y,\n };\n }\n\n make_bars() {\n this.bars = this.tasks.map((task) => {\n const bar = new Bar(this, task);\n this.layers.bar.appendChild(bar.group);\n return bar;\n });\n }\n\n make_arrows() {\n this.arrows = [];\n for (let task of this.tasks) {\n let arrows = [];\n arrows = task.dependencies\n .map((task_id) => {\n const dependency = this.get_task(task_id);\n if (!dependency) return;\n const arrow = new Arrow(\n this,\n this.bars[dependency._index], // from_task\n this.bars[task._index], // to_task\n );\n this.layers.arrow.appendChild(arrow.element);\n return arrow;\n })\n .filter(Boolean); // filter falsy values\n this.arrows = this.arrows.concat(arrows);\n }\n }\n\n map_arrows_on_bars() {\n for (let bar of this.bars) {\n bar.arrows = this.arrows.filter((arrow) => {\n return (\n arrow.from_task.task.id === bar.task.id ||\n arrow.to_task.task.id === bar.task.id\n );\n });\n }\n }\n\n set_width() {\n const cur_width = this.$svg.getBoundingClientRect().width;\n const actual_width = this.$svg.querySelector('.grid .grid-row') ? this.$svg\n .querySelector('.grid .grid-row')\n .getAttribute('width') : 0;\n if (cur_width < actual_width) {\n this.$svg.setAttribute(\"width\", actual_width);\n }\n }\n\n set_scroll_position(date) {\n if (!date) {\n date = this.gantt_start\n }\n\n const parent_element = this.$svg.parentElement;\n if (!parent_element) return;\n\n const hours_before_first_task = date_utils.diff(\n this.get_oldest_starting_date(),\n date,\n \"hour\",\n );\n\n const scroll_pos =\n (hours_before_first_task / this.options.step) *\n this.options.column_width -\n this.options.column_width;\n console.log(parent_element.scrollTo({ left: scroll_pos, behavior: 'smooth' }))\n }\n\n scroll_today() {\n const oldest = this.get_oldest_starting_date().getTime()\n const t = new Date() - oldest\n this.set_scroll_position(new Date(this.gantt_start.getTime() - t))\n }\n\n bind_grid_click() {\n $.on(\n this.$svg,\n this.options.popup_trigger,\n \".grid-row, .grid-header\",\n () => {\n this.unselect_all();\n this.hide_popup();\n },\n );\n }\n\n bind_bar_events() {\n let is_dragging = false;\n let x_on_start = 0;\n let x_on_scroll_start = 0;\n let y_on_start = 0;\n let is_resizing_left = false;\n let is_resizing_right = false;\n let parent_bar_id = null;\n let bars = []; // instanceof Bar\n this.bar_being_dragged = null;\n\n function action_in_progress() {\n return is_dragging || is_resizing_left || is_resizing_right;\n }\n\n $.on(this.$svg, \"mousedown\", \".bar-wrapper, .handle\", (e, element) => {\n const bar_wrapper = $.closest(\".bar-wrapper\", element);\n bars.forEach((bar) => bar.group.classList.remove(\"active\"));\n\n if (element.classList.contains(\"left\")) {\n is_resizing_left = true;\n } else if (element.classList.contains(\"right\")) {\n is_resizing_right = true;\n } else if (element.classList.contains(\"bar-wrapper\")) {\n is_dragging = true;\n }\n\n bar_wrapper.classList.add(\"active\");\n this.popup.parent.classList.add('hidden')\n\n x_on_start = e.offsetX;\n y_on_start = e.offsetY;\n\n parent_bar_id = bar_wrapper.getAttribute(\"data-id\");\n const ids = [\n parent_bar_id,\n ...this.get_all_dependent_tasks(parent_bar_id),\n ];\n bars = ids.map((id) => this.get_bar(id));\n\n this.bar_being_dragged = parent_bar_id;\n\n bars.forEach((bar) => {\n const $bar = bar.$bar;\n $bar.ox = $bar.getX();\n $bar.oy = $bar.getY();\n $bar.owidth = $bar.getWidth();\n $bar.finaldx = 0;\n });\n });\n $.on(this.$container, 'scroll', e => {\n let elements = document.querySelectorAll('.bar-wrapper');\n let localBars = [];\n const ids = [];\n let dx;\n if (x_on_scroll_start) {\n dx = e.currentTarget.scrollLeft - x_on_scroll_start;\n }\n\n Array.prototype.forEach.call(elements, function (el, i) {\n ids.push(el.getAttribute('data-id'));\n });\n\n if (dx) {\n localBars = ids.map(id => this.get_bar(id));\n if (this.options.auto_move_label) {\n localBars.forEach(bar => {\n bar.update_label_position_on_horizontal_scroll({ x: dx, sx: e.currentTarget.scrollLeft });\n });\n }\n }\n\n x_on_scroll_start = e.currentTarget.scrollLeft;\n });\n\n $.on(this.$svg, \"mousemove\", (e) => {\n if (!action_in_progress()) return;\n const dx = e.offsetX - x_on_start;\n const dy = e.offsetY - y_on_start;\n\n bars.forEach((bar) => {\n const $bar = bar.$bar;\n $bar.finaldx = this.get_snap_position(dx);\n this.hide_popup();\n if (is_resizing_left) {\n if (parent_bar_id === bar.task.id) {\n bar.update_bar_position({\n x: $bar.ox + $bar.finaldx,\n width: $bar.owidth - $bar.finaldx,\n });\n } else {\n bar.update_bar_position({\n x: $bar.ox + $bar.finaldx,\n });\n }\n } else if (is_resizing_right) {\n if (parent_bar_id === bar.task.id) {\n bar.update_bar_position({\n width: $bar.owidth + $bar.finaldx,\n });\n }\n } else if (is_dragging && !this.options.readonly) {\n bar.update_bar_position({ x: $bar.ox + $bar.finaldx });\n }\n });\n });\n\n document.addEventListener(\"mouseup\", (e) => {\n\n is_dragging = false;\n is_resizing_left = false;\n is_resizing_right = false;\n });\n\n $.on(this.$svg, \"mouseup\", (e) => {\n this.bar_being_dragged = null;\n bars.forEach((bar) => {\n const $bar = bar.$bar;\n if (!$bar.finaldx) return;\n bar.date_changed();\n bar.set_action_completed();\n });\n });\n\n this.bind_bar_progress();\n }\n\n bind_bar_progress() {\n let x_on_start = 0;\n let y_on_start = 0;\n let is_resizing = null;\n let bar = null;\n let $bar_progress = null;\n let $bar = null;\n\n $.on(this.$svg, \"mousedown\", \".handle.progress\", (e, handle) => {\n is_resizing = true;\n x_on_start = e.offsetX;\n y_on_start = e.offsetY;\n\n const $bar_wrapper = $.closest(\".bar-wrapper\", handle);\n const id = $bar_wrapper.getAttribute(\"data-id\");\n bar = this.get_bar(id);\n\n $bar_progress = bar.$bar_progress;\n $bar = bar.$bar;\n\n $bar_progress.finaldx = 0;\n $bar_progress.owidth = $bar_progress.getWidth();\n $bar_progress.min_dx = -$bar_progress.getWidth();\n $bar_progress.max_dx = $bar.getWidth() - $bar_progress.getWidth();\n });\n\n $.on(this.$svg, \"mousemove\", (e) => {\n if (!is_resizing) return;\n let dx = e.offsetX - x_on_start;\n let dy = e.offsetY - y_on_start;\n\n if (dx > $bar_progress.max_dx) {\n dx = $bar_progress.max_dx;\n }\n if (dx < $bar_progress.min_dx) {\n dx = $bar_progress.min_dx;\n }\n\n const $handle = bar.$handle_progress;\n $.attr($bar_progress, \"width\", $bar_progress.owidth + dx);\n $.attr($handle, \"points\", bar.get_progress_polygon_points());\n $bar_progress.finaldx = dx;\n });\n\n $.on(this.$svg, \"mouseup\", () => {\n is_resizing = false;\n if (!($bar_progress && $bar_progress.finaldx)) return;\n\n $bar_progress.finaldx = 0;\n bar.progress_changed();\n bar.set_action_completed();\n bar = null;\n $bar_progress = null;\n $bar = null;\n });\n }\n\n get_all_dependent_tasks(task_id) {\n let out = [];\n let to_process = [task_id];\n while (to_process.length) {\n const deps = to_process.reduce((acc, curr) => {\n acc = acc.concat(this.dependency_map[curr]);\n return acc;\n }, []);\n\n out = out.concat(deps);\n to_process = deps.filter((d) => !to_process.includes(d));\n }\n\n return out.filter(Boolean);\n }\n\n get_snap_position(dx) {\n let odx = dx,\n rem,\n position;\n\n if (this.view_is(VIEW_MODE.WEEK)) {\n rem = dx % (this.options.column_width / 7);\n position =\n odx -\n rem +\n (rem < this.options.column_width / 14\n ? 0\n : this.options.column_width / 7);\n } else if (this.view_is(VIEW_MODE.MONTH)) {\n rem = dx % (this.options.column_width / 30);\n position =\n odx -\n rem +\n (rem < this.options.column_width / 60\n ? 0\n : this.options.column_width / 30);\n } else {\n rem = dx % this.options.column_width;\n position =\n odx -\n rem +\n (rem < this.options.column_width / 2 ? 0 : this.options.column_width);\n }\n return position;\n }\n\n unselect_all() {\n [...this.$svg.querySelectorAll(\".bar-wrapper\")].forEach((el) => {\n el.classList.remove(\"active\");\n });\n this.popup.parent.classList.remove('hidden')\n }\n\n view_is(modes) {\n if (typeof modes === \"string\") {\n return this.options.view_mode === modes;\n }\n\n if (Array.isArray(modes)) {\n return modes.some((mode) => this.options.view_mode === mode);\n }\n\n return false;\n }\n\n get_task(id) {\n return this.tasks.find((task) => {\n return task.id === id;\n });\n }\n\n get_bar(id) {\n return this.bars.find((bar) => {\n return bar.task.id === id;\n });\n }\n\n show_popup(options) {\n if (!this.popup) {\n this.popup = new Popup(\n this.popup_wrapper,\n this.options.custom_popup_html,\n );\n }\n this.popup.show(options);\n }\n\n hide_popup() {\n this.popup && this.popup.hide();\n }\n\n trigger_event(event, args) {\n if (this.options[\"on_\" + event]) {\n this.options[\"on_\" + event].apply(null, args);\n }\n }\n\n /**\n * Gets the oldest starting date from the list of tasks\n *\n * @returns Date\n * @memberof Gantt\n */\n get_oldest_starting_date() {\n if (!this.tasks.length) return new Date()\n return this.tasks\n .map((task) => task._start)\n .reduce((prev_date, cur_date) =>\n cur_date <= prev_date ? cur_date : prev_date,\n );\n }\n\n /**\n * Clear all elements from the parent svg element\n *\n * @memberof Gantt\n */\n clear() {\n this.$svg.innerHTML = \"\";\n }\n}\n\nGantt.VIEW_MODE = VIEW_MODE;\n\nfunction generate_id(task) {\n return task.name + \"_\" + Math.random().toString(36).slice(2, 12);\n}\n"],"names":["YEAR","MONTH","DAY","HOUR","MINUTE","SECOND","MILLISECOND","SHORTENED","January","February","March","April","May","June","July","August","September","October","November","December","date_utils","parse_duration","duration","matches","exec","parseInt","scale","parse","date","date_separator","time_separator","Date","date_parts","time_parts","parts","split","map","val","vals","length","parseFloat","concat","to_string","with_time","TypeError","this","get_date_values","i","padStart","date_string","time_string","format","format_string","lang","month_name","Intl","DateTimeFormat","month","month_name_capitalized","charAt","toUpperCase","slice","values","d","format_map","YYYY","MM","DD","HH","mm","ss","SSS","D","MMMM","MMM","str","formatted_values","Object","keys","sort","a","b","forEach","key","includes","replaceAll","push","value","diff","date_a","date_b","milliseconds","seconds","hours","minutes","days","months","years","endsWith","Math","floor","today","now","add","qty","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","start_of","scores","should_reset","_scale","clone","get_days_in_month","no_of_days","year","targetLength","padString","String","repeat","$","expr","con","document","querySelector","createSVG","tag","attrs","elem","createElementNS","attr","append_to","appendChild","innerHTML","setAttribute","animateSVG","svgElement","from","to","animatedSvgElement","dur","begin","animEl","attributeName","animateElement","calcMode","keyTimes","keySplines","cubic_bezier","getAnimationElement","event","createEvent","initEvent","eventName","dispatchEvent","name","ease","linear","on","element","selector","callback","delegate","bind","off","handler","removeEventListener","addEventListener","e","delegatedTarget","target","closest","call","parentNode","getAttribute","Bar","constructor","gantt","task","set_defaults","prepare","draw","action_completed","prepare_values","prepare_helpers","invalid","height","options","bar_height","image_size","compute_x","compute_y","compute_duration","corner_radius","bar_corner_radius","width","column_width","progress_width","progress","group","class","custom_class","important","id","bar_group","handle_group","SVGElement","prototype","getX","getY","getWidth","getHeight","getEndX","prepare_expected_progress_values","compute_expected_progress","expected_progress_width","expected_progress","draw_bar","draw_progress_bar","show_expected_progress","draw_expected_progress_bar","draw_label","draw_resize_handles","thumbnail","draw_thumbnail","$bar","x","y","rx","ry","classList","$expected_bar_progress","$bar_progress","_start","gantt_start","step","$date_highlight","header_height","x_coord","requestAnimationFrame","update_label_position","defs","clipPath","href","readonly","bar","$handle_progress","points","get_progress_polygon_points","join","bar_progress","setup_click_event","trigger_event","screenX","screenY","show_popup","offsetX","hide_popup","popup_trigger","bar_being_dragged","subtitle","language","_end","target_element","title","update_bar_position","dependencies","dep","get_bar","reduce","prev","curr","update_attr","update_handle_position","date_changed","update_expected_progressbar_position","update_progressbar_position","update_arrow_position","update_label_position_on_horizontal_scroll","sx","container","label","img","img_mask","barWidthLimit","newLabelX","newImgX","imgWidth","getBBox","labelEndX","viewportCentral","clientWidth","contains","changed","new_start_date","new_end_date","compute_start_end_date","Number","progress_changed","new_progress","compute_progress","set_action_completed","setTimeout","x_in_units","width_in_units","task_start","view_is","padding","_index","get_snap_position","dx","rem","position","odx","isNaN","x_offset_label_img","labelWidth","barWidth","remove","handle","arrows","arrow","update","Arrow","from_task","to_task","calculate_path","start_x","condition","start_y","end_x","end_y","from_is_below_to","curve","arrow_curve","clockwise","curve_y","offset","path","down_1","down_2","left","Popup","parent","custom_html","make","hide","pointer","show","Error","html","position_meta","HTMLElement","getBoundingClientRect","style","top","opacity","VIEW_MODE","QUARTER_DAY","HALF_DAY","WEEK","VIEW_MODE_PADDING","Gantt","wrapper","tasks","setup_wrapper","setup_options","setup_tasks","change_view_mode","bind_events","svg_element","wrapper_element","$svg","$container","createElement","parentElement","popup_wrapper","default_options","view_modes","view_mode","date_format","custom_popup_html","highlight_weekend","scroll_today","lines","auto_move_label","assign","view_mode_padding","entries","start","undefined","end","tmpDuration","console","log","every","deps","trim","filter","random","toString","generate_id","setup_dependencies","dependency_map","t","refresh","mode","update_view_scale","setup_dates","render","setup_gantt_dates","setup_date_values","gantt_end","viewKey","padding_start","padding_end","setHours","dates","cur_date","bind_grid_click","bind_bar_events","clear","setup_layers","make_grid","make_dates","make_bars","make_arrows","map_arrows_on_bars","set_width","set_scroll_position","layers","layer","make_grid_background","make_grid_rows","make_grid_header","make_grid_ticks","make_grid_highlights","grid_width","grid_height","rows_layer","grid","lines_layer","row_width","row_height","row_y","x1","y1","x2","y2","$header","$today_button","textContent","onclick","tick_x","tick_y","tick_height","tick_class","highlightWeekends","setDate","getDay","computeGridHighlightDimensions","xDist","todayDate","startDate","endDate","setMonth","setFullYear","className","get_dates_to_draw","$lower_text","lower_x","lower_y","innerText","lower_text","upper_text","$upper_text","upper_x","upper_y","last_date","get_date_info","last_date_info","date_text","Hour_lower","Day_lower","Week_lower","Month_lower","Year_lower","Hour_upper","Day_upper","Week_upper","Month_upper","Year_upper","base_pos","base_pos_x","x_pos","bars","task_id","dependency","get_task","Boolean","cur_width","actual_width","parent_element","scroll_pos","get_oldest_starting_date","scrollTo","behavior","oldest","getTime","unselect_all","is_dragging","x_on_start","x_on_scroll_start","y_on_start","is_resizing_left","is_resizing_right","parent_bar_id","bar_wrapper","popup","offsetY","ids","get_all_dependent_tasks","ox","oy","owidth","finaldx","elements","querySelectorAll","localBars","currentTarget","scrollLeft","Array","el","bind_bar_progress","is_resizing","min_dx","max_dx","$handle","out","to_process","acc","modes","isArray","some","find","args","apply","prev_date"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"frappe-gantt.min.js","sources":["../src/date_utils.js","../src/svg_utils.js","../src/bar.js","../src/arrow.js","../src/popup.js","../src/index.js"],"sourcesContent":["const YEAR = \"year\";\nconst MONTH = \"month\";\nconst DAY = \"day\";\nconst HOUR = \"hour\";\nconst MINUTE = \"minute\";\nconst SECOND = \"second\";\nconst MILLISECOND = \"millisecond\";\n\nconst SHORTENED = {\n January: \"Jan\",\n February: \"Feb\",\n March: \"Mar\",\n April: \"Apr\",\n May: \"May\",\n June: \"Jun\",\n July: \"Jul\",\n August: \"Aug\",\n September: \"Sep\",\n October: \"Oct\",\n November: \"Nov\",\n December: \"Dec\"\n};\n\nexport default {\n parse_duration(duration) {\n const regex = /([0-9])+(y|m|d|h|min|s|ms)/gm;\n const matches = regex.exec(duration);\n\n if (matches !== null) {\n if (matches[2] === \"y\") {\n return { duration: parseInt(matches[1]), scale: `year` };\n } else if (matches[2] === \"m\") {\n return { duration: parseInt(matches[1]), scale: `month` };\n } else if (matches[2] === \"d\") {\n return { duration: parseInt(matches[1]), scale: `day` };\n } else if (matches[2] === \"h\") {\n return { duration: parseInt(matches[1]), scale: `hour` };\n } else if (matches[2] === \"min\") {\n return { duration: parseInt(matches[1]), scale: `minute` };\n } else if (matches[2] === \"s\") {\n return { duration: parseInt(matches[1]), scale: `second` };\n } else if (matches[2] === \"ms\") {\n return { duration: parseInt(matches[1]), scale: `millisecond` };\n }\n }\n },\n parse(date, date_separator = \"-\", time_separator = /[.:]/) {\n if (date instanceof Date) {\n return date;\n }\n if (typeof date === \"string\") {\n let date_parts, time_parts;\n const parts = date.split(\" \");\n date_parts = parts[0]\n .split(date_separator)\n .map((val) => parseInt(val, 10));\n time_parts = parts[1] && parts[1].split(time_separator);\n\n // month is 0 indexed\n date_parts[1] = date_parts[1] ? date_parts[1] - 1 : 0;\n\n let vals = date_parts;\n\n if (time_parts && time_parts.length) {\n if (time_parts.length === 4) {\n time_parts[3] = \"0.\" + time_parts[3];\n time_parts[3] = parseFloat(time_parts[3]) * 1000;\n }\n vals = vals.concat(time_parts);\n }\n return new Date(...vals);\n }\n },\n\n to_string(date, with_time = false) {\n if (!(date instanceof Date)) {\n throw new TypeError(\"Invalid argument type\");\n }\n const vals = this.get_date_values(date).map((val, i) => {\n if (i === 1) {\n // add 1 for month\n val = val + 1;\n }\n\n if (i === 6) {\n return padStart(val + \"\", 3, \"0\");\n }\n\n return padStart(val + \"\", 2, \"0\");\n });\n const date_string = `${vals[0]}-${vals[1]}-${vals[2]}`;\n const time_string = `${vals[3]}:${vals[4]}:${vals[5]}.${vals[6]}`;\n\n return date_string + (with_time ? \" \" + time_string : \"\");\n },\n\n format(date, format_string = \"YYYY-MM-DD HH:mm:ss.SSS\", lang = \"en\") {\n const dateTimeFormat = new Intl.DateTimeFormat(lang, {\n month: \"long\",\n });\n const month_name = dateTimeFormat.format(date);\n const month_name_capitalized =\n month_name.charAt(0).toUpperCase() + month_name.slice(1);\n\n const values = this.get_date_values(date).map((d) => padStart(d, 2, 0));\n const format_map = {\n YYYY: values[0],\n MM: padStart(+values[1] + 1, 2, 0),\n DD: values[2],\n HH: values[3],\n mm: values[4],\n ss: values[5],\n SSS: values[6],\n D: values[2],\n MMMM: month_name_capitalized,\n MMM: SHORTENED[month_name_capitalized],\n };\n\n let str = format_string;\n const formatted_values = [];\n\n Object.keys(format_map)\n .sort((a, b) => b.length - a.length) // big string first\n .forEach((key) => {\n if (str.includes(key)) {\n str = str.replaceAll(key, `$${formatted_values.length}`);\n formatted_values.push(format_map[key]);\n }\n });\n\n formatted_values.forEach((value, i) => {\n str = str.replaceAll(`$${i}`, value);\n });\n\n return str;\n },\n\n diff(date_a, date_b, scale = DAY) {\n let milliseconds, seconds, hours, minutes, days, months, years;\n\n milliseconds = date_a - date_b;\n seconds = milliseconds / 1000;\n minutes = seconds / 60;\n hours = minutes / 60;\n days = hours / 24;\n months = days / 30;\n years = months / 12;\n\n if (!scale.endsWith(\"s\")) {\n scale += \"s\";\n }\n\n return Math.floor(\n {\n milliseconds,\n seconds,\n minutes,\n hours,\n days,\n months,\n years,\n }[scale],\n );\n },\n\n today() {\n const vals = this.get_date_values(new Date()).slice(0, 3);\n return new Date(...vals);\n },\n\n now() {\n return new Date();\n },\n\n add(date, qty, scale) {\n qty = parseInt(qty, 10);\n const vals = [\n date.getFullYear() + (scale === YEAR ? qty : 0),\n date.getMonth() + (scale === MONTH ? qty : 0),\n date.getDate() + (scale === DAY ? qty : 0),\n date.getHours() + (scale === HOUR ? qty : 0),\n date.getMinutes() + (scale === MINUTE ? qty : 0),\n date.getSeconds() + (scale === SECOND ? qty : 0),\n date.getMilliseconds() + (scale === MILLISECOND ? qty : 0),\n ];\n return new Date(...vals);\n },\n\n start_of(date, scale) {\n const scores = {\n [YEAR]: 6,\n [MONTH]: 5,\n [DAY]: 4,\n [HOUR]: 3,\n [MINUTE]: 2,\n [SECOND]: 1,\n [MILLISECOND]: 0,\n };\n\n function should_reset(_scale) {\n const max_score = scores[scale];\n return scores[_scale] <= max_score;\n }\n\n const vals = [\n date.getFullYear(),\n should_reset(YEAR) ? 0 : date.getMonth(),\n should_reset(MONTH) ? 1 : date.getDate(),\n should_reset(DAY) ? 0 : date.getHours(),\n should_reset(HOUR) ? 0 : date.getMinutes(),\n should_reset(MINUTE) ? 0 : date.getSeconds(),\n should_reset(SECOND) ? 0 : date.getMilliseconds(),\n ];\n\n return new Date(...vals);\n },\n\n clone(date) {\n return new Date(...this.get_date_values(date));\n },\n\n get_date_values(date) {\n return [\n date.getFullYear(),\n date.getMonth(),\n date.getDate(),\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds(),\n ];\n },\n\n get_days_in_month(date) {\n const no_of_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\n const month = date.getMonth();\n\n if (month !== 1) {\n return no_of_days[month];\n }\n\n // Feb\n const year = date.getFullYear();\n if ((year % 4 === 0 && year % 100 != 0) || year % 400 === 0) {\n return 29;\n }\n return 28;\n },\n};\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart\nfunction padStart(str, targetLength, padString) {\n str = str + \"\";\n targetLength = targetLength >> 0;\n padString = String(typeof padString !== \"undefined\" ? padString : \" \");\n if (str.length > targetLength) {\n return String(str);\n } else {\n targetLength = targetLength - str.length;\n if (targetLength > padString.length) {\n padString += padString.repeat(targetLength / padString.length);\n }\n return padString.slice(0, targetLength) + String(str);\n }\n}\n","export function $(expr, con) {\n return typeof expr === \"string\"\n ? (con || document).querySelector(expr)\n : expr || null;\n}\n\nexport function createSVG(tag, attrs) {\n const elem = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n for (let attr in attrs) {\n if (attr === \"append_to\") {\n const parent = attrs.append_to;\n parent.appendChild(elem);\n } else if (attr === \"innerHTML\") {\n elem.innerHTML = attrs.innerHTML;\n } else if (attr === 'clipPath') {\n elem.setAttribute('clip-path', 'url(#' + attrs[attr] + ')');\n } else {\n elem.setAttribute(attr, attrs[attr]);\n }\n }\n return elem;\n}\n\nexport function animateSVG(svgElement, attr, from, to) {\n const animatedSvgElement = getAnimationElement(svgElement, attr, from, to);\n\n if (animatedSvgElement === svgElement) {\n // triggered 2nd time programmatically\n // trigger artificial click event\n const event = document.createEvent(\"HTMLEvents\");\n event.initEvent(\"click\", true, true);\n event.eventName = \"click\";\n animatedSvgElement.dispatchEvent(event);\n }\n}\n\nfunction getAnimationElement(\n svgElement,\n attr,\n from,\n to,\n dur = \"0.4s\",\n begin = \"0.1s\",\n) {\n const animEl = svgElement.querySelector(\"animate\");\n if (animEl) {\n $.attr(animEl, {\n attributeName: attr,\n from,\n to,\n dur,\n begin: \"click + \" + begin, // artificial click\n });\n return svgElement;\n }\n\n const animateElement = createSVG(\"animate\", {\n attributeName: attr,\n from,\n to,\n dur,\n begin,\n calcMode: \"spline\",\n values: from + \";\" + to,\n keyTimes: \"0; 1\",\n keySplines: cubic_bezier(\"ease-out\"),\n });\n svgElement.appendChild(animateElement);\n\n return svgElement;\n}\n\nfunction cubic_bezier(name) {\n return {\n ease: \".25 .1 .25 1\",\n linear: \"0 0 1 1\",\n \"ease-in\": \".42 0 1 1\",\n \"ease-out\": \"0 0 .58 1\",\n \"ease-in-out\": \".42 0 .58 1\",\n }[name];\n}\n\n$.on = (element, event, selector, callback) => {\n if (!callback) {\n callback = selector;\n $.bind(element, event, callback);\n } else {\n $.delegate(element, event, selector, callback);\n }\n};\n\n$.off = (element, event, handler) => {\n element.removeEventListener(event, handler);\n};\n\n$.bind = (element, event, callback) => {\n event.split(/\\s+/).forEach(function (event) {\n element.addEventListener(event, callback);\n });\n};\n\n$.delegate = (element, event, selector, callback) => {\n element.addEventListener(event, function (e) {\n const delegatedTarget = e.target.closest(selector);\n if (delegatedTarget) {\n e.delegatedTarget = delegatedTarget;\n callback.call(this, e, delegatedTarget);\n }\n });\n};\n\n$.closest = (selector, element) => {\n if (!element) return null;\n\n if (element.matches(selector)) {\n return element;\n }\n\n return $.closest(selector, element.parentNode);\n};\n\n$.attr = (element, attr, value) => {\n if (!value && typeof attr === \"string\") {\n return element.getAttribute(attr);\n }\n\n if (typeof attr === \"object\") {\n for (let key in attr) {\n $.attr(element, key, attr[key]);\n }\n return;\n }\n\n element.setAttribute(attr, value);\n};\n","import date_utils from \"./date_utils\";\nimport { $, createSVG, animateSVG } from \"./svg_utils\";\n\nexport default class Bar {\n constructor(gantt, task) {\n this.set_defaults(gantt, task);\n this.prepare();\n this.draw();\n this.bind();\n }\n\n set_defaults(gantt, task) {\n this.action_completed = false;\n this.gantt = gantt;\n this.task = task;\n }\n\n prepare() {\n this.prepare_values();\n this.prepare_helpers();\n }\n\n prepare_values() {\n this.invalid = this.task.invalid;\n this.height = this.gantt.options.bar_height;\n this.image_size = this.height - 5;\n this.compute_x();\n this.compute_y();\n this.compute_duration();\n this.corner_radius = this.gantt.options.bar_corner_radius;\n this.width = this.gantt.options.column_width * this.duration;\n this.progress_width =\n this.gantt.options.column_width *\n this.duration *\n (this.task.progress / 100) || 0;\n this.group = createSVG(\"g\", {\n class: \"bar-wrapper\" + (this.task.custom_class ? \" \" + this.task.custom_class : \"\") + (this.task.important ? ' important' : ''),\n \"data-id\": this.task.id,\n });\n this.bar_group = createSVG(\"g\", {\n class: \"bar-group\",\n append_to: this.group,\n });\n this.handle_group = createSVG(\"g\", {\n class: \"handle-group\",\n append_to: this.group,\n });\n }\n\n prepare_helpers() {\n SVGElement.prototype.getX = function () {\n return +this.getAttribute(\"x\");\n };\n SVGElement.prototype.getY = function () {\n return +this.getAttribute(\"y\");\n };\n SVGElement.prototype.getWidth = function () {\n return +this.getAttribute(\"width\");\n };\n SVGElement.prototype.getHeight = function () {\n return +this.getAttribute(\"height\");\n };\n SVGElement.prototype.getEndX = function () {\n return this.getX() + this.getWidth();\n };\n }\n\n prepare_expected_progress_values() {\n this.compute_expected_progress();\n this.expected_progress_width =\n this.gantt.options.column_width *\n this.duration *\n (this.expected_progress / 100) || 0;\n }\n\n draw() {\n this.draw_bar();\n this.draw_progress_bar();\n if (this.gantt.options.show_expected_progress) {\n this.prepare_expected_progress_values();\n this.draw_expected_progress_bar();\n }\n this.draw_label();\n this.draw_resize_handles();\n\n if (this.task.thumbnail) {\n this.draw_thumbnail();\n }\n }\n\n draw_bar() {\n this.$bar = createSVG(\"rect\", {\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"bar\",\n append_to: this.bar_group,\n });\n\n animateSVG(this.$bar, \"width\", 0, this.width);\n\n if (this.invalid) {\n this.$bar.classList.add(\"bar-invalid\");\n }\n }\n\n draw_expected_progress_bar() {\n if (this.invalid) return;\n this.$expected_bar_progress = createSVG(\"rect\", {\n x: this.x,\n y: this.y,\n width: this.expected_progress_width,\n height: this.height,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"bar-expected-progress\",\n append_to: this.bar_group,\n });\n\n animateSVG(\n this.$expected_bar_progress,\n \"width\",\n 0,\n this.expected_progress_width,\n );\n }\n\n draw_progress_bar() {\n if (this.invalid) return;\n this.$bar_progress = createSVG(\"rect\", {\n x: this.x,\n y: this.y,\n width: this.progress_width,\n height: this.height,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"bar-progress\",\n append_to: this.bar_group,\n });\n const x = (date_utils.diff(this.task._start, this.gantt.gantt_start, 'hour') /\n this.gantt.options.step) *\n this.gantt.options.column_width;\n\n this.$date_highlight = createSVG(\"rect\", {\n x,\n y: this.gantt.options.header_height - 17,\n width: this.width,\n height: this.height * 0.8,\n rx: 12,\n class: \"date-highlight\",\n append_to: this.bar_group,\n });\n\n\n animateSVG(this.$bar_progress, \"width\", 0, this.progress_width);\n }\n\n draw_label() {\n let x_coord = this.x + this.$bar.getWidth() / 2;\n\n if (this.task.thumbnail) {\n x_coord = this.x + this.image_size + 5;\n }\n\n createSVG(\"text\", {\n x: x_coord,\n y: this.y + this.height / 2,\n innerHTML: this.task.name,\n class: \"bar-label\",\n append_to: this.bar_group,\n });\n // labels get BBox in the next tick\n requestAnimationFrame(() => this.update_label_position());\n }\n draw_thumbnail() {\n let x_offset = 10, y_offset = 2;\n let defs, clipPath;\n\n defs = createSVG('defs', {\n append_to: this.bar_group\n });\n\n createSVG('rect', {\n id: 'rect_' + this.task.id,\n x: this.x + x_offset,\n y: this.y + y_offset,\n width: this.image_size,\n height: this.image_size,\n rx: '15',\n class: 'img_mask',\n append_to: defs\n });\n\n clipPath = createSVG('clipPath', {\n id: 'clip_' + this.task.id,\n append_to: defs\n });\n\n createSVG('use', {\n href: '#rect_' + this.task.id,\n append_to: clipPath\n });\n\n createSVG('image', {\n x: this.x + x_offset,\n y: this.y + y_offset,\n width: this.image_size,\n height: this.image_size,\n class: 'bar-img',\n href: this.task.thumbnail,\n clipPath: 'clip_' + this.task.id,\n append_to: this.bar_group\n });\n }\n\n draw_resize_handles() {\n if (this.invalid || this.gantt.options.readonly) return;\n\n const bar = this.$bar;\n const handle_width = 8;\n\n createSVG(\"rect\", {\n x: bar.getX() + bar.getWidth() + handle_width - 4,\n y: bar.getY() + 1,\n width: handle_width,\n height: this.height - 2,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"handle right\",\n append_to: this.handle_group,\n });\n\n createSVG(\"rect\", {\n x: bar.getX() - handle_width - 4,\n y: bar.getY() + 1,\n width: handle_width,\n height: this.height - 2,\n rx: this.corner_radius,\n ry: this.corner_radius,\n class: \"handle left\",\n append_to: this.handle_group,\n });\n\n this.$handle_progress = createSVG(\"polygon\", {\n points: this.get_progress_polygon_points().join(\",\"),\n class: \"handle progress\",\n append_to: this.handle_group,\n });\n }\n\n get_progress_polygon_points() {\n const bar_progress = this.$bar_progress;\n return [\n bar_progress.getEndX() - 6,\n bar_progress.getY() + bar_progress.getHeight() + 8,\n bar_progress.getEndX() + 6,\n bar_progress.getY() + bar_progress.getHeight() + 8,\n bar_progress.getEndX(),\n bar_progress.getY() + bar_progress.getHeight() + 0.5,\n ];\n }\n\n bind() {\n if (this.invalid) return;\n this.setup_click_event();\n }\n\n setup_click_event() {\n let in_action = false;\n $.on(this.group, \"mouseover\", (e) => this.gantt.trigger_event(\"hover\", [this.task, e.screenX, e.screenY, e]))\n $.on(this.group, \"mouseenter\", (e) => this.show_popup(e.offsetX))\n $.on(this.group, \"mouseleave\", () => this.gantt.hide_popup())\n\n\n $.on(this.group, \"focus \" + this.gantt.options.popup_trigger, (e) => {\n this.gantt.trigger_event(\"click\", [this.task]);\n });\n\n $.on(this.group, \"dblclick\", (e) => {\n if (this.action_completed) {\n // just finished a move action, wait for a few seconds\n return;\n }\n\n this.gantt.trigger_event(\"double_click\", [this.task]);\n });\n }\n\n show_popup(x) {\n if (this.gantt.bar_being_dragged) return;\n\n const start_date = date_utils.format(\n this.task._start,\n \"MMM D\",\n this.gantt.options.language,\n );\n const end_date = date_utils.format(\n date_utils.add(this.task._end, -1, \"second\"),\n \"MMM D\",\n this.gantt.options.language,\n );\n const subtitle = `${start_date} - ${end_date}
Progress: ${this.task.progress}`;\n\n this.gantt.show_popup({\n x,\n target_element: this.$bar,\n title: this.task.name,\n subtitle: subtitle,\n task: this.task,\n });\n }\n\n update_bar_position({ x = null, width = null }) {\n const bar = this.$bar;\n if (x) {\n // get all x values of parent task\n const xs = this.task.dependencies.map((dep) => {\n return this.gantt.get_bar(dep).$bar.getX();\n });\n // child task must not go before parent\n const valid_x = xs.reduce((prev, curr) => {\n return x >= curr;\n }, x);\n if (!valid_x) {\n width = null;\n return;\n }\n this.update_attr(bar, \"x\", x);\n this.update_attr(this.$date_highlight, \"x\", x);\n }\n if (width) {\n this.update_attr(bar, \"width\", width);\n this.update_attr(this.$date_highlight, \"width\", width);\n }\n this.update_label_position();\n this.update_handle_position();\n if (this.gantt.options.show_expected_progress) {\n this.date_changed();\n this.compute_duration();\n this.update_expected_progressbar_position();\n }\n this.update_progressbar_position();\n this.update_arrow_position();\n }\n\n update_label_position_on_horizontal_scroll({ x, sx }) {\n const container = document.querySelector('.gantt-container');\n const label = this.group.querySelector('.bar-label');\n const img = this.group.querySelector('.bar-img') || '';\n const img_mask = this.bar_group.querySelector('.img_mask') || '';\n\n let barWidthLimit = this.$bar.getX() + this.$bar.getWidth();\n let newLabelX = label.getX() + x;\n let newImgX = img && img.getX() + x || 0;\n let imgWidth = img && img.getBBox().width + 7 || 7;\n let labelEndX = newLabelX + label.getBBox().width + 7;\n let viewportCentral = sx + container.clientWidth / 2;\n\n if (label.classList.contains('big')) return;\n\n if (labelEndX < barWidthLimit && x > 0 && labelEndX < viewportCentral) {\n label.setAttribute('x', newLabelX);\n if (img) {\n img.setAttribute('x', newImgX);\n img_mask.setAttribute('x', newImgX);\n }\n } else if ((newLabelX - imgWidth) > this.$bar.getX() && x < 0 && labelEndX > viewportCentral) {\n label.setAttribute('x', newLabelX);\n if (img) {\n img.setAttribute('x', newImgX);\n img_mask.setAttribute('x', newImgX);\n }\n\n }\n }\n\n date_changed() {\n let changed = false;\n const { new_start_date, new_end_date } = this.compute_start_end_date();\n\n if (Number(this.task._start) !== Number(new_start_date)) {\n changed = true;\n this.task._start = new_start_date;\n }\n\n if (Number(this.task._end) !== Number(new_end_date)) {\n changed = true;\n this.task._end = new_end_date;\n }\n\n if (!changed) return;\n\n this.gantt.trigger_event(\"date_change\", [\n this.task,\n new_start_date,\n date_utils.add(new_end_date, -1, \"second\"),\n ]);\n }\n\n progress_changed() {\n const new_progress = this.compute_progress();\n this.task.progress = new_progress;\n this.gantt.trigger_event(\"progress_change\", [this.task, new_progress]);\n }\n\n set_action_completed() {\n this.action_completed = true;\n setTimeout(() => (this.action_completed = false), 1000);\n }\n\n compute_start_end_date() {\n const bar = this.$bar;\n const x_in_units = bar.getX() / this.gantt.options.column_width;\n const new_start_date = date_utils.add(\n this.gantt.gantt_start,\n x_in_units * this.gantt.options.step,\n \"hour\",\n );\n const width_in_units = bar.getWidth() / this.gantt.options.column_width;\n const new_end_date = date_utils.add(\n new_start_date,\n width_in_units * this.gantt.options.step,\n \"hour\",\n );\n\n return { new_start_date, new_end_date };\n }\n\n compute_progress() {\n const progress =\n (this.$bar_progress.getWidth() / this.$bar.getWidth()) * 100;\n return parseInt(progress, 10);\n }\n\n compute_expected_progress() {\n this.expected_progress =\n date_utils.diff(date_utils.today(), this.task._start, \"hour\") /\n this.gantt.options.step;\n this.expected_progress =\n ((this.expected_progress < this.duration\n ? this.expected_progress\n : this.duration) *\n 100) /\n this.duration;\n }\n\n compute_x() {\n const { step, column_width } = this.gantt.options;\n const task_start = this.task._start;\n const gantt_start = this.gantt.gantt_start;\n\n const diff = date_utils.diff(task_start, gantt_start, \"hour\");\n let x = (diff / step) * column_width;\n\n if (this.gantt.view_is(\"Month\")) {\n const diff = date_utils.diff(task_start, gantt_start, \"day\");\n x = (diff * column_width) / 30;\n }\n this.x = x;\n }\n\n compute_y() {\n this.y =\n this.gantt.options.header_height +\n this.gantt.options.padding +\n this.task._index * (this.height + this.gantt.options.padding);\n }\n\n compute_duration() {\n this.duration =\n date_utils.diff(this.task._end, this.task._start, \"hour\") /\n this.gantt.options.step;\n }\n\n get_snap_position(dx) {\n let odx = dx,\n rem,\n position;\n\n if (this.gantt.view_is(\"Week\")) {\n rem = dx % (this.gantt.options.column_width / 7);\n position =\n odx -\n rem +\n (rem < this.gantt.options.column_width / 14\n ? 0\n : this.gantt.options.column_width / 7);\n } else if (this.gantt.view_is(\"Month\")) {\n rem = dx % (this.gantt.options.column_width / 30);\n position =\n odx -\n rem +\n (rem < this.gantt.options.column_width / 60\n ? 0\n : this.gantt.options.column_width / 30);\n } else {\n rem = dx % this.gantt.options.column_width;\n position =\n odx -\n rem +\n (rem < this.gantt.options.column_width / 2\n ? 0\n : this.gantt.options.column_width);\n }\n return position;\n }\n\n update_attr(element, attr, value) {\n value = +value;\n if (!isNaN(value)) {\n element.setAttribute(attr, value);\n }\n return element;\n }\n\n update_expected_progressbar_position() {\n if (this.invalid) return;\n this.$expected_bar_progress.setAttribute(\"x\", this.$bar.getX());\n this.compute_expected_progress();\n this.$expected_bar_progress.setAttribute(\n \"width\",\n this.gantt.options.column_width *\n this.duration *\n (this.expected_progress / 100) || 0,\n );\n }\n\n update_progressbar_position() {\n if (this.invalid || this.gantt.options.readonly) return;\n this.$bar_progress.setAttribute(\"x\", this.$bar.getX());\n this.$bar_progress.setAttribute(\n \"width\",\n this.$bar.getWidth() * (this.task.progress / 100),\n );\n }\n\n update_label_position() {\n const img_mask = this.bar_group.querySelector('.img_mask') || '';\n const bar = this.$bar,\n label = this.group.querySelector(\".bar-label\"),\n img = this.group.querySelector('.bar-img');\n\n\n let padding = 5;\n let x_offset_label_img = this.image_size + 10;\n const labelWidth = label.getBBox().width\n const barWidth = bar.getWidth()\n if (labelWidth > barWidth) {\n label.classList.add(\"big\");\n if (img) {\n img.setAttribute('x', bar.getX() + bar.getWidth() + padding);\n img_mask.setAttribute('x', bar.getX() + bar.getWidth() + padding);\n label.setAttribute('x', bar.getX() + bar.getWidth() + x_offset_label_img);\n } else {\n label.setAttribute('x', bar.getX() + bar.getWidth() + padding);\n }\n } else {\n label.classList.remove(\"big\");\n if (img) {\n img.setAttribute('x', bar.getX() + padding);\n img_mask.setAttribute('x', bar.getX() + padding);\n label.setAttribute('x', bar.getX() + barWidth / 2 + x_offset_label_img);\n } else {\n label.setAttribute('x', bar.getX() + barWidth / 2 - labelWidth / 2);\n }\n }\n }\n\n update_handle_position() {\n if (this.invalid || this.gantt.options.readonly) return;\n const bar = this.$bar;\n this.handle_group\n .querySelector(\".handle.left\")\n .setAttribute(\"x\", bar.getX() - 12);\n this.handle_group\n .querySelector(\".handle.right\")\n .setAttribute(\"x\", bar.getEndX() + 4);\n const handle = this.group.querySelector(\".handle.progress\");\n handle && handle.setAttribute(\"points\", this.get_progress_polygon_points());\n }\n\n update_arrow_position() {\n this.arrows = this.arrows || [];\n for (let arrow of this.arrows) {\n arrow.update();\n }\n }\n}\n\nfunction isFunction(functionToCheck) {\n let getType = {};\n return (\n functionToCheck &&\n getType.toString.call(functionToCheck) === \"[object Function]\"\n );\n}\n","import { createSVG } from \"./svg_utils\";\n\nexport default class Arrow {\n constructor(gantt, from_task, to_task) {\n this.gantt = gantt;\n this.from_task = from_task;\n this.to_task = to_task;\n\n this.calculate_path();\n this.draw();\n }\n\n calculate_path() {\n let start_x =\n this.from_task.$bar.getX() + this.from_task.$bar.getWidth() / 2;\n\n const condition = () =>\n this.to_task.$bar.getX() < start_x + this.gantt.options.padding &&\n start_x > this.from_task.$bar.getX() + this.gantt.options.padding;\n\n while (condition()) {\n start_x -= 10;\n }\n\n const start_y =\n this.gantt.options.header_height +\n this.gantt.options.bar_height +\n (this.gantt.options.padding + this.gantt.options.bar_height) *\n this.from_task.task._index +\n this.gantt.options.padding;\n\n const end_x = this.to_task.$bar.getX() - this.gantt.options.padding / 2 - 7;\n const end_y =\n this.gantt.options.header_height +\n this.gantt.options.bar_height / 2 +\n (this.gantt.options.padding + this.gantt.options.bar_height) *\n this.to_task.task._index +\n this.gantt.options.padding;\n\n const from_is_below_to =\n this.from_task.task._index > this.to_task.task._index;\n const curve = this.gantt.options.arrow_curve;\n const clockwise = from_is_below_to ? 1 : 0;\n const curve_y = from_is_below_to ? -curve : curve;\n const offset = from_is_below_to\n ? end_y + this.gantt.options.arrow_curve\n : end_y - this.gantt.options.arrow_curve;\n\n this.path = `\n M ${start_x} ${start_y}\n V ${offset}\n a ${curve} ${curve} 0 0 ${clockwise} ${curve} ${curve_y}\n L ${end_x} ${end_y}\n m -5 -5\n l 5 5\n l -5 5`;\n\n if (\n this.to_task.$bar.getX() <\n this.from_task.$bar.getX() + this.gantt.options.padding\n ) {\n const down_1 = this.gantt.options.padding / 2 - curve;\n const down_2 =\n this.to_task.$bar.getY() + this.to_task.$bar.getHeight() / 2 - curve_y;\n const left = this.to_task.$bar.getX() - this.gantt.options.padding;\n\n this.path = `\n M ${start_x} ${start_y}\n v ${down_1}\n a ${curve} ${curve} 0 0 1 -${curve} ${curve}\n H ${left}\n a ${curve} ${curve} 0 0 ${clockwise} -${curve} ${curve_y}\n V ${down_2}\n a ${curve} ${curve} 0 0 ${clockwise} ${curve} ${curve_y}\n L ${end_x} ${end_y}\n m -5 -5\n l 5 5\n l -5 5`;\n }\n }\n\n draw() {\n this.element = createSVG(\"path\", {\n d: this.path,\n \"data-from\": this.from_task.task.id,\n \"data-to\": this.to_task.task.id,\n });\n }\n\n update() {\n this.calculate_path();\n this.element.setAttribute(\"d\", this.path);\n }\n}\n","export default class Popup {\n constructor(parent, custom_html) {\n this.parent = parent;\n this.custom_html = custom_html;\n this.make();\n }\n\n make() {\n this.parent.innerHTML = `\n
\n
\n
\n `;\n\n this.hide();\n\n this.title = this.parent.querySelector(\".title\");\n this.subtitle = this.parent.querySelector(\".subtitle\");\n this.pointer = this.parent.querySelector(\".pointer\");\n }\n\n show(options) {\n if (!options.target_element) {\n throw new Error(\"target_element is required to show popup\");\n }\n const target_element = options.target_element;\n\n if (this.custom_html) {\n let html = this.custom_html(options.task);\n html += '
';\n this.parent.innerHTML = html;\n this.pointer = this.parent.querySelector(\".pointer\");\n } else {\n // set data\n this.title.innerHTML = options.title;\n this.subtitle.innerHTML = options.subtitle;\n }\n\n // set position\n let position_meta;\n if (target_element instanceof HTMLElement) {\n position_meta = target_element.getBoundingClientRect();\n } else if (target_element instanceof SVGElement) {\n position_meta = options.target_element.getBBox();\n }\n\n this.parent.style.left = options.x - this.parent.clientWidth / 2 + \"px\";\n this.parent.style.top = position_meta.y + position_meta.height + 10 + \"px\";\n\n this.pointer.style.left = this.parent.clientWidth / 2 + \"px\";\n this.pointer.style.top = \"-15px\";\n\n // show\n this.parent.style.opacity = 1;\n }\n\n hide() {\n this.parent.style.opacity = 0;\n this.parent.style.left = 0;\n }\n}\n","import date_utils from \"./date_utils\";\nimport { $, createSVG } from \"./svg_utils\";\nimport Bar from \"./bar\";\nimport Arrow from \"./arrow\";\nimport Popup from \"./popup\";\n\nimport \"./gantt.scss\";\n\nconst VIEW_MODE = {\n HOUR: \"Hour\",\n QUARTER_DAY: \"Quarter Day\",\n HALF_DAY: \"Half Day\",\n DAY: \"Day\",\n WEEK: \"Week\",\n MONTH: \"Month\",\n YEAR: \"Year\",\n};\n\nconst VIEW_MODE_PADDING = {\n HOUR: [\"7d\", \"7d\"],\n QUARTER_DAY: [\"7d\", \"7d\"],\n HALF_DAY: [\"7d\", \"7d\"],\n DAY: [\"1m\", \"1m\"],\n WEEK: [\"1m\", \"1m\"],\n MONTH: [\"1m\", \"1m\"],\n YEAR: [\"2y\", \"2y\"],\n};\n\nexport default class Gantt {\n constructor(wrapper, tasks, options) {\n this.setup_wrapper(wrapper);\n this.setup_options(options);\n this.setup_tasks(tasks);\n // initialize with default view mode\n this.change_view_mode();\n this.bind_events();\n }\n\n setup_wrapper(element) {\n let svg_element, wrapper_element;\n\n // CSS Selector is passed\n if (typeof element === \"string\") {\n element = document.querySelector(element);\n }\n\n // get the SVGElement\n if (element instanceof HTMLElement) {\n wrapper_element = element;\n svg_element = element.querySelector(\"svg\");\n } else if (element instanceof SVGElement) {\n svg_element = element;\n } else {\n throw new TypeError(\n \"Frappé Gantt only supports usage of a string CSS selector,\" +\n \" HTML DOM element or SVG DOM element for the 'element' parameter\",\n );\n }\n\n // svg element\n if (!svg_element) {\n // create it\n this.$svg = createSVG(\"svg\", {\n append_to: wrapper_element,\n class: \"gantt\",\n });\n } else {\n this.$svg = svg_element;\n this.$svg.classList.add(\"gantt\");\n }\n\n // wrapper element\n this.$container = document.createElement(\"div\");\n this.$container.classList.add(\"gantt-container\");\n\n const parent_element = this.$svg.parentElement;\n parent_element.appendChild(this.$container);\n this.$container.appendChild(this.$svg);\n\n // popup wrapper\n this.popup_wrapper = document.createElement(\"div\");\n this.popup_wrapper.classList.add(\"popup-wrapper\");\n this.$container.appendChild(this.popup_wrapper);\n }\n\n setup_options(options) {\n const default_options = {\n header_height: 50,\n column_width: 30,\n step: 24,\n view_modes: [...Object.values(VIEW_MODE)],\n bar_height: 30,\n bar_corner_radius: 3,\n arrow_curve: 5,\n padding: 18,\n view_mode: \"Day\",\n date_format: \"YYYY-MM-DD\",\n popup_trigger: \"click\",\n custom_popup_html: null,\n language: \"en\",\n readonly: false,\n highlight_weekend: true,\n scroll_today: true,\n lines: 'both',\n auto_move_label: true,\n };\n this.options = Object.assign({}, default_options, options);\n if (!options.view_mode_padding) options.view_mode_padding = {}\n for (let [key, value] of Object.entries(options.view_mode_padding)) {\n if (typeof value === \"string\") {\n // Configure for single value given\n options.view_mode_padding[key] = [value, value];\n }\n }\n\n this.options.view_mode_padding = {\n ...VIEW_MODE_PADDING,\n ...options.view_mode_padding,\n };\n }\n\n setup_tasks(tasks) {\n // prepare tasks\n this.tasks = tasks.map((task, i) => {\n // convert to Date objects\n task._start = date_utils.parse(task.start);\n if (task.end === undefined && task.duration !== undefined) {\n task.end = task._start;\n let durations = task.duration.split(\" \");\n\n durations.forEach((tmpDuration) => {\n let { duration, scale } = date_utils.parse_duration(tmpDuration);\n task.end = date_utils.add(task.end, duration, scale);\n });\n }\n task._end = date_utils.parse(task.end);\n let diff = date_utils.diff(task._end, task._start, \"year\");\n if (diff < 0) {\n throw Error(\"start of task can't be after end of task: in task #, \" + (i + 1))\n }\n // make task invalid if duration too large\n if (date_utils.diff(task._end, task._start, \"year\") > 10) {\n task.end = null;\n }\n\n\n // cache index\n task._index = i;\n\n // invalid dates\n if (!task.start && !task.end) {\n const today = date_utils.today();\n task._start = today;\n task._end = date_utils.add(today, 2, \"day\");\n }\n\n if (!task.start && task.end) {\n task._start = date_utils.add(task._end, -2, \"day\");\n }\n\n if (task.start && !task.end) {\n task._end = date_utils.add(task._start, 2, \"day\");\n }\n\n // if hours is not set, assume the last day is full day\n // e.g: 2018-09-09 becomes 2018-09-09 23:59:59\n const task_end_values = date_utils.get_date_values(task._end);\n if (task_end_values.slice(3).every((d) => d === 0)) {\n task._end = date_utils.add(task._end, 24, \"hour\");\n }\n\n // invalid flag\n if (!task.start || !task.end) {\n task.invalid = true;\n }\n\n // dependencies\n if (typeof task.dependencies === \"string\" || !task.dependencies) {\n let deps = [];\n if (task.dependencies) {\n deps = task.dependencies\n .split(\",\")\n .map((d) => d.trim().replaceAll(' ', '_'))\n .filter((d) => d);\n }\n task.dependencies = deps;\n }\n\n // uids\n if (!task.id) {\n task.id = generate_id(task);\n } else if (typeof task.id === 'string') {\n task.id = task.id.replaceAll(' ', '_')\n } else {\n task.id = `${task.id}`\n }\n\n return task;\n });\n\n this.setup_dependencies();\n }\n\n setup_dependencies() {\n this.dependency_map = {};\n for (let t of this.tasks) {\n for (let d of t.dependencies) {\n this.dependency_map[d] = this.dependency_map[d] || [];\n this.dependency_map[d].push(t.id);\n }\n }\n }\n\n refresh(tasks) {\n this.setup_tasks(tasks);\n this.change_view_mode();\n }\n\n change_view_mode(mode = this.options.view_mode) {\n this.update_view_scale(mode);\n this.setup_dates();\n this.render();\n // fire viewmode_change event\n this.trigger_event(\"view_change\", [mode]);\n }\n\n update_view_scale(view_mode) {\n this.options.view_mode = view_mode;\n if (view_mode === VIEW_MODE.HOUR) {\n this.options.step = 24 / 24;\n this.options.column_width = 38;\n } else if (view_mode === VIEW_MODE.DAY) {\n this.options.step = 24;\n this.options.column_width = 38;\n } else if (view_mode === VIEW_MODE.HALF_DAY) {\n this.options.step = 24 / 2;\n this.options.column_width = 38;\n } else if (view_mode === VIEW_MODE.QUARTER_DAY) {\n this.options.step = 24 / 4;\n this.options.column_width = 38;\n } else if (view_mode === VIEW_MODE.WEEK) {\n this.options.step = 24 * 7;\n this.options.column_width = 140;\n } else if (view_mode === VIEW_MODE.MONTH) {\n this.options.step = 24 * 30;\n this.options.column_width = 120;\n } else if (view_mode === VIEW_MODE.YEAR) {\n this.options.step = 24 * 365;\n this.options.column_width = 120;\n }\n }\n\n setup_dates() {\n this.setup_gantt_dates();\n this.setup_date_values();\n }\n\n setup_gantt_dates() {\n this.gantt_start = this.gantt_end = null;\n\n for (let task of this.tasks) {\n // set global start and end date\n if (!this.gantt_start || task._start < this.gantt_start) {\n this.gantt_start = task._start;\n }\n if (!this.gantt_end || task._end > this.gantt_end) {\n this.gantt_end = task._end;\n }\n }\n let gantt_start, gantt_end;\n if (!this.gantt_start) gantt_start = new Date();\n else gantt_start = date_utils.start_of(this.gantt_start, \"day\");\n if (!this.gantt_end) gantt_end = new Date();\n else gantt_end = date_utils.start_of(this.gantt_end, \"day\");\n\n // add date padding on both sides\n let viewKey;\n for (let [key, value] of Object.entries(VIEW_MODE)) {\n if (value === this.options.view_mode) {\n viewKey = key;\n }\n }\n const [padding_start, padding_end] = this.options.view_mode_padding[\n viewKey\n ].map(date_utils.parse_duration);\n gantt_start = date_utils.add(\n gantt_start,\n -padding_start.duration,\n padding_start.scale,\n );\n\n let format_string;\n if (this.view_is(VIEW_MODE.YEAR)) {\n format_string = \"YYYY\"\n } else if (this.view_is(VIEW_MODE.MONTH)) {\n format_string = \"YYYY-MM\"\n } else if (this.view_is(VIEW_MODE.DAY)) {\n format_string = \"YYYY-MM-DD\"\n } else {\n format_string = \"YYYY-MM-DD HH\"\n }\n this.gantt_start = date_utils.parse(date_utils.format(gantt_start, format_string));\n this.gantt_start.setHours(0, 0, 0, 0)\n this.gantt_end = date_utils.add(\n gantt_end,\n padding_end.duration,\n padding_end.scale,\n );\n }\n\n setup_date_values() {\n this.dates = [];\n let cur_date = null;\n\n while (cur_date === null || cur_date < this.gantt_end) {\n if (!cur_date) {\n cur_date = date_utils.clone(this.gantt_start);\n } else {\n if (this.view_is(VIEW_MODE.YEAR)) {\n cur_date = date_utils.add(cur_date, 1, \"year\");\n } else if (this.view_is(VIEW_MODE.MONTH)) {\n cur_date = date_utils.add(cur_date, 1, \"month\");\n } else {\n cur_date = date_utils.add(cur_date, this.options.step, \"hour\");\n }\n }\n this.dates.push(cur_date);\n }\n }\n\n bind_events() {\n if (this.options.readonly) return\n this.bind_grid_click();\n this.bind_bar_events();\n }\n\n render() {\n this.clear();\n this.setup_layers();\n this.make_grid();\n this.make_dates();\n this.make_bars();\n this.make_arrows();\n this.map_arrows_on_bars();\n this.set_width();\n this.set_scroll_position();\n if (this.options.scroll_today) this.scroll_today()\n }\n\n setup_layers() {\n this.layers = {};\n const layers = [\"grid\", \"arrow\", \"progress\", \"bar\", \"details\"];\n // make group layers\n for (let layer of layers) {\n this.layers[layer] = createSVG(\"g\", {\n class: layer,\n append_to: this.$svg,\n });\n }\n }\n\n make_grid() {\n this.make_grid_background();\n this.make_grid_rows();\n this.make_grid_header();\n this.make_grid_ticks();\n this.make_grid_highlights();\n }\n\n make_grid_background() {\n const grid_width = this.dates.length * this.options.column_width;\n const grid_height =\n this.options.header_height +\n this.options.padding +\n (this.options.bar_height + this.options.padding) * this.tasks.length;\n\n createSVG(\"rect\", {\n x: 0,\n y: 0,\n width: grid_width,\n height: grid_height,\n class: \"grid-background\",\n append_to: this.$svg,\n });\n\n $.attr(this.$svg, {\n height: grid_height + this.options.padding + 100,\n width: \"100%\",\n });\n }\n\n make_grid_rows() {\n const rows_layer = createSVG(\"g\", { append_to: this.layers.grid });\n const lines_layer = createSVG(\"g\", { append_to: this.layers.grid });\n\n const row_width = this.dates.length * this.options.column_width;\n const row_height = this.options.bar_height + this.options.padding;\n\n let row_y = this.options.header_height + this.options.padding / 2;\n\n for (let task of this.tasks) {\n createSVG(\"rect\", {\n x: 0,\n y: row_y,\n width: row_width,\n height: row_height,\n class: \"grid-row\",\n append_to: rows_layer,\n });\n if (this.options.lines === 'both' || this.options.lines === 'horizontal') {\n createSVG(\"line\", {\n x1: 0,\n y1: row_y + row_height,\n x2: row_width,\n y2: row_y + row_height,\n class: \"row-line\",\n append_to: lines_layer,\n });\n }\n\n row_y += this.options.bar_height + this.options.padding;\n }\n }\n\n make_grid_header() {\n const curHeader = document.querySelector('.grid-header')\n if (curHeader) {\n curHeader.remove()\n };\n\n let $header = document.createElement(\"div\");\n $header.style.height = this.options.header_height + 10 + \"px\";\n $header.style.width = this.dates.length * this.options.column_width + \"px\";\n $header.classList.add('grid-header')\n this.$header = $header\n this.$container.appendChild($header)\n\n let $upper_header = document.createElement(\"div\");\n $upper_header.classList.add('upper-header')\n this.$upper_header = $upper_header\n this.$header.appendChild($upper_header)\n\n let $lower_header = document.createElement(\"div\");\n $lower_header.classList.add('lower-header')\n this.$lower_header = $lower_header\n this.$header.appendChild($lower_header)\n\n let $side_header = document.createElement('div')\n $side_header.classList.add('side-header')\n\n\n // Create view mode change select\n const $select = document.createElement(\"select\");\n $select.classList.add('viewmode-select')\n\n for (const key in VIEW_MODE) {\n const $option = document.createElement(\"option\");\n $option.value = VIEW_MODE[key];\n $option.textContent = VIEW_MODE[key];\n $select.appendChild($option);\n }\n $select.value = this.options.view_mode\n $select.addEventListener(\"change\", (function () {\n this.change_view_mode($select.value)\n }).bind(this));\n $side_header.appendChild($select)\n\n // Create today button\n let $today_button = document.createElement('button')\n $today_button.classList.add('today-button')\n $today_button.textContent = 'Today'\n $today_button.onclick = this.scroll_today.bind(this)\n $side_header.appendChild($today_button)\n\n this.$header.appendChild($side_header)\n const { left, y } = $header.getBoundingClientRect();\n const width = Math.min(this.$header.clientWidth, this.$container.clientWidth)\n $side_header.style.left = left + this.$container.scrollLeft + width - $side_header.clientWidth + 'px';\n $side_header.style.top = y + 5 + 'px';\n }\n\n make_grid_ticks() {\n if (this.options.lines !== 'both' && this.options.lines !== 'vertical') return\n let tick_x = 0;\n let tick_y = this.options.header_height + this.options.padding / 2;\n let tick_height =\n (this.options.bar_height + this.options.padding) * this.tasks.length;\n\n for (let date of this.dates) {\n let tick_class = \"tick\";\n // thick tick for monday\n if (this.view_is(VIEW_MODE.DAY) && date.getDate() === 1) {\n tick_class += \" thick\";\n }\n // thick tick for first week\n if (\n this.view_is(VIEW_MODE.WEEK) &&\n date.getDate() >= 1 &&\n date.getDate() < 8\n ) {\n tick_class += \" thick\";\n }\n // thick ticks for quarters\n if (this.view_is(VIEW_MODE.MONTH) && date.getMonth() % 3 === 0) {\n tick_class += \" thick\";\n }\n\n createSVG(\"path\", {\n d: `M ${tick_x} ${tick_y} v ${tick_height}`,\n class: tick_class,\n append_to: this.layers.grid,\n });\n\n if (this.view_is(VIEW_MODE.MONTH)) {\n tick_x +=\n (date_utils.get_days_in_month(date) * this.options.column_width) / 30;\n } else {\n tick_x += this.options.column_width;\n }\n }\n }\n\n highlightWeekends() {\n if (!this.view_is('Day') && !this.view_is('Half Day')) return\n for (let d = new Date(this.gantt_start); d <= this.gantt_end; d.setDate(d.getDate() + 1)) {\n if (d.getDay() === 0 || d.getDay() === 6) {\n const x = (date_utils.diff(d, this.gantt_start, 'hour') /\n this.options.step) *\n this.options.column_width;\n const height = (this.options.bar_height + this.options.padding) * this.tasks.length;\n createSVG('rect', {\n x,\n y: this.options.header_height + this.options.padding / 2,\n width: (this.view_is('Day') ? 1 : 2) * this.options.column_width,\n height,\n class: 'holiday-highlight',\n append_to: this.layers.grid,\n });\n }\n }\n }\n\n //compute the horizontal x distance\n computeGridHighlightDimensions(view_mode) {\n let xDist = 0;\n\n if (this.view_is(VIEW_MODE.DAY)) {\n return (\n (date_utils.diff(date_utils.today(), this.gantt_start, \"hour\") /\n this.options.step) *\n this.options.column_width\n );\n }\n\n for (let date of this.dates) {\n const todayDate = new Date();\n const startDate = new Date(date);\n const endDate = new Date(date);\n switch (view_mode) {\n case VIEW_MODE.WEEK:\n endDate.setDate(date.getDate() + 7);\n break;\n case VIEW_MODE.MONTH:\n endDate.setMonth(date.getMonth() + 1);\n break;\n case VIEW_MODE.YEAR:\n endDate.setFullYear(date.getFullYear() + 1);\n break;\n }\n if (todayDate >= startDate && todayDate <= endDate) {\n break;\n } else {\n xDist += this.options.column_width;\n }\n }\n return xDist;\n }\n\n make_grid_highlights() {\n if (this.options.highlight_weekend) this.highlightWeekends()\n // highlight today's | week's | month's | year's\n if (\n this.view_is(VIEW_MODE.DAY) ||\n this.view_is(VIEW_MODE.WEEK) ||\n this.view_is(VIEW_MODE.MONTH) ||\n this.view_is(VIEW_MODE.YEAR)\n ) {\n const x = this.computeGridHighlightDimensions(this.options.view_mode);\n const y = 0;\n const width = this.options.column_width;\n const height =\n (this.options.bar_height + this.options.padding) * this.tasks.length +\n this.options.header_height +\n this.options.padding / 2;\n\n let className = \"\";\n switch (this.options.view_mode) {\n case VIEW_MODE.DAY:\n className = \"today-highlight\";\n break;\n case VIEW_MODE.WEEK:\n className = \"week-highlight\";\n break;\n case VIEW_MODE.MONTH:\n className = \"month-highlight\";\n break;\n case VIEW_MODE.YEAR:\n className = \"year-highlight\";\n break;\n }\n createSVG(\"rect\", {\n x,\n y,\n width,\n height,\n class: className,\n append_to: this.layers.grid,\n });\n }\n }\n\n make_dates() {\n this.upper_texts_x = {}\n for (let date of this.get_dates_to_draw()) {\n let $lower_text = document.createElement('div');\n $lower_text.classList.add('lower-text')\n $lower_text.style.left = date.lower_x + 'px'\n $lower_text.style.top = date.lower_y + 'px'\n $lower_text.innerText = date.lower_text\n this.$lower_header.appendChild($lower_text)\n\n if (date.upper_text) {\n this.upper_texts_x[date.upper_text] = date.upper_x\n let $upper_text = document.createElement('div');\n $upper_text.classList.add('upper-text')\n $upper_text.style.left = date.upper_x + 'px'\n $upper_text.style.top = date.upper_y + 'px'\n $upper_text.innerText = date.upper_text\n this.$upper_header.appendChild($upper_text)\n\n // remove out-of-bound dates\n if (date.upper_x > this.layers.grid.getBBox().width) {\n $upper_text.remove();\n }\n }\n }\n }\n\n get_dates_to_draw() {\n let last_date = null;\n const dates = this.dates.map((date, i) => {\n const d = this.get_date_info(date, last_date, i);\n last_date = d;\n return d;\n });\n return dates;\n }\n\n get_date_info(date, last_date_info) {\n let last_date = last_date_info ? last_date_info.date : date_utils.add(date, 1, \"day\")\n const date_text = {\n Hour_lower: date_utils.format(date, \"HH\", this.options.language),\n \"Quarter Day_lower\": date_utils.format(date, \"HH\", this.options.language),\n \"Half Day_lower\": date_utils.format(date, \"HH\", this.options.language),\n Day_lower:\n date.getDate() !== last_date.getDate()\n ? date_utils.format(date, \"D\", this.options.language)\n : \"\",\n Week_lower:\n date.getMonth() !== last_date.getMonth()\n ? date_utils.format(date, \"D MMM\", this.options.language)\n : date_utils.format(date, \"D\", this.options.language),\n Month_lower: date_utils.format(date, \"MMMM\", this.options.language),\n Year_lower: date_utils.format(date, \"YYYY\", this.options.language),\n Hour_upper:\n date.getDate() !== last_date.getDate()\n ? date_utils.format(date, \"D MMMM\", this.options.language)\n : \"\",\n \"Quarter Day_upper\":\n date.getDate() !== last_date.getDate()\n ? date_utils.format(date, \"D MMM\", this.options.language)\n : \"\",\n \"Half Day_upper\":\n date.getDate() !== last_date.getDate()\n ? date.getMonth() !== last_date.getMonth()\n ? date_utils.format(date, \"D MMM\", this.options.language)\n : date_utils.format(date, \"D\", this.options.language)\n : \"\",\n Day_upper:\n date.getMonth() !== last_date.getMonth() || !last_date_info\n ? date_utils.format(date, \"MMMM\", this.options.language)\n : \"\",\n Week_upper:\n date.getMonth() !== last_date.getMonth()\n ? date_utils.format(date, \"MMMM\", this.options.language)\n : \"\",\n Month_upper:\n date.getFullYear() !== last_date.getFullYear()\n ? date_utils.format(date, \"YYYY\", this.options.language)\n : \"\",\n Year_upper:\n date.getFullYear() !== last_date.getFullYear()\n ? date_utils.format(date, \"YYYY\", this.options.language)\n : \"\",\n };\n let column_width = this.view_is(VIEW_MODE.MONTH) ? (date_utils.get_days_in_month(date) * this.options.column_width) / 30 : this.options.column_width;\n const base_pos = {\n x: last_date_info\n ? last_date_info.base_pos_x + last_date_info.column_width\n : 0,\n lower_y: this.options.header_height - 15,\n upper_y: this.options.header_height - 40,\n };\n\n const x_pos = {\n Hour_lower: column_width / 2,\n Hour_upper: column_width * 12,\n \"Quarter Day_lower\": column_width / 2,\n \"Quarter Day_upper\": column_width * 2,\n \"Half Day_lower\": column_width / 2,\n \"Half Day_upper\": column_width,\n Day_lower: column_width / 2,\n Day_upper: column_width / 2,\n Week_lower: 0,\n Week_upper: (column_width * 4) / 2,\n Month_lower: column_width / 2,\n Month_upper: column_width / 2,\n Year_lower: column_width / 2,\n Year_upper: (column_width * 30) / 2,\n };\n return {\n date,\n column_width,\n base_pos_x: base_pos.x,\n upper_text: date_text[`${this.options.view_mode}_upper`],\n lower_text: date_text[`${this.options.view_mode}_lower`],\n upper_x: base_pos.x + x_pos[`${this.options.view_mode}_upper`],\n upper_y: base_pos.upper_y,\n lower_x: base_pos.x + x_pos[`${this.options.view_mode}_lower`],\n lower_y: base_pos.lower_y,\n };\n }\n\n make_bars() {\n this.bars = this.tasks.map((task) => {\n const bar = new Bar(this, task);\n this.layers.bar.appendChild(bar.group);\n return bar;\n });\n }\n\n make_arrows() {\n this.arrows = [];\n for (let task of this.tasks) {\n let arrows = [];\n arrows = task.dependencies\n .map((task_id) => {\n const dependency = this.get_task(task_id);\n if (!dependency) return;\n const arrow = new Arrow(\n this,\n this.bars[dependency._index], // from_task\n this.bars[task._index], // to_task\n );\n this.layers.arrow.appendChild(arrow.element);\n return arrow;\n })\n .filter(Boolean); // filter falsy values\n this.arrows = this.arrows.concat(arrows);\n }\n }\n\n map_arrows_on_bars() {\n for (let bar of this.bars) {\n bar.arrows = this.arrows.filter((arrow) => {\n return (\n arrow.from_task.task.id === bar.task.id ||\n arrow.to_task.task.id === bar.task.id\n );\n });\n }\n }\n\n set_width() {\n const cur_width = this.$svg.getBoundingClientRect().width;\n const actual_width = this.$svg.querySelector('.grid .grid-row') ? this.$svg\n .querySelector('.grid .grid-row')\n .getAttribute('width') : 0;\n if (cur_width < actual_width) {\n this.$svg.setAttribute(\"width\", actual_width);\n }\n }\n\n set_scroll_position(date) {\n if (!date) {\n date = this.gantt_start\n }\n\n const parent_element = this.$svg.parentElement;\n if (!parent_element) return;\n\n const hours_before_first_task = date_utils.diff(\n this.get_oldest_starting_date(),\n date,\n \"hour\",\n );\n\n const scroll_pos =\n (hours_before_first_task / this.options.step) *\n this.options.column_width -\n this.options.column_width;\n parent_element.scrollTo({ left: scroll_pos, behavior: 'smooth' })\n }\n\n scroll_today() {\n const oldest = this.get_oldest_starting_date().getTime()\n const t = new Date() - oldest\n this.set_scroll_position(new Date(this.gantt_start.getTime() - t))\n }\n\n bind_grid_click() {\n $.on(\n this.$svg,\n this.options.popup_trigger,\n \".grid-row, .grid-header\",\n () => {\n this.unselect_all();\n this.hide_popup();\n },\n );\n }\n\n bind_bar_events() {\n let is_dragging = false;\n let x_on_start = 0;\n let x_on_scroll_start = 0;\n let y_on_start = 0;\n let is_resizing_left = false;\n let is_resizing_right = false;\n let parent_bar_id = null;\n let bars = []; // instanceof Bar\n this.bar_being_dragged = null;\n\n function action_in_progress() {\n return is_dragging || is_resizing_left || is_resizing_right;\n }\n\n $.on(this.$svg, \"mousedown\", \".bar-wrapper, .handle\", (e, element) => {\n const bar_wrapper = $.closest(\".bar-wrapper\", element);\n bars.forEach((bar) => bar.group.classList.remove(\"active\"));\n\n if (element.classList.contains(\"left\")) {\n is_resizing_left = true;\n } else if (element.classList.contains(\"right\")) {\n is_resizing_right = true;\n } else if (element.classList.contains(\"bar-wrapper\")) {\n is_dragging = true;\n }\n\n bar_wrapper.classList.add(\"active\");\n this.popup.parent.classList.add('hidden')\n\n x_on_start = e.offsetX;\n y_on_start = e.offsetY;\n\n parent_bar_id = bar_wrapper.getAttribute(\"data-id\");\n const ids = [\n parent_bar_id,\n ...this.get_all_dependent_tasks(parent_bar_id),\n ];\n bars = ids.map((id) => this.get_bar(id));\n\n this.bar_being_dragged = parent_bar_id;\n\n bars.forEach((bar) => {\n const $bar = bar.$bar;\n $bar.ox = $bar.getX();\n $bar.oy = $bar.getY();\n $bar.owidth = $bar.getWidth();\n $bar.finaldx = 0;\n });\n });\n $.on(this.$container, 'scroll', e => {\n let elements = document.querySelectorAll('.bar-wrapper');\n let localBars = [];\n const ids = [];\n let dx;\n if (x_on_scroll_start) {\n dx = e.currentTarget.scrollLeft - x_on_scroll_start;\n }\n\n const daysSinceStart = e.currentTarget.scrollLeft / this.options.column_width * this.options.step / 24;\n let format_str = \"D MMM\"\n if ([\"Year\", \"Month\"].includes(this.options.view_mode)) format_str = 'YYYY'\n else if ([\"Day\", \"Week\"].includes(this.options.view_mode)) format_str = 'MMMM'\n else if (this.view_is('Half Day')) format_str = 'D'\n else if (this.view_is('Hour')) format_str = \"D MMMM\"\n\n\n let currentUpper = date_utils.format(\n date_utils.add(this.gantt_start, daysSinceStart, 'day'),\n format_str\n );\n const upperTexts = Array.from(document.querySelectorAll('.upper-text'));\n const $el = upperTexts.find(el => el.textContent === currentUpper)\n if ($el && !$el.classList.contains('current-upper')) {\n const $current = document.querySelector('.current-upper')\n if ($current) {\n $current.classList.remove('current-upper')\n $current.style.left = this.upper_texts_x[$current.textContent] + 'px';\n $current.style.top = this.options.header_height - 40 + 'px';\n }\n\n $el.classList.add('current-upper')\n let dimensions = this.$svg.getBoundingClientRect()\n $el.style.left = dimensions.x + this.$container.scrollLeft + 10 + 'px';\n $el.style.top = dimensions.y + this.options.header_height - 40 + 'px';\n }\n\n Array.prototype.forEach.call(elements, function (el, i) {\n ids.push(el.getAttribute('data-id'));\n });\n\n if (dx) {\n localBars = ids.map(id => this.get_bar(id));\n if (this.options.auto_move_label) {\n localBars.forEach(bar => {\n bar.update_label_position_on_horizontal_scroll({ x: dx, sx: e.currentTarget.scrollLeft });\n });\n }\n }\n\n x_on_scroll_start = e.currentTarget.scrollLeft;\n });\n\n $.on(this.$svg, \"mousemove\", (e) => {\n if (!action_in_progress()) return;\n const dx = e.offsetX - x_on_start;\n const dy = e.offsetY - y_on_start;\n\n bars.forEach((bar) => {\n const $bar = bar.$bar;\n $bar.finaldx = this.get_snap_position(dx);\n this.hide_popup();\n if (is_resizing_left) {\n if (parent_bar_id === bar.task.id) {\n bar.update_bar_position({\n x: $bar.ox + $bar.finaldx,\n width: $bar.owidth - $bar.finaldx,\n });\n } else {\n bar.update_bar_position({\n x: $bar.ox + $bar.finaldx,\n });\n }\n } else if (is_resizing_right) {\n if (parent_bar_id === bar.task.id) {\n bar.update_bar_position({\n width: $bar.owidth + $bar.finaldx,\n });\n }\n } else if (is_dragging && !this.options.readonly) {\n bar.update_bar_position({ x: $bar.ox + $bar.finaldx });\n }\n });\n });\n\n document.addEventListener(\"mouseup\", (e) => {\n\n is_dragging = false;\n is_resizing_left = false;\n is_resizing_right = false;\n });\n\n $.on(this.$svg, \"mouseup\", (e) => {\n this.bar_being_dragged = null;\n bars.forEach((bar) => {\n const $bar = bar.$bar;\n if (!$bar.finaldx) return;\n bar.date_changed();\n bar.set_action_completed();\n });\n });\n\n this.bind_bar_progress();\n }\n\n bind_bar_progress() {\n let x_on_start = 0;\n let y_on_start = 0;\n let is_resizing = null;\n let bar = null;\n let $bar_progress = null;\n let $bar = null;\n\n $.on(this.$svg, \"mousedown\", \".handle.progress\", (e, handle) => {\n is_resizing = true;\n x_on_start = e.offsetX;\n y_on_start = e.offsetY;\n\n const $bar_wrapper = $.closest(\".bar-wrapper\", handle);\n const id = $bar_wrapper.getAttribute(\"data-id\");\n bar = this.get_bar(id);\n\n $bar_progress = bar.$bar_progress;\n $bar = bar.$bar;\n\n $bar_progress.finaldx = 0;\n $bar_progress.owidth = $bar_progress.getWidth();\n $bar_progress.min_dx = -$bar_progress.getWidth();\n $bar_progress.max_dx = $bar.getWidth() - $bar_progress.getWidth();\n });\n\n $.on(this.$svg, \"mousemove\", (e) => {\n if (!is_resizing) return;\n let dx = e.offsetX - x_on_start;\n let dy = e.offsetY - y_on_start;\n\n if (dx > $bar_progress.max_dx) {\n dx = $bar_progress.max_dx;\n }\n if (dx < $bar_progress.min_dx) {\n dx = $bar_progress.min_dx;\n }\n\n const $handle = bar.$handle_progress;\n $.attr($bar_progress, \"width\", $bar_progress.owidth + dx);\n $.attr($handle, \"points\", bar.get_progress_polygon_points());\n $bar_progress.finaldx = dx;\n });\n\n $.on(this.$svg, \"mouseup\", () => {\n is_resizing = false;\n if (!($bar_progress && $bar_progress.finaldx)) return;\n\n $bar_progress.finaldx = 0;\n bar.progress_changed();\n bar.set_action_completed();\n bar = null;\n $bar_progress = null;\n $bar = null;\n });\n }\n\n get_all_dependent_tasks(task_id) {\n let out = [];\n let to_process = [task_id];\n while (to_process.length) {\n const deps = to_process.reduce((acc, curr) => {\n acc = acc.concat(this.dependency_map[curr]);\n return acc;\n }, []);\n\n out = out.concat(deps);\n to_process = deps.filter((d) => !to_process.includes(d));\n }\n\n return out.filter(Boolean);\n }\n\n get_snap_position(dx) {\n let odx = dx,\n rem,\n position;\n\n if (this.view_is(VIEW_MODE.WEEK)) {\n rem = dx % (this.options.column_width / 7);\n position =\n odx -\n rem +\n (rem < this.options.column_width / 14\n ? 0\n : this.options.column_width / 7);\n } else if (this.view_is(VIEW_MODE.MONTH)) {\n rem = dx % (this.options.column_width / 30);\n position =\n odx -\n rem +\n (rem < this.options.column_width / 60\n ? 0\n : this.options.column_width / 30);\n } else {\n rem = dx % this.options.column_width;\n position =\n odx -\n rem +\n (rem < this.options.column_width / 2 ? 0 : this.options.column_width);\n }\n return position;\n }\n\n unselect_all() {\n [...this.$svg.querySelectorAll(\".bar-wrapper\")].forEach((el) => {\n el.classList.remove(\"active\");\n });\n this.popup.parent.classList.remove('hidden')\n }\n\n view_is(modes) {\n if (typeof modes === \"string\") {\n return this.options.view_mode === modes;\n }\n\n if (Array.isArray(modes)) {\n return modes.some((mode) => this.options.view_mode === mode);\n }\n\n return false;\n }\n\n get_task(id) {\n return this.tasks.find((task) => {\n return task.id === id;\n });\n }\n\n get_bar(id) {\n return this.bars.find((bar) => {\n return bar.task.id === id;\n });\n }\n\n show_popup(options) {\n if (!this.popup) {\n this.popup = new Popup(\n this.popup_wrapper,\n this.options.custom_popup_html,\n );\n }\n this.popup.show(options);\n }\n\n hide_popup() {\n this.popup && this.popup.hide();\n }\n\n trigger_event(event, args) {\n if (this.options[\"on_\" + event]) {\n this.options[\"on_\" + event].apply(null, args);\n }\n }\n\n /**\n * Gets the oldest starting date from the list of tasks\n *\n * @returns Date\n * @memberof Gantt\n */\n get_oldest_starting_date() {\n if (!this.tasks.length) return new Date()\n return this.tasks\n .map((task) => task._start)\n .reduce((prev_date, cur_date) =>\n cur_date <= prev_date ? cur_date : prev_date,\n );\n }\n\n /**\n * Clear all elements from the parent svg element\n *\n * @memberof Gantt\n */\n clear() {\n this.$svg.innerHTML = \"\";\n }\n}\n\nGantt.VIEW_MODE = VIEW_MODE;\n\nfunction generate_id(task) {\n return task.name + \"_\" + Math.random().toString(36).slice(2, 12);\n}\n"],"names":["YEAR","MONTH","DAY","HOUR","MINUTE","SECOND","MILLISECOND","SHORTENED","January","February","March","April","May","June","July","August","September","October","November","December","date_utils","parse_duration","duration","matches","exec","parseInt","scale","parse","date","date_separator","time_separator","Date","date_parts","time_parts","parts","split","map","val","vals","length","parseFloat","concat","to_string","with_time","TypeError","this","get_date_values","i","padStart","date_string","time_string","format","format_string","lang","month_name","Intl","DateTimeFormat","month","month_name_capitalized","charAt","toUpperCase","slice","values","d","format_map","YYYY","MM","DD","HH","mm","ss","SSS","D","MMMM","MMM","str","formatted_values","Object","keys","sort","a","b","forEach","key","includes","replaceAll","push","value","diff","date_a","date_b","milliseconds","seconds","hours","minutes","days","months","years","endsWith","Math","floor","today","now","add","qty","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","start_of","scores","should_reset","_scale","clone","get_days_in_month","no_of_days","year","targetLength","padString","String","repeat","$","expr","con","document","querySelector","createSVG","tag","attrs","elem","createElementNS","attr","append_to","appendChild","innerHTML","setAttribute","animateSVG","svgElement","from","to","animatedSvgElement","dur","begin","animEl","attributeName","animateElement","calcMode","keyTimes","keySplines","cubic_bezier","getAnimationElement","event","createEvent","initEvent","eventName","dispatchEvent","name","ease","linear","on","element","selector","callback","delegate","bind","off","handler","removeEventListener","addEventListener","e","delegatedTarget","target","closest","call","parentNode","getAttribute","Bar","constructor","gantt","task","set_defaults","prepare","draw","action_completed","prepare_values","prepare_helpers","invalid","height","options","bar_height","image_size","compute_x","compute_y","compute_duration","corner_radius","bar_corner_radius","width","column_width","progress_width","progress","group","class","custom_class","important","id","bar_group","handle_group","SVGElement","prototype","getX","getY","getWidth","getHeight","getEndX","prepare_expected_progress_values","compute_expected_progress","expected_progress_width","expected_progress","draw_bar","draw_progress_bar","show_expected_progress","draw_expected_progress_bar","draw_label","draw_resize_handles","thumbnail","draw_thumbnail","$bar","x","y","rx","ry","classList","$expected_bar_progress","$bar_progress","_start","gantt_start","step","$date_highlight","header_height","x_coord","requestAnimationFrame","update_label_position","defs","clipPath","href","readonly","bar","$handle_progress","points","get_progress_polygon_points","join","bar_progress","setup_click_event","trigger_event","screenX","screenY","show_popup","offsetX","hide_popup","popup_trigger","bar_being_dragged","subtitle","language","_end","target_element","title","update_bar_position","dependencies","dep","get_bar","reduce","prev","curr","update_attr","update_handle_position","date_changed","update_expected_progressbar_position","update_progressbar_position","update_arrow_position","update_label_position_on_horizontal_scroll","sx","container","label","img","img_mask","barWidthLimit","newLabelX","newImgX","imgWidth","getBBox","labelEndX","viewportCentral","clientWidth","contains","changed","new_start_date","new_end_date","compute_start_end_date","Number","progress_changed","new_progress","compute_progress","set_action_completed","setTimeout","x_in_units","width_in_units","task_start","view_is","padding","_index","get_snap_position","dx","rem","position","odx","isNaN","x_offset_label_img","labelWidth","barWidth","remove","handle","arrows","arrow","update","Arrow","from_task","to_task","calculate_path","start_x","condition","start_y","end_x","end_y","from_is_below_to","curve","arrow_curve","clockwise","curve_y","offset","path","down_1","down_2","left","Popup","parent","custom_html","make","hide","pointer","show","Error","html","position_meta","HTMLElement","getBoundingClientRect","style","top","opacity","VIEW_MODE","QUARTER_DAY","HALF_DAY","WEEK","VIEW_MODE_PADDING","Gantt","wrapper","tasks","setup_wrapper","setup_options","setup_tasks","change_view_mode","bind_events","svg_element","wrapper_element","$svg","$container","createElement","parentElement","popup_wrapper","default_options","view_modes","view_mode","date_format","custom_popup_html","highlight_weekend","scroll_today","lines","auto_move_label","assign","view_mode_padding","entries","start","undefined","end","tmpDuration","every","deps","trim","filter","random","toString","generate_id","setup_dependencies","dependency_map","t","refresh","mode","update_view_scale","setup_dates","render","setup_gantt_dates","setup_date_values","gantt_end","viewKey","padding_start","padding_end","setHours","dates","cur_date","bind_grid_click","bind_bar_events","clear","setup_layers","make_grid","make_dates","make_bars","make_arrows","map_arrows_on_bars","set_width","set_scroll_position","layers","layer","make_grid_background","make_grid_rows","make_grid_header","make_grid_ticks","make_grid_highlights","grid_width","grid_height","rows_layer","grid","lines_layer","row_width","row_height","row_y","x1","y1","x2","y2","curHeader","$header","$upper_header","$lower_header","$side_header","$select","$option","textContent","$today_button","onclick","min","scrollLeft","tick_x","tick_y","tick_height","tick_class","highlightWeekends","setDate","getDay","computeGridHighlightDimensions","xDist","todayDate","startDate","endDate","setMonth","setFullYear","className","upper_texts_x","get_dates_to_draw","$lower_text","lower_x","lower_y","innerText","lower_text","upper_text","upper_x","$upper_text","upper_y","last_date","get_date_info","last_date_info","date_text","Hour_lower","Day_lower","Week_lower","Month_lower","Year_lower","Hour_upper","Day_upper","Week_upper","Month_upper","Year_upper","base_pos","base_pos_x","x_pos","bars","task_id","dependency","get_task","Boolean","cur_width","actual_width","parent_element","scroll_pos","get_oldest_starting_date","scrollTo","behavior","oldest","getTime","unselect_all","is_dragging","x_on_start","x_on_scroll_start","y_on_start","is_resizing_left","is_resizing_right","parent_bar_id","bar_wrapper","popup","offsetY","ids","get_all_dependent_tasks","ox","oy","owidth","finaldx","elements","querySelectorAll","localBars","currentTarget","daysSinceStart","format_str","currentUpper","$el","Array","find","el","$current","dimensions","bind_bar_progress","is_resizing","min_dx","max_dx","$handle","out","to_process","acc","modes","isArray","some","args","apply","prev_date"],"mappings":"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"} \ No newline at end of file diff --git a/src/gantt.scss b/src/gantt.scss index 2efabc0..71a365e 100644 --- a/src/gantt.scss +++ b/src/gantt.scss @@ -37,16 +37,34 @@ $light-blue: #c4c4e9 !default; width: fit-content; } - #today-button { - position: sticky; - left: 10px; - top: 5px; - background-color: $progress-important; - border: none; - color: $text-light; + .upper-text { + position: absolute; + width: fit-content; + } + + .current-upper { + position: fixed; + } + + .side-header { + position: fixed; + padding: 0 10px; + background: white; + } + + .today-button, + .viewmode-select { + background-color: $text-light; + border: 1px solid black; + color: $text-dark; padding: 4px 10px; font-size: 14px; - border-radius: 2px; + border-radius: 5px; + } + + .viewmode-select { + padding: 3px 5px; + margin-right: 4px; } } diff --git a/src/index.js b/src/index.js index 8c9621a..60dfa71 100644 --- a/src/index.js +++ b/src/index.js @@ -136,7 +136,6 @@ export default class Gantt { task._end = date_utils.parse(task.end); let diff = date_utils.diff(task._end, task._start, "year"); if (diff < 0) { - console.log(task._end, task._start) throw Error("start of task can't be after end of task: in task #, " + (i + 1)) } // make task invalid if duration too large @@ -424,19 +423,60 @@ export default class Gantt { } make_grid_header() { - let $header = document.createElement("div"); + const curHeader = document.querySelector('.grid-header') + if (curHeader) { + curHeader.remove() + }; + let $header = document.createElement("div"); $header.style.height = this.options.header_height + 10 + "px"; $header.style.width = this.dates.length * this.options.column_width + "px"; $header.classList.add('grid-header') this.$header = $header - this.$svg.parentElement.appendChild($header) + this.$container.appendChild($header) + let $upper_header = document.createElement("div"); + $upper_header.classList.add('upper-header') + this.$upper_header = $upper_header + this.$header.appendChild($upper_header) + + let $lower_header = document.createElement("div"); + $lower_header.classList.add('lower-header') + this.$lower_header = $lower_header + this.$header.appendChild($lower_header) + + let $side_header = document.createElement('div') + $side_header.classList.add('side-header') + + + // Create view mode change select + const $select = document.createElement("select"); + $select.classList.add('viewmode-select') + + for (const key in VIEW_MODE) { + const $option = document.createElement("option"); + $option.value = VIEW_MODE[key]; + $option.textContent = VIEW_MODE[key]; + $select.appendChild($option); + } + $select.value = this.options.view_mode + $select.addEventListener("change", (function () { + this.change_view_mode($select.value) + }).bind(this)); + $side_header.appendChild($select) + + // Create today button let $today_button = document.createElement('button') - $today_button.id = 'today-button' + $today_button.classList.add('today-button') $today_button.textContent = 'Today' $today_button.onclick = this.scroll_today.bind(this) - this.$header.appendChild($today_button) + $side_header.appendChild($today_button) + + this.$header.appendChild($side_header) + const { left, y } = $header.getBoundingClientRect(); + const width = Math.min(this.$header.clientWidth, this.$container.clientWidth) + $side_header.style.left = left + this.$container.scrollLeft + width - $side_header.clientWidth + 'px'; + $side_header.style.top = y + 5 + 'px'; } make_grid_ticks() { @@ -580,21 +620,23 @@ export default class Gantt { } make_dates() { + this.upper_texts_x = {} for (let date of this.get_dates_to_draw()) { let $lower_text = document.createElement('div'); $lower_text.classList.add('lower-text') $lower_text.style.left = date.lower_x + 'px' $lower_text.style.top = date.lower_y + 'px' $lower_text.innerText = date.lower_text - this.$header.appendChild($lower_text) + this.$lower_header.appendChild($lower_text) if (date.upper_text) { + this.upper_texts_x[date.upper_text] = date.upper_x let $upper_text = document.createElement('div'); - $upper_text.classList.add('lower-text') + $upper_text.classList.add('upper-text') $upper_text.style.left = date.upper_x + 'px' $upper_text.style.top = date.upper_y + 'px' $upper_text.innerText = date.upper_text - this.$header.appendChild($upper_text) + this.$upper_header.appendChild($upper_text) // remove out-of-bound dates if (date.upper_x > this.layers.grid.getBBox().width) { @@ -614,9 +656,8 @@ export default class Gantt { return dates; } - get_date_info(date, last_date_info, i) { + get_date_info(date, last_date_info) { let last_date = last_date_info ? last_date_info.date : date_utils.add(date, 1, "day") - const date_text = { Hour_lower: date_utils.format(date, "HH", this.options.language), "Quarter Day_lower": date_utils.format(date, "HH", this.options.language), @@ -646,7 +687,7 @@ export default class Gantt { : date_utils.format(date, "D", this.options.language) : "", Day_upper: - date.getMonth() !== last_date.getMonth() + date.getMonth() !== last_date.getMonth() || !last_date_info ? date_utils.format(date, "MMMM", this.options.language) : "", Week_upper: @@ -668,26 +709,25 @@ export default class Gantt { ? last_date_info.base_pos_x + last_date_info.column_width : 0, lower_y: this.options.header_height - 15, - upper_y: this.options.header_height - 35, + upper_y: this.options.header_height - 40, }; const x_pos = { - Hour_lower: this.options.column_width / 2, - Hour_upper: this.options.column_width * 12, - "Quarter Day_lower": this.options.column_width / 2, - "Quarter Day_upper": this.options.column_width * 2, - "Half Day_lower": this.options.column_width / 2, - "Half Day_upper": this.options.column_width, - Day_lower: this.options.column_width / 2, - Day_upper: (this.options.column_width * 30) / 2, + Hour_lower: column_width / 2, + Hour_upper: column_width * 12, + "Quarter Day_lower": column_width / 2, + "Quarter Day_upper": column_width * 2, + "Half Day_lower": column_width / 2, + "Half Day_upper": column_width, + Day_lower: column_width / 2, + Day_upper: column_width / 2, Week_lower: 0, - Week_upper: (this.options.column_width * 4) / 2, + Week_upper: (column_width * 4) / 2, Month_lower: column_width / 2, - Month_upper: (column_width * 12) / 2, - Year_lower: this.options.column_width / 2, - Year_upper: (this.options.column_width * 30) / 2, + Month_upper: column_width / 2, + Year_lower: column_width / 2, + Year_upper: (column_width * 30) / 2, }; - console.log(base_pos.x, x_pos[`${this.options.view_mode}_lower`],) return { date, column_width, @@ -769,7 +809,7 @@ export default class Gantt { (hours_before_first_task / this.options.step) * this.options.column_width - this.options.column_width; - console.log(parent_element.scrollTo({ left: scroll_pos, behavior: 'smooth' })) + parent_element.scrollTo({ left: scroll_pos, behavior: 'smooth' }) } scroll_today() { @@ -849,6 +889,34 @@ export default class Gantt { dx = e.currentTarget.scrollLeft - x_on_scroll_start; } + const daysSinceStart = e.currentTarget.scrollLeft / this.options.column_width * this.options.step / 24; + let format_str = "D MMM" + if (["Year", "Month"].includes(this.options.view_mode)) format_str = 'YYYY' + else if (["Day", "Week"].includes(this.options.view_mode)) format_str = 'MMMM' + else if (this.view_is('Half Day')) format_str = 'D' + else if (this.view_is('Hour')) format_str = "D MMMM" + + + let currentUpper = date_utils.format( + date_utils.add(this.gantt_start, daysSinceStart, 'day'), + format_str + ); + const upperTexts = Array.from(document.querySelectorAll('.upper-text')); + const $el = upperTexts.find(el => el.textContent === currentUpper) + if ($el && !$el.classList.contains('current-upper')) { + const $current = document.querySelector('.current-upper') + if ($current) { + $current.classList.remove('current-upper') + $current.style.left = this.upper_texts_x[$current.textContent] + 'px'; + $current.style.top = this.options.header_height - 40 + 'px'; + } + + $el.classList.add('current-upper') + let dimensions = this.$svg.getBoundingClientRect() + $el.style.left = dimensions.x + this.$container.scrollLeft + 10 + 'px'; + $el.style.top = dimensions.y + this.options.header_height - 40 + 'px'; + } + Array.prototype.forEach.call(elements, function (el, i) { ids.push(el.getAttribute('data-id')); });