{"version":3,"sources":["jsdelivr-header.js","/npm/frappe-gantt-extended@0.7.0/src/index.js"],"names":[],"mappings":"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","file":"/npm/frappe-gantt-extended@0.7.0/src/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/frappe-gantt-extended@0.7.0/src/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\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  QUARTER_DAY: 'Quarter Day',\n  HALF_DAY: 'Half Day',\n  DAY: 'Day',\n  WEEK: 'Week',\n  MONTH: 'Month',\n  YEAR: 'Year'\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    // 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: 20,\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: 'mouseover',\n      custom_popup_html: null,\n      language: 'en',\n      draggable: false,\n      hasArrows: false,\n    };\n    this.options = Object.assign({}, default_options, options);\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      task._end = date_utils.parse(task.end);\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      // 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())\n            .filter(d => d);\n        }\n        task.dependencies = deps;\n      }\n\n      // uids\n      if (!task.id) {\n        task.id = generate_id(task);\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\n    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\n    this.gantt_start = date_utils.start_of(this.gantt_start, 'day');\n    this.gantt_end = date_utils.start_of(this.gantt_end, 'day');\n\n    // add date padding on both sides\n    if (this.view_is([VIEW_MODE.QUARTER_DAY, VIEW_MODE.HALF_DAY])) {\n      this.gantt_start = date_utils.add(this.gantt_start, -7, 'day');\n      this.gantt_end = date_utils.add(this.gantt_end, 7, 'day');\n    } else if (this.view_is(VIEW_MODE.MONTH)) {\n      this.gantt_start = date_utils.start_of(this.gantt_start, 'year');\n      this.gantt_end = date_utils.add(this.gantt_end, 1, 'year');\n    } else if (this.view_is(VIEW_MODE.YEAR)) {\n      this.gantt_start = date_utils.add(this.gantt_start, -2, 'year');\n      this.gantt_end = date_utils.add(this.gantt_end, 2, 'year');\n    } else {\n      this.gantt_start = date_utils.add(this.gantt_start, -1, 'month');\n      this.gantt_end = date_utils.add(this.gantt_end, 1, 'month');\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(\n            cur_date,\n            this.options.step,\n            'hour'\n          );\n        }\n      }\n      this.dates.push(cur_date);\n    }\n  }\n\n  bind_events() {\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  }\n\n  setup_layers() {\n    this.layers = {};\n    const layers = ['grid', 'date', '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) *\n      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.layers.grid\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 ${task.isChild ? 'child-row' : 'parent-row'}`,\n        append_to: rows_layer\n      });\n\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 ${task.isChild ? 'child-line' : 'parent-line'}`,\n        append_to: lines_layer\n      });\n\n      row_y += this.options.bar_height + this.options.padding;\n    }\n  }\n\n  make_grid_header() {\n    const header_width = this.dates.length * this.options.column_width;\n    const header_height = this.options.header_height + 10;\n    createSVG('rect', {\n      x: 0,\n      y: 0,\n      width: header_width,\n      height: header_height,\n      class: 'grid-header',\n      append_to: this.layers.grid\n    });\n  }\n\n  make_grid_ticks() {\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) *\n      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() + 1) % 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) *\n          this.options.column_width /\n          30;\n      } else {\n        tick_x += this.options.column_width;\n      }\n    }\n  }\n\n  make_grid_highlights() {\n    // highlight today's date\n    if (this.view_is(VIEW_MODE.DAY)) {\n      const x =\n        date_utils.diff(date_utils.today(), this.gantt_start, 'hour') /\n        this.options.step *\n        this.options.column_width;\n      const y = 0;\n\n      const width = this.options.column_width;\n      const height =\n        (this.options.bar_height + this.options.padding) *\n        this.tasks.length +\n        this.options.header_height +\n        this.options.padding / 2;\n\n      createSVG('rect', {\n        x,\n        y,\n        width,\n        height,\n        class: 'today-highlight',\n        append_to: this.layers.grid\n      });\n    }\n  }\n\n  make_dates() {\n    const today = new Date().getDate();\n    for (let date of this.get_dates_to_draw()) {\n      const addClassNameTodayHighlight = this.view_is(VIEW_MODE.DAY) && (date.lower_text === today || date.upper_text === today);\n      if (addClassNameTodayHighlight) {\n        createSVG('text', {\n          x: date.lower_x,\n          y: date.lower_y,\n          innerHTML: date.lower_text,\n          class: 'today-date',\n          append_to: this.layers.date\n        });\n      } else {\n        createSVG('text', {\n          x: date.lower_x,\n          y: date.lower_y,\n          innerHTML: date.lower_text,\n          class: 'lower-text',\n          append_to: this.layers.date\n        });\n      }\n\n      if (date.upper_text) {\n        const $upper_text = createSVG('text', {\n          x: date.upper_x,\n          y: date.upper_y,\n          innerHTML: date.upper_text,\n          class: 'upper-text',\n          append_to: this.layers.date\n        });\n\n        // remove out-of-bound dates\n        if (\n          $upper_text.getBBox().x2 > this.layers.grid.getBBox().width\n        ) {\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 = date;\n      return d;\n    });\n    return dates;\n  }\n\n  get_date_info(date, last_date, i) {\n    if (!last_date) {\n      last_date = date_utils.add(date, 1, 'year');\n    }\n    const date_text = {\n      'Quarter Day_lower': date_utils.format(\n        date,\n        'HH',\n        this.options.language\n      ),\n      'Half Day_lower': date_utils.format(\n        date,\n        'HH',\n        this.options.language\n      ),\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      '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\n    const base_pos = {\n      x: i * this.options.column_width,\n      lower_y: this.options.header_height,\n      upper_y: this.options.header_height - 25\n    };\n\n    const x_pos = {\n      'Quarter Day_lower': this.options.column_width * 4 / 2,\n      'Quarter Day_upper': 0,\n      'Half Day_lower': this.options.column_width * 2 / 2,\n      'Half Day_upper': 0,\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: this.options.column_width / 2,\n      Month_upper: this.options.column_width * 12 / 2,\n      Year_lower: this.options.column_width / 2,\n      Year_upper: this.options.column_width * 30 / 2\n    };\n\n    return {\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    if (this.options.hasArrows) {\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\n  map_arrows_on_bars() {\n    if (this.options.hasArrows) {\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\n  set_width() {\n    const cur_width = this.$svg.getBoundingClientRect().width;\n    const actual_width = this.$svg\n      .querySelector('.grid .grid-row')\n      .getAttribute('width');\n    if (cur_width < actual_width) {\n      this.$svg.setAttribute('width', actual_width);\n    }\n  }\n\n  set_scroll_position() {\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      this.gantt_start,\n      'hour'\n    );\n\n    const scroll_pos =\n      hours_before_first_task /\n      this.options.step *\n      this.options.column_width -\n      this.options.column_width;\n\n    parent_element.scrollLeft = scroll_pos;\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\n    // enable/disable dragging\n    if (this.options.draggable) {\n      let is_dragging = false;\n      let x_on_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\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\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\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\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) {\n            bar.update_bar_position({ x: $bar.ox + $bar.finaldx });\n          }\n        });\n      });\n\n      document.addEventListener('mouseup', e => {\n        if (is_dragging || is_resizing_left || is_resizing_right) {\n          bars.forEach(bar => bar.group.classList.remove('active'));\n        }\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\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      bar.progress_changed();\n      bar.set_action_completed();\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\n          ? 0\n          : 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  }\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    return this.tasks\n      .map(task => task._start)\n      .reduce(\n        (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 (\n    task.name +\n    '_' +\n    Math.random()\n      .toString(36)\n      .slice(2, 12)\n  );\n}\n"]}